VBA-自定义面板,使用SQL查询Excel数据

news2025/1/16 2:01:41

需求

定制插件,实现用户打开任意一个工作簿,写sql对Excel中的数据进行查询

案例sql需求场景:

需求

筛选日期小于’2023-4-24’,按group分区,求和各分组下的销售额,返回结果集新建工作表写入

数据源

现在有两个表,

一个用户的销售金额表,记录用户不同日期的销售金额,其中date字段是日期字段,数据在表格名为“Sheet1”的sheet页里
在这里插入图片描述

一个是用户分组表,表的数据第一个格子不在a1单元格

在这里插入图片描述

SQL语句

select t2.group,sum(t1.销售额) as sales from [Sheet1$] as t1 inner join [分组$c4:d7] as t2 on t1.姓名=t2.姓名 where format(date,'yyyy/m/dd')<'2023/4/24' group by t2.group

如果单元格的格式是日期,在判断时先format格式成字符串传入判断

sql中的数据表表示,如果数据左上角第一个格子是a1单元格,可以直接指定sheet名,比如:[Sheet1$]
如果不是,可以指定具体的数据范围,比如:[分组$c4:d7] 表格名后面跟一个$符号,后面紧跟单元格范围;

VBA代码

Sub sql_query()
' 使用sql对excel进行查询
Dim con, rs As Object
Dim query_sql, str As String
Dim i, cols As Long

Application.ScreenUpdating = True

' 创建对象
Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

' 数据连接
con.Open "Provider=Microsoft.ace.Oledb.12.0;" _
    & "Extended Properties=Excel 12.0;" _
    & "Data Source=" & ThisWorkbook.FullName
    
' sql 查询语句,如果单元格是日期,再判断时先format格式成字符串传入判断
query_sql = "select t2.group,sum(t1.销售额) as sales from [Sheet1$] as t1 inner join [分组$c4:d7] as t2 on t1.姓名=t2.姓名 where format(date,'yyyy/m/dd')<'2023/4/24' group by t2.group "
' query_sql = "select 姓名,date,销售额 from [Sheet1$] where format(date,'yyyy/m/dd')<'2023/4/24' "
' 执行sql语句
rs.Open query_sql, con, 1, 1


' 数据写入
Worksheets.Add    ' 新建工作表
With ActiveSheet
    cols = rs.Fields.Count
    For i = 0 To cols - 1
        .Cells(1, i + 1).Value = rs.Fields(i).Name  ' 写入表头
    Next
    .Cells(2, 1).CopyFromRecordset rs    ' 数据写入
End With

rs.Close
con.Close
Set con = Nothing

' 恢复屏幕刷新|工作表自动计算
Application.ScreenUpdating = True

End Sub

返回结果

一共两个组,筛选日期后,组1销售加总40,组2销售加总30
在这里插入图片描述

使用案例代码,只针对当前工作簿生效,如果打开其他工作簿,代码要一行一行重写

下面制作简易插件,先把基本功能搭起来,造个mvp产品

插件制作

1. 新建xlam插件文件

新建工作簿,另存为xlam插件格式的文件,这里命名为UDL.xlam
在这里插入图片描述

2. 编辑xml文件

编辑xml文件,具体请参考EXCEL自定义功能区制作:https://blog.csdn.net/me_to_007/article/details/118260245
如下,新增了功能组"SQL",功能组里边有一个命名为SQL_QUERY的按钮,按钮回调了函数query

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
    <tabs>
        <tab id="myTab" label="my tab">
            <group id="group1" label="worksheet">
                <button id="button1" label="show name" size="large" onAction="show_activesheet_name" />
            </group>
            <group id="group2" label="SQL">
                <button id="button2" label="SQL_Query" size="large" onAction="query" />
            </group>
        </tab>
    </tabs>
</ribbon>
</customUI>

定义了回调函数:按钮点击会执行该函数

'Callback for button2 onAction
Sub query(control As IRibbonControl)
End Sub

这样就把功能面板做上去了,设置加载插件后,打开任意一个工作簿,我们可以看到功能该自定义按钮:
在这里插入图片描述

3. 制作窗体,定义窗体控件函数

弹出文本框,让用户输入sql查询,这里制作了一个简易的样例:两个文本标签+一个文本框+3个按钮
窗体

三按钮的default属性都设置为false,不然回车会触发按钮执行;
文本控件的ScrollBars属性设置为2:文本框内容过长,会有垂直滚条可以拉动

定义按钮函数-清空输入sql

Private Sub CommandButton2_Click()
UserForm1.TextBox1.Value = ""     ' 把文本框内容设置为空字符串即可
End Sub

定义按钮函数-生成样例sql

Private Sub CommandButton3_Click()
' 生成一个sql样例,供用户参考
UserForm1.TextBox1.Value = "select t2.group,sum(t1.销售额) as sales from [Sheet1$] as t1 inner join [分组$c4:d7] as t2 on t1.姓名=t2.姓名 where format(date,'yyyy/m/dd')<'2023/4/24' group by t2.group"
End Sub

定义按钮函数-执行sql
用户输入sql后,提交运行,这里我们只需要将上面的案例sql改下就好了,sql串使用用户文本框输入的内容,代码如下:

Private Sub CommandButton1_Click()
' 使用sql对excel进行查询
Dim con, rs As Object
Dim query_sql, str As String
Dim i, cols As Long

On Error GoTo line1

Application.ScreenUpdating = True   ' 关闭屏幕刷新

' 创建对象
Set con = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

' 数据连接
con.Open "Provider=Microsoft.ace.Oledb.12.0;" _
    & "Extended Properties=Excel 12.0;" _
    & "Data Source=" & ThisWorkbook.FullName
    
' 传入用户输入的sql
query_sql = UserForm1.TextBox1.Value
rs.Open query_sql, con, 1, 1


' 数据写入
Worksheets.Add    ' 新建工作表
With ActiveSheet
    cols = rs.Fields.Count
    For i = 0 To cols - 1
        .Cells(1, i + 1).Value = rs.Fields(i).Name  ' 写入表头
    Next
    .Cells(2, 1).CopyFromRecordset rs    ' 数据写入
End With

rs.Close
con.Close

Set con = Nothing
Set rs = Nothing



' 恢复屏幕刷新|工作表自动计算
Application.ScreenUpdating = True

MsgBox "query done", vbInformation, "温馨提示"

line1:
If Err <> 0 Then
    UserForm1.TextBox1.Value = Err.Description
    MsgBox "请检查异常", vbQuestion, "Error"
End If

End Sub

4. 编辑回调函数

展示窗体即可,插入模块,在模块里编辑该函数

Sub query(control As IRibbonControl)
UserForm1.Show
UserForm1.TextBox1.MultiLine = True    ' 文本框多行显示
UserForm1.TextBox1.EnterKeyBehavior = False ' 文本框允许回车换行
End Sub

5. 效果展示

点击"SQL_Query"按钮弹出窗体,再点击"生成样例sql"按钮,生成了样例sql
加粗样式
点击"执行sql"按钮,弹出了异常提示,这里我只打开了插件,没找到相关工作簿数据;
在这里插入图片描述

插件下载及加载

下载插件:

微云链接:https://share.weiyun.com/eVg9FeWV 密码:fn8k43

加载插件

打开任意一个工作簿,加载路径如截图:

在加载项里浏览找到插件加载确定即可

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker-compose 启动 lnmp 开发环境

GitHub传送阵 docker-lnmp 项目帮助开发者快速构建本地开发环境&#xff0c;包括Nginx、PHP、MySQL、Redis 服务镜像&#xff0c;支持配置文件和日志文件映射&#xff0c;不限操作系统&#xff1b;此项目适合个人开发者本机部署&#xff0c;可以快速切换服务版本满足学习服务新…

国产开源项目管理软件ZenTao

本文应网友 ukiyoec 要求而写&#xff1b; 什么是禅道 &#xff1f; 禅道 (ZenTao)是国产开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体&#xff0c;是一款专业的研发项目管理软件&#xff0c;完整覆盖了研发项目管理的核心流程。禅…

2023-Hive性能企业级调优

Hive作为大数据平台举足轻重的框架&#xff0c;以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一。 但是如果我们只局限于会使用Hive&#xff0c;而不考虑性能问题&#xff0c;就难搭建出一个完美的数仓&#xff0c;所以Hive性能调优是我们大数据从业…

前端周总结

在vue里面引入ts文件报错&#xff1a; An import path cannot end with a .ts extension. Consider importing xx.js instead. 方法一&#xff08;最快&#xff09; 把引入的xx.ts后缀删除 方法二 # 在tsconfig.json中加入以下配置 "baseUrl": ".", &quo…

Oracle LiveLabs实验:DB Security - Data Masking and Subsetting (DMS)

概述 本实验介绍了适用于 Enterprise Manager 的 Oracle 数据屏蔽和子集 (DMS) 包的各种特性和功能。 它使用户有机会学习如何配置这些功能&#xff0c;以便在非生产环境中保护他们的敏感数据。 此实验申请地址在这里&#xff0c;时间为60分钟。 本实验也是DB Security Adva…

String AOP

AOP AOP(Aspect Object programmar) 面向切面编程&#xff0c;它是对某一类问题的统一处理&#xff0c;而StringAOP就是AOP思想的一种具体实现就像Ioc和DI。 AOP组成 切面(Aspect) 切⾯&#xff08;Aspect&#xff09;由切点&#xff08;Pointcut&#xff09;和通知&#x…

论文阅读笔记《Grounded Action Transformation for Robot Learning in Simulation》

Grounded Action Transformation for Robot Learning in Simulation 发表于AAAI 2017 仿真机器人学习中的接地动作变换 Hanna J, Stone P. Grounded action transformation for robot learning in simulation[C]//Proceedings of the AAAI Conference on Artificial Intellig…

Linux中的阻塞机制

我们知道在字符设备驱动中&#xff0c;应用层调用read、write等系统调用终会调到驱动中对应的接口。 可以当应用层调用read要去读硬件的数据时&#xff0c;硬件的数据未准备好&#xff0c;那我们该怎么做&#xff1f; 一种办法是直接返回并报错&#xff0c;但是这样应用层要获得…

linux通配符和正则表达式深层解析...

目录&#xff1a; (一)了解通配符和正则的作用 (二)通配符的使用 (三)正则表达式的使用 (四)扩展正则表达式的使用 (一)了解通配符和正则的作用 (1.1)在我们日常的工作中&#xff0c;我们都会使用到通配符或者正则表达式。通配符是一种特殊语句&#xff0c;主要有星号(*)和问号…

交换机和路由器到底有什么区别???

我&#xff1a;度娘度娘&#xff0c;交换机和路由器的区别是什么呢&#xff1f; 度娘&#xff1a;一个工作在第二层数据链路层&#xff0c;一个工作在第三层网络层。 我&#xff1a;哈&#xff1f;那工作在不同层会有什么区别&#xff1f;为什么要工作在不同层&#xff1f; …

2023五一数学建模A题完整思路

已更新五一数学建模A题思路&#xff0c;文章末尾获取&#xff01; A题完整思路&#xff1a; A题是一个动力学问题&#xff0c;需要我们将物理学概念运用到实际生活中&#xff0c;我们可以先看题目 问题1&#xff1a; 假设无人机以平行于水平面的方式飞行&#xff0c;在空中投…

Windows11安装sqlserver2012失败后解决方案

首先卸载 WinR打开运行输入services.msc查看所有服务/或者我的电脑管理找到服务列表/任务管理器进入服务列表&#xff0c;停止所有与Sql Server有关的服务&#xff0c;如下&#xff1a; 打开控制面板-卸载sqlserver所有相关软件&#xff1b; 删除SQL Server相关注册表&#…

【观察】中国软件行业进入“重构期”,看浪潮海岳如何“开新局”

众所周知&#xff0c;改开四十多来年&#xff0c;中国软件产业在经历了萌芽与低谷、摸索与转型后&#xff0c;逐步进入了快速发展期。特别是过去几年&#xff0c;在新的发展格局&#xff0c;信创替代的进程中&#xff0c;整个中国软件业更是加速进入了全新的“重构期”。 在此过…

Unity API详解——Quaternion类

Quaternion类又称四元数&#xff0c;由x、y、z和w这4个分量组成&#xff0c;属于struct类型。在Unity中&#xff0c;用Quaternion来存储和表示对象的旋转角度。Quaternion的变换比较复杂&#xff0c;对于GameObject一般的旋转及移动&#xff0c;可以用Transform中的相关方法实现…

CH32V307环境参数在线监测系统(一)

CH32V307环境参数在线监测系统是以CH32V307VCT6为核心&#xff0c;由ESP8266模块、DHT11温湿度传感器模块、TFT LCD显示屏组成。系统实物图如下所示&#xff1a; 系统功能主要有RTC实时时钟、WIFI网络授时、DHT11温度测量、温湿度数据实时上传到onenet平台、屏幕定时刷新等功能…

在Docker上安装和运行MySQL容器(纯步骤)

在Docker上安装和运行MySQL步骤 本文章只有操作步骤&#xff0c;没有原理解释&#xff0c;只是在学习当中提醒自己安装步骤。 第一步&#xff1a;从远程仓库拉取MySQL镜像 1.从远程仓库搜索mysql镜像 docker search mysql2.pull拉取镜像 这里我选择的是mysql的5.7版本 docker…

盘点 5 个 yyds 的 AI 绘画辅助工具

国外著名的 AI 作图工具 Midjourney、Stable Diiffusion 都可以根据你输入的指令生成一张图片。 如果你想输出高质量的图片&#xff0c;需要掌握一些 prompt 指令技巧。本文章便盘点了 5 个 GitHub 上的开源项目&#xff0c;引领你更好的上手 AI 作图。 本期推荐开源项目目录&…

软件杯龙源风电赛题培训!千万分钟数据和全流程基线等你来战

‍‍ “中国软件杯”大学生软件设计大赛是一项面向中国在校学生的公益性赛事&#xff0c;大赛由国家工业和信息化部、教育部、江苏省人民政府共同主办&#xff0c;是全国软件行业规格最高、最具影响力的国家级一类赛事。其中&#xff0c;作为重点赛题的龙源风电赛&#xff0c;上…

我们分析了9.12亿篇博客文章,得出了11条内容营销发现

我们分析了 9.12 亿篇博客文章&#xff0c;想要更好地了解目前的内容营销领域。 具体来说&#xff0c;我们研究了这些文章的内容格式、字数和标题等因素与社交媒体分享和反向链接的关联性。 在我们的数据合作伙伴BuzzSumo的帮助下&#xff0c;我们有了一些非常有趣的发现。 …

Dex-Net使用手册————GQCNN网络

1. Dex-Net Package GitHub - BerkeleyAutomation/dex-net &#x1f388;dex-net Python 包用于打开、读取和编写 HDF5 数据库的 3D 对象模型、平行下颚抓取和掌握鲁棒性指标。 &#x1f388;HDF5数据库还可用于生成大量数据集&#xff0c;将点云和抓取的元组与二进制抓取鲁棒…