https://download.csdn.net/download/chenchihwen/90621615https://download.csdn.net/download/chenchihwen/90621615
业务场景
这个代码适用于需要定期从 MySQL 数据库中获取数据并导入到 Excel 进行分析和处理的场景。例如,财务人员需要从数据库中提取财务数据,或者业务人员需要获取销售数据等。通过在 “SQL” 工作表中编写不同的 SQL 查询语句,可以灵活地获取不同的数据,而代码会自动将查询结果导入到 Excel 中,方便进一步的分析和报表制作。
为了让用户比较方便的组织出正确的 sql
在SQL 页面布置了 简单的 SQL 筛选语句, 通过 【B4】的内容 与 E3: G9 的内容 写出 SQL
- 数据筛选与查询语句生成:提到 “筛选多少数据 TOP 10 放 10 先少量捞,取消捞全部” ,说明有数据筛选的需求,最开始计划先筛选出 10 条数据进行处理,后续可能会取消限制获取全部数据。
=CONCATENATE("SELECT"," * FROM ",B12,IF(G3="","",IF(UPPER(H3)="X"," WHERE "&E3&F3&G3," WHERE "&E3&F3&"'"&G3&"'")),IF(G4="","",IF(UPPER(H4)="X"," AND "&E4&F4&G4," AND "&E4&F4&"'"&G4&"'")),,IF(G5="","",IF(UPPER(H5)="X"," AND "&E5&F5&G5," AND "&E5&F5&"'"&G5&"'")),IF(G6="","",IF(UPPER(H6)="X"," AND "&E6&F6&G6," AND "&E6&F6&"'"&G6&"'")),IF(G11>0," Limit "&G11," ;"))
这一长串公式是在动态生成 SQL 查询语句。根据不同单元格(如 G3、H3、E3 等)的值来决定是否添加WHERE
条件以及具体的条件内容,并且根据G11
的值决定是否添加LIMIT
子句来限制查询结果的数量。
【B4】 格内容是个下拉字段是 数据验证
code =
当点击 数据更新时,会根据 SQL 的内容 通过 ODBC 获取 数据内容,并存放在 RAW sheet 中
VBA 的源码如下
Sub SQLCC()'Dim SQL As StringApplication.ScreenUpdating = FalseSheets("SQL").Visible = TrueCells(1, 7) = Now()Sheets("SQL").SelectSQL = Range("B13").ValueSheets("Raw").SelectCells.SelectSelection.ClearContentsWith ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _"ODBC;dsn=ECS;database=ecs_fssc;Server=10.153.36.4;port=3306;UID=userID;PASSWORD=yourpassword;" _, Destination:=Range("$A$1")).QueryTable.CommandType = xlCmdSql.CommandText = Array(SQL).RowNumbers = False.FillAdjacentFormulas = False.PreserveFormatting = True.RefreshOnFileOpen = False.BackgroundQuery = True.RefreshStyle = xlInsertDeleteCells.SaveData = True.AdjustColumnWidth = False.RefreshPeriod = 0.PreserveColumnInfo = True.ListObject.DisplayName = "Query5".Refresh BackgroundQuery:=FalseEnd WithSheets("Raw").Cells.EntireColumn.AutoFitEnd Sub
整体功能概述
这段 VBA 代码 SQLCC
的主要功能是从指定的 MySQL 数据库中执行 SQL 查询,并将查询结果导入到 Excel 的 “Raw” 工作表中,最后自动调整 “Raw” 工作表的列宽以适应数据。代码通过读取 “SQL” 工作表中的 SQL 查询语句,使用 ODBC 连接到数据库,执行查询并将结果填充到 “Raw” 工作表,同时对查询表的一些属性进行了设置。
代码分段解释
1. 变量声明与屏幕更新设置
vba
Dim SQL As String
Application.ScreenUpdating = False
Dim SQL As String
:声明一个字符串类型的变量SQL
,用于存储从工作表中读取的 SQL 查询语句。Application.ScreenUpdating = False
:关闭 Excel 的屏幕更新功能,这样在代码执行过程中,Excel 界面不会实时刷新,从而提高代码的执行效率。
2. 显示工作表并记录时间
vba
Sheets("SQL").Visible = True
Cells(1, 7) = Now()
Sheets("SQL").Select
SQL = Range("B13").Value
Sheets("SQL").Visible = True
:将名为 “SQL” 的工作表设置为可见状态。Cells(1, 7) = Now()
:在当前活动工作表的第 1 行第 7 列(即 G1 单元格)记录当前的日期和时间。Sheets("SQL").Select
:选中 “SQL” 工作表。SQL = Range("B13").Value
:从 “SQL” 工作表的 B13 单元格中读取 SQL 查询语句,并将其赋值给变量SQL
。
3. 清空 “Raw” 工作表内容
vba
Sheets("Raw").Select
Cells.Select
Selection.ClearContents
Sheets("Raw").Select
:选中名为 “Raw” 的工作表。Cells.Select
:选中 “Raw” 工作表中的所有单元格。Selection.ClearContents
:清空选中单元格的内容,为导入新的查询结果做准备。
4. 创建并配置查询表
vba
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _"ODBC;dsn=ECS;database=ecs_fssc;Server=10.153.36.4;port=3306;UID=ecs_fssc;PASSWORD=yuanian@123;" _, Destination:=Range("$A$1")).QueryTable.CommandType = xlCmdSql.CommandText = Array(SQL).RowNumbers = False.FillAdjacentFormulas = False.PreserveFormatting = True.RefreshOnFileOpen = False.BackgroundQuery = True.RefreshStyle = xlInsertDeleteCells.SaveData = True.AdjustColumnWidth = False.RefreshPeriod = 0.PreserveColumnInfo = True.ListObject.DisplayName = "Query5".Refresh BackgroundQuery:=False
End With
ActiveSheet.ListObjects.Add(...)
:在当前活动工作表(即 “Raw” 工作表)中添加一个新的查询表。SourceType:=0
:表示数据源类型为 ODBC 数据源。Source
:指定 ODBC 连接字符串,包含数据库的相关信息,如数据源名称(dsn=ECS
)、数据库名(database=ecs_fssc
)、服务器地址(Server=10.153.36.4
)、端口号(port=3306
)、用户名(UID=ecs_fssc
)和密码(PASSWORD=yuanian@123
)。Destination:=Range("$A$1")
:指定查询结果的起始位置为 “Raw” 工作表的 A1 单元格。
.CommandType = xlCmdSql
:设置查询类型为 SQL 查询。.CommandText = Array(SQL)
:将之前读取的 SQL 查询语句赋值给查询表的命令文本。- 后续一系列属性设置:
RowNumbers = False
:不显示行号。FillAdjacentFormulas = False
:不自动填充相邻的公式。PreserveFormatting = True
:保留单元格的格式。RefreshOnFileOpen = False
:在打开文件时不自动刷新查询。BackgroundQuery = True
:允许在后台进行查询刷新。RefreshStyle = xlInsertDeleteCells
:刷新时插入或删除单元格以适应数据变化。SaveData = True
:保存查询结果数据。AdjustColumnWidth = False
:不自动调整列宽。RefreshPeriod = 0
:不设置自动刷新周期。PreserveColumnInfo = True
:保留列的信息。.ListObject.DisplayName = "Query5"
:将查询表的显示名称设置为 “Query5”。
.Refresh BackgroundQuery:=False
:立即刷新查询,不使用后台查询方式。
5. 自动调整列宽
vba
Sheets("Raw").Cells.EntireColumn.AutoFit
- 选中 “Raw” 工作表中的所有单元格,并自动调整各列的宽度,使其适应列中的内容。