Excel VBA ——从MySQL数据库中导出一个报表-笔记

本文主要涉及:

复制代码
VBA中数据库连接参数改成从配置文件获取
VBA连接MySQL数据库
VBA读MySQL数据库
演示两种写入工作簿的代码实现

系统环境:

复制代码
Windows 10 64bit
Excel 365 64bit
WAMP(3.2.2.2 64bit)集成的MariaDB版本为10.4.10(MariaDB的操作方法和MySQL相同,这里不做区分)
  1. VBA连接MySQL前的环境配置

如果还没有用VBA连接过mysql数据库,请参照前篇 VBA连接MySQL数据库

  1. VBA报表的优势

其实VBA报表的最大优势就是------它是在Excel表格中实现的!

有些办公场景中,不光需要你出报表,并且呈报的时候还要改excel表格格式,这时vba的优势就体现出来了。你可以首先在office中改好需要的样式,然后使用vba填充数据即可,单纯使用vba填入数据是不会破坏版面的各种样式的,这比其他语言的排版更有优势,代码量更少,且所见即所得,减少版面调整的时间!

  1. VBA代码示例

3.1  直接复制数据集的写法

python 复制代码
Sub 直接复制()
    '设置数据库连接对象
    Set conn = CreateObject("Adodb.Connection")
    '设置数据库记录集对象
    Set rs = CreateObject("Adodb.Recordset")
    serverIP = Sheet1.Range("J2").Value
    serverDB = Sheet1.Range("J6").Value
    serverUID = Sheet1.Range("J3").Value
    serverPWD = Sheet1.Range("J4").Value
    '配置连接串
    conn.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & serverIP & ";DB=" & serverDB & ";UID=" & serverUID & ";PWD=;OPTION=3;"
    conn.Open
    '拼接sql语句,写成这样子方便检查sql语句,也可以全部写到一行里
    sqlStr = " SELECT "
    sqlStr = sqlStr & " tp_auth.id, "
    sqlStr = sqlStr & " tp_auth. NAME, "
    sqlStr = sqlStr & " tp_hobby.content "
    sqlStr = sqlStr & " FROM "
    sqlStr = sqlStr & " tp_auth, "
    sqlStr = sqlStr & " tp_hobby "
    sqlStr = sqlStr & " WHERE "
    sqlStr = sqlStr & " tp_auth.id = tp_hobby.user_id "
    '从test数据库的YGXM表中取出所有数据
    rs.Open sqlStr, conn
    '设置表头
    Range("A1:C1").Value = Array("ID", "Name", "content")
    '将数据输出到工作表
    Range("A2").CopyFromRecordset rs
    '关闭连接
    rs.Close: Set rs = Nothing
    conn.Close: Set conn = Nothing
End Sub

优点:操作简单

缺点:所有的结果顺序都必须在sql语句中调试好,在写入单元格前如果要修改列的次序,相当于要在结果数组中直接操作数组,相对繁琐

3.2 利用数组转储的写法

python 复制代码
Sub 数组转储()
    '设置数据库连接对象
    Set conn = CreateObject("Adodb.Connection")
    '设置数据库记录集对象
    Set rs = CreateObject("Adodb.Recordset")
    serverIP = Sheet1.Range("J2").Value
    serverDB = Sheet1.Range("J6").Value
    serverUID = Sheet1.Range("J3").Value
    serverPWD = Sheet1.Range("J4").Value
    '配置连接串
    conn.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & serverIP & ";DB=" & serverDB & ";UID=" & serverUID & ";PWD=;OPTION=3;"
    conn.Open
    '拼接sql语句,写成这样子方便检查sql语句,也可以全部写到一行里
    sqlStr = " SELECT "
    sqlStr = sqlStr & " tp_auth.id, "
    sqlStr = sqlStr & " tp_auth. NAME, "
    sqlStr = sqlStr & " tp_hobby.content "
    sqlStr = sqlStr & " FROM "
    sqlStr = sqlStr & " tp_auth, "
    sqlStr = sqlStr & " tp_hobby "
    sqlStr = sqlStr & " WHERE "
    sqlStr = sqlStr & " tp_auth.id = tp_hobby.user_id "
    '从test数据库的YGXM表中取出所有数据
    rs.Open sqlStr, conn
    '设置表头
    Range("A1:C1").Value = Array("ID", "Name", "content")
    '使用数组存储记录集---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Dim arrRecord(1 To 1000000, 1 To 3)  '数组第一个参数代表数据集的行数,第二个代表列数
    i = 1
    Do While Not rs.EOF '当数据指针未移到记录集末尾时,循环下列操作
        '把数据集指定的字段,依次写入数组指定的列,顺序不必和sql结果相同
        arrRecord(i, 1) = rs("id")
        arrRecord(i, 2) = rs("NAME")
        arrRecord(i, 3) = rs("content")
        
        rs.MoveNext '把指针移向下一条记录
        i = i + 1 'i加1,准备把下一记录相关字段的值保存到工作表的下一行
        Loop '循环
        
        '将数组复制到单元格------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        Sheet1.Range("$A$2:$C$1000000") = arrRecord
        
        rs.Close: Set rs = Nothing
        conn.Close: Set conn = Nothing
        
        End Sub
相关推荐
李广坤19 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12022 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
WeiXin_DZbishe3 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
tryCbest3 天前
数据库SQL学习
数据库·sql