当前位置:首页 > 问答 > 正文

用VBA怎么简单点去调别的文件里的数据库,不用太复杂的步骤

用VBA去调用别的文件里的数据库,其实有很多简单直接的办法,不用想得太复杂,很多人一听到“数据库”就觉得必须用SQL Server、MySQL那些专业软件,然后要装驱动,写一大堆连接字符串,头都大了,其实对我们日常办公来说,所谓的“别的文件里的数据库”,很多时候就是指另一个Excel文件、或者一个Access数据库文件(.mdb或.accdb),VBA调用它们非常方便。

下面我就主要说说怎么对付这两种最常见的文件。

调用另一个Excel文件的数据(把整个文件当数据库)

这个方法最接地气,比如你有一个“数据源.xlsx”文件,里面有个“Sheet1”表格存着所有信息,你现在要在另一个“分析报告.xlsm”文件里用VBA自动把这些数据抓过来。

核心思路是: 不打开那个数据文件,直接读取,打开再复制粘贴太慢了,尤其是文件大的时候。

简单步骤和代码:

  1. 设置连接字符串: 告诉VBA你要连的是什么类型的文件,文件路径在哪。
  2. 执行SQL查询: 用一句简单的SQL语句(SELECT * FROM [Sheet1$])把整个表的数据抓过来。
  3. 把数据放到当前工作表: 将查询结果直接倒到你的表格里。

具体代码可以这样写(你可以直接拿来改改就用):

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

这段代码怎么用?

用VBA怎么简单点去调别的文件里的数据库,不用太复杂的步骤

  • 你把 文件路径 改成你那个数据源文件的实际位置。
  • [Sheet1$] 改成数据源文件里具体的工作表名。
  • Destination 对应的单元格改成你想放数据的起始位置。
  • 在你的Excel里按 Alt+F11 打开VBA编辑器,插入一个模块,把代码贴进去,按F5运行就行了。

优点: 速度快,数据源文件不用打开,后台就处理了,感觉就像直接从一个数据库里抽数据一样。

调用Access数据库文件(.accdb或.mdb)的数据

Access本身就是个小型的数据库,用VBA调它也非常简单,步骤和上面调Excel文件很像。

核心思路几乎一样: 也是通过连接字符串和SQL查询来获取数据。

简单步骤和代码:

用VBA怎么简单点去调别的文件里的数据库,不用太复杂的步骤

  1. 设置连接字符串: 这里指向的是Access文件。
  2. 执行SQL查询。
  3. 把数据放到当前工作表。

具体代码示例:

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还有一个终极法宝——录制宏

操作步骤:

  1. 在你的“分析报告.xlsm”文件里,切换到“数据”选项卡。
  2. 点击“获取数据”->“自其他来源”->“来自Microsoft Query”。
  3. 在弹出的“选择数据源”窗口里,选择“Excel Files”或“MS Access Database”,然后点击确定。
  4. 接着会让你选择数据源文件,找到你的那个“数据源.xlsx”或“示例数据库.accdb”。
  5. 然后会有一个图形化界面让你选择要导入哪些列,你只需要点下一步、下一步,最后选择“将数据返回Microsoft Excel”。
  6. 选择数据放置的位置。
  7. 最重要的一步: 在开始操作前,点击“开发工具”->“录制宏”,操作完成后,停止录制。
  8. Alt+F11 打开VBA编辑器,找到你刚才录制的宏,看看VBA自动生成的代码。

你会发现,录制的宏生成的代码,其核心逻辑和上面我们手写的非常相似,也是用到了 QueryTables 和连接字符串,你可以把这个代码稍微整理一下,就变成你自己的工具了,这是学习VBA最快捷的方式。

需要注意的几个小地方

  1. 驱动问题: 上面的代码用了 Microsoft.ACE.OLEDB.12.0 这个驱动,它比较新,能同时处理Excel和Access,如果你的电脑是旧版Office(比如2003或更早),可能需要用 Microsoft.Jet.OLEDB.4.0,但现在大部分电脑用ACE都没问题。
  2. 文件路径用全路径: 路径最好像 "C:\Users\用户名\Desktop\数据.xlsx" 这样写完整,避免找不到文件。
  3. SQL语句简单化: 刚开始就用 SELECT * FROM [表名] 获取全部数据最省事,等熟练了,再学用 WHERE 条件过滤,SELECT 姓名,销售额 FROM [销售表$] WHERE 销售额 > 1000
  4. 权限问题: 确保你的Excel文件有权限访问那个数据源文件,如果数据源文件正被另一个人打开着,可能会报错。

别把调用外部数据想得太复杂,对于日常办公自动化,你就记住这个套路:连接字符串 + SQL语句 + QueryTables刷新,对付Excel和Access文件的数据获取,基本上就够用了,多试几次,把代码存成模板,以后用的时候直接复制粘贴,改改文件路径和表名,非常方便。