用VBA怎么简单点去调别的文件里的数据库,不用太复杂的步骤
- 问答
- 2026-01-04 03:25:33
- 7
用VBA去调用别的文件里的数据库,其实有很多简单直接的办法,不用想得太复杂,很多人一听到“数据库”就觉得必须用SQL Server、MySQL那些专业软件,然后要装驱动,写一大堆连接字符串,头都大了,其实对我们日常办公来说,所谓的“别的文件里的数据库”,很多时候就是指另一个Excel文件、或者一个Access数据库文件(.mdb或.accdb),VBA调用它们非常方便。
下面我就主要说说怎么对付这两种最常见的文件。
调用另一个Excel文件的数据(把整个文件当数据库)
这个方法最接地气,比如你有一个“数据源.xlsx”文件,里面有个“Sheet1”表格存着所有信息,你现在要在另一个“分析报告.xlsm”文件里用VBA自动把这些数据抓过来。
核心思路是: 不打开那个数据文件,直接读取,打开再复制粘贴太慢了,尤其是文件大的时候。
简单步骤和代码:
- 设置连接字符串: 告诉VBA你要连的是什么类型的文件,文件路径在哪。
- 执行SQL查询: 用一句简单的SQL语句(
SELECT * FROM [Sheet1$])把整个表的数据抓过来。 - 把数据放到当前工作表: 将查询结果直接倒到你的表格里。
具体代码可以这样写(你可以直接拿来改改就用):
Sub 从Excel文件获取数据()
' 定义变量
Dim 连接字符串 As String
Dim 文件路径 As String
Dim SQL语句 As String
Dim 数据区域 As Range
' 设置数据源文件的完整路径,假设它放在D盘根目录
文件路径 = "D:\数据源.xlsx"
' 构建连接字符串
' 这个字符串是固定格式,HDR=YES表示第一行是标题
连接字符串 = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & 文件路径 & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
' 设置SQL查询语句,[Sheet1$]表示要读取Sheet1工作表的全部数据
SQL语句 = "SELECT * FROM [Sheet1$]"
' 设置数据要粘贴到当前工作表的哪个位置,比如从A1单元格开始
Set 数据区域 = ThisWorkbook.Worksheets("Sheet1").Range("A1")
' 核心部分:用QueryTables对象来执行查询并填充数据
With ThisWorkbook.Worksheets("Sheet1").QueryTables.Add( _
Connection:=连接字符串, _
Destination:=数据区域, _
Sql:=SQL语句)
.RefreshStyle = xlOverwriteCells ' 覆盖现有单元格
.Refresh ' 执行刷新,也就是获取数据
.Delete ' 删除这个查询连接(可选,为了让表格干净)
End With
MsgBox "数据获取完成!"
End Sub
这段代码怎么用?

- 你把
文件路径改成你那个数据源文件的实际位置。 - 把
[Sheet1$]改成数据源文件里具体的工作表名。 - 把
Destination对应的单元格改成你想放数据的起始位置。 - 在你的Excel里按
Alt+F11打开VBA编辑器,插入一个模块,把代码贴进去,按F5运行就行了。
优点: 速度快,数据源文件不用打开,后台就处理了,感觉就像直接从一个数据库里抽数据一样。
调用Access数据库文件(.accdb或.mdb)的数据
Access本身就是个小型的数据库,用VBA调它也非常简单,步骤和上面调Excel文件很像。
核心思路几乎一样: 也是通过连接字符串和SQL查询来获取数据。
简单步骤和代码:

- 设置连接字符串: 这里指向的是Access文件。
- 执行SQL查询。
- 把数据放到当前工作表。
具体代码示例:
Sub 从Access文件获取数据()
Dim 连接字符串 As String
Dim 文件路径 As String
Dim SQL语句 As String
Dim 数据区域 As Range
' 设置Access数据库文件的路径
文件路径 = "D:\示例数据库.accdb"
' 构建连接字符串,Provider部分根据你的Access版本可能微调
连接字符串 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & 文件路径 & ";"
' 设置SQL查询语句,这里"表名"要换成你Access数据库里真实的表名或查询名
SQL语句 = "SELECT * FROM 表名"
' 设置目标位置
Set 数据区域 = ThisWorkbook.Worksheets("Sheet1").Range("A1")
' 同样的方式,使用QueryTables
With ThisWorkbook.Worksheets("Sheet1").QueryTables.Add( _
Connection:=连接字符串, _
Destination:=数据区域, _
Sql:=SQL语句)
.RefreshStyle = xlOverwriteCells
.Refresh
.Delete
End With
MsgBox "Access数据获取完成!"
End Sub
这段代码怎么用?
- 主要就是改
文件路径和SQL语句中的表名。 - Access里的查询(Query)也可以当作表来用,所以SQL语句也可以写成
SELECT * FROM 我的查询。
更偷懒但实用的方法:录制宏
如果你连上面这些代码都懒得记,VBA还有一个终极法宝——录制宏。
操作步骤:
- 在你的“分析报告.xlsm”文件里,切换到“数据”选项卡。
- 点击“获取数据”->“自其他来源”->“来自Microsoft Query”。
- 在弹出的“选择数据源”窗口里,选择“Excel Files”或“MS Access Database”,然后点击确定。
- 接着会让你选择数据源文件,找到你的那个“数据源.xlsx”或“示例数据库.accdb”。
- 然后会有一个图形化界面让你选择要导入哪些列,你只需要点下一步、下一步,最后选择“将数据返回Microsoft Excel”。
- 选择数据放置的位置。
- 最重要的一步: 在开始操作前,点击“开发工具”->“录制宏”,操作完成后,停止录制。
- 按
Alt+F11打开VBA编辑器,找到你刚才录制的宏,看看VBA自动生成的代码。
你会发现,录制的宏生成的代码,其核心逻辑和上面我们手写的非常相似,也是用到了 QueryTables 和连接字符串,你可以把这个代码稍微整理一下,就变成你自己的工具了,这是学习VBA最快捷的方式。
需要注意的几个小地方
- 驱动问题: 上面的代码用了
Microsoft.ACE.OLEDB.12.0这个驱动,它比较新,能同时处理Excel和Access,如果你的电脑是旧版Office(比如2003或更早),可能需要用Microsoft.Jet.OLEDB.4.0,但现在大部分电脑用ACE都没问题。 - 文件路径用全路径: 路径最好像
"C:\Users\用户名\Desktop\数据.xlsx"这样写完整,避免找不到文件。 - SQL语句简单化: 刚开始就用
SELECT * FROM [表名]获取全部数据最省事,等熟练了,再学用WHERE条件过滤,SELECT 姓名,销售额 FROM [销售表$] WHERE 销售额 > 1000。 - 权限问题: 确保你的Excel文件有权限访问那个数据源文件,如果数据源文件正被另一个人打开着,可能会报错。
别把调用外部数据想得太复杂,对于日常办公自动化,你就记住这个套路:连接字符串 + SQL语句 + QueryTables刷新,对付Excel和Access文件的数据获取,基本上就够用了,多试几次,把代码存成模板,以后用的时候直接复制粘贴,改改文件路径和表名,非常方便。
本文由水靖荷于2026-01-04发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/74085.html
