原创作者:李锐
微信公众号:VBA应用大全(VbaApp)
一句话核心价值点:用不到30行的VBA+SQL,把函数筛不了的复杂数据轻松拎出来,让零基础也能像老手一样秒查信息。
办公室常遇到:2026年销售表分华东、华北两张,要找出“华东且销量>5000且客户等级=A”的记录,用函数得嵌套一堆IF+INDEX+MATCH,改个条件就崩。VBA+SQL直接跨表抓,10行搞定:
Sub 跨表多条件筛() Dim conn As Object, rs As Object Set conn = CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=Yes';Data Source=" & ThisWorkbook.FullName Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT * FROM [华东$] a INNER JOIN [华北$] b ON a.客户=b.客户 WHERE a.销量>5000 AND a.等级='A'", conn Sheets.Add.Range("A1").CopyFromRecordset rs rs.Close: conn.CloseEnd Sub原理像找同事帮忙:SQL是“会查资料的搭档”,JOIN把两张表客户对齐,WHERE直接圈出符合条件的行,不用自己翻两张表对数据。VBA负责喊搭档开工,结果啪地贴到新表里,改条件只动WHERE里的数字/字母,比函数灵活十倍。
做周报表时,领导今天要“看地区+销售额”,明天变“看产品+利润”,函数引用列得手动改,漏改一个就错一片。VBA+SQL让列名跟着需求跑,20行解决:
Sub 动态列名筛() Dim conn As Object, rs As Object, colStr As String colStr = "地区,销售额" '想换列就改这里,比如改成"产品,利润" Set conn = CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=Yes';Data Source=" & ThisWorkbook.FullName Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT " & colStr & " FROM [2026销售$] WHERE 销售额>3000", conn Sheets.Add.Range("A1").CopyFromRecordset rs rs.Close: conn.CloseEnd Sub原理是把列名变成“可替换的填空”——colStr里写想要啥列,SQL就抓啥列,不用动公式里的单元格引用。就像点奶茶可以换配料,说换就换,不会像函数那样“固定配料”改不了,小白改个引号里的词就行,零门槛。
找2026年客户备注含“急单”“加急”的记录,还要按下单时间排最新在前,函数得用FIND+ISNUMBER找关键词,再排序得单独插辅助列;透视表只能精确筛,模糊的一概不管。VBA+SQL一步到位,25行:
Sub 模糊匹配排序() Dim conn As Object, rs As Object Set conn = CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=Yes';Data Source=" & ThisWorkbook.FullName Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT * FROM [2026订单$] WHERE 备注 LIKE '%急单%' OR 备注 LIKE '%加急%' ORDER BY 下单时间 DESC", conn Sheets.Add.Range("A1").CopyFromRecordset rs rs.Close: conn.CloseEnd Sub原理是SQL的LIKE当“关键词探测器”,%代表任意字符,“%急单%”就是备注里只要有“急单”俩字就抓;ORDER BY DESC是按时间倒序,最新的排最前。透视表像个“死脑筋收纳盒”,只认 exact 匹配,而SQL是“灵活侦探”,还能顺手排好队,VBA把侦探的结果直接端到你桌上。
要算2026年每个客户的订单数,还得去掉重复的客户名,函数得用UNIQUE+COUNTIF,步骤多还容易漏算;数据透视表能统计但要额外拖字段,新手常拖错。VBA+SQL三两下合并,18行:
Sub 去重统计() Dim conn As Object, rs As Object Set conn = CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=Yes';Data Source=" & ThisWorkbook.FullName Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT 客户, COUNT(订单号) AS 订单数 FROM [2026订单$] GROUP BY 客户", conn Sheets.Add.Range("A1").CopyFromRecordset rs rs.Close: conn.CloseEnd Sub原理是GROUP BY把相同客户“捆成一堆”,COUNT数每堆的订单数,自动去重还统计,不用先UNIQUE再COUNTIF绕弯子。就像整理快递,把同一人的包裹放一起数个数,比一个个找名字+数快得多,VBA帮你喊SQL动手,结果直接整齐列好。
每月要查2026年最新入库数据,函数得每次改引用范围,透视表要右键刷新,碰上数据天天加,手动刷到手指酸。VBA+SQL设成一键更,22行:
Sub 实时刷新查() Dim conn As Object, rs As Object Set conn = CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=Yes';Data Source=" & ThisWorkbook.FullName Set rs = CreateObject("ADODB.Recordset") rs.Open "SELECT * FROM [2026入库$] WHERE 入库日期>=#2026-01-01#", conn Sheets("查询结果").Cells.Clear Sheets("查询结果").Range("A1").CopyFromRecordset rs rs.Close: conn.CloseEnd Sub原理是SQL的#日期#直接锁时间范围,每次运行都读当前表的最新数据——就像看实时公交,车来了就显示,不用自己翻旧表。VBA把刷新变成点一下按钮的事,比手动改范围/右键刷省劲,数据一变点一下就有新结果。
其实VBA+SQL没那么玄乎,就是把“想查的条件翻译成机器懂的话”,让Excel替你跑腿。不用背语法,改几个词就能解决函数搞不定的麻烦,每天试一个小场景,慢慢就把零散技巧连成能打硬仗的本事。


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

干货教程 · 信息分享
