原创作者:李锐
微信公众号:VBA应用大全(VbaApp)
一句话核心价值点:用VBA+SQL让零基础也能在Excel里秒查、速算百万级数据,把重复劳动变成一键完成的高效活儿。
办公室常遇到:一份2026年销售明细表几百万行,开个Excel像老牛拉车,改个筛选就转圈半小时。函数公式一嵌套,电脑直接歇菜。
用VBA连上数据库,把运算交给后台,Excel只显示你要的结果,顺滑得像新机。
Sub 连接数据库取数()
Dim conn As Object, rs As Object
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\2026sales.accdb;"
rs.Open "SELECT 日期, 客户, 金额 FROM 销售表 WHERE 金额>10000", conn
Sheet1.Range("A2").CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub原理很简单:VBA用ADO当“传话员”,SQL当“问路条”,数据库快速找好数据,再整批送到Excel。这样几百万行在后台算,前台只留精华,不怕卡顿不怕崩。
做月度分析时,订单表在A文件,客户信息在B文件,产品资料在C文件,来回切表查找像爬坡。函数公式跨表引用,拖几下就报错。
VBA+SQL能一次跨表捞数据,逻辑写在SQL里,像点外卖选套餐,一步配齐。
Sub 多表联合查询()
Dim conn As Object, rs As Object
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\2026all.accdb;"
rs.Open "SELECT o.订单号, c.客户名, p.产品名, o.数量 " & _
"FROM 订单表 o " & _
"JOIN 客户表 c ON o.客户ID=c.ID " & _
"JOIN 产品表 p ON o.产品ID=p.ID " & _
"WHERE o.日期>#2026-01-01#", conn
Sheet1.Range("A2").CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End SubSQL的JOIN就像拼图,把不同表的相关块拼一起,VBA负责搬运。一次查询就把分散信息汇齐,不用反复切表,效率翻倍。
每月要给老板看不同维度的报表,今天按地区筛,明天按渠道筛,手动改条件烦到想摸鱼。数据透视表虽能拖字段,但每次都要重新设置。
VBA写个参数入口,输入即查,像点菜一样随需切换。
Sub 动态条件查询()
Dim conn As Object, rs As Object, area As String
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
area = InputBox("请输入地区:", "动态筛选")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\2026sales.accdb;"
rs.Open "SELECT * FROM 销售表 WHERE 地区='" & area & "'", conn
Sheet1.Range("A2").CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub原理是把筛选条件变成可变的SQL语句,VBA运行前先问你要啥,再去数据库精准抓。一次写好,天天复用,手指少受累。
年底要做2019-2026的全周期汇总,数据透视表一次只能拖一年,合并结果还得手动加。函数公式跨年引用,屏幕闪半天。
VBA循环年份,让SQL分批取数再合并,一气呵成。
Sub 跨年批量汇总()
Dim conn As Object, rs As Object, y As Integer, sql As String
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\2026sales.accdb;"
For y = 2019 To 2026
sql = "SELECT 'Y" & y & "' AS 年度, SUM(金额) AS 总额 FROM 销售表 WHERE YEAR(日期)=" & y
rs.Open sql, conn
If Not rs.EOF Then Sheet1.Cells(y - 2018, 1).Value = rs!年度: Sheet1.Cells(y - 2018, 2).Value = rs!总额
rs.Close
Next y
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub循环就像流水线,每年数据按顺序打包送到Excel指定位置,不用人工拼接。一次执行,跨年账单一目了然。
遇到超大数据,SUMIFS、INDEX+MATCH层层嵌套,内存飙升,Excel提示“资源不足”。数据透视表刷新慢,还容易丢格式。
VBA用SQL聚合,把计算压在数据库,返回结果轻量又稳。
Sub 聚合计算省内存()
Dim conn As Object, rs As Object
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\2026sales.accdb;"
rs.Open "SELECT 客户, SUM(金额) AS 总金额, COUNT(*) AS 订单数 FROM 销售表 GROUP BY 客户", conn
Sheet1.Range("A2").CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End SubSQL的GROUP BY是专业分工,先在库里分堆算好,VBA只搬结果。内存压力小,速度还快,适合长期跑任务。
每月从业务系统导出CSV,再粘贴到Excel,路径换来换去,一不留神贴错列。数据透视表和公式没法自动抓最新文件。
VBA指定文件夹,定时或一键读入最新数据,全程无人值守。
Sub 自动导入最新CSV()
Dim conn As Object, rs As Object, filePath As String
Set conn = CreateObject("ADODB.Connection")
filePath = "C:\export\" & Dir("C:\export\*.csv") '取最新文件名
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filePath & ";Extended Properties='Text;HDR=YES;FMT=Delimited';"
Set rs = conn.Execute("SELECT * FROM [" & Dir(filePath) & "]")
Sheet1.Range("A2").CopyFromRecordset rs
conn.Close
Set rs = Nothing
Set conn = Nothing
End SubVBA像自动搬运工,文件来就收,规则定好不乱套,让你告别复制粘贴的机械活。
数据是矿,SQL是镐,VBA是车,三者合体才能挖得快运得远。
让后台算重活,前台看靓货,Excel才真成办公利器。
不怕数据大,就怕方法旧,换条路走风景不同。
VBA+SQL不是高手的专利,零基础也能边玩边学,把繁杂变简单,把等待变即刻。只要思路对,每天进步一点,工作就能轻盈起来。


原创作者: 李锐
微信公众号:VBA应用大全(VbaApp)

干货教程 · 信息分享
