如何在Personal Workbook的VBA宏中用SQL引用ActiveWorkbook工作表?
解决Personal工作簿宏中SQL引用ActiveWorksheet的问题
你的代码存在两个核心问题,导致SQL查询错误指向了Personal工作簿而非目标激活工作簿,以下是具体修正方案:
关键错误修正
- 连接字符串目标错误:原代码使用
ThisWorkbook.FullName,在Personal宏环境中会返回Personal工作簿的路径,必须替换为ActiveWorkbook.FullName来指向当前激活的目标工作簿。 - SQL表名未动态解析:原代码中
[ws.Name$]是静态字符串,没有获取实际工作表的名称,需要改为动态拼接工作表名的写法。
修正后的完整代码
Option Explicit Sub GeneralJourney_Mapping() Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim ws As Worksheet Dim lastRow As Long Dim targetWB As Workbook ' 明确指向当前激活的目标工作簿 Set targetWB = ActiveWorkbook Set ws = targetWB.Worksheets("GeneralJournal") lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row Set conn = New ADODB.Connection Set rs = New ADODB.Recordset ' 连接字符串改为指向ActiveWorkbook conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " & targetWB.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";" Dim qSelectInvDetails As String ' 动态拼接工作表名,兼容带空格或特殊字符的表名 qSelectInvDetails = "Select [Company Code (4)], sum(Credit)-sum(Debit) as Credit" & _ " From [" & ws.Name & "$] " & _ " Group By [Company Code (4)]" rs.Open qSelectInvDetails, conn ws.Range("B17:K" & lastRow).ClearContents ws.Range("B17").CopyFromRecordset rs rs.Close conn.Close ' 释放对象 Set rs = Nothing Set conn = Nothing Set ws = Nothing Set targetWB = Nothing End Sub
额外注意事项
- 确保目标工作簿(ActiveWorkbook)已保存:ACE OLEDB驱动无法连接未保存的工作簿(无有效文件路径),若需处理未保存文件,可先临时保存再执行查询。
- 工作表名称包含空格或特殊字符时,
[" & ws.Name & "$]的写法可避免SQL解析报错。
内容的提问来源于stack exchange,提问作者Fernando Cruz Ceravalls
相关产品推荐
相关产品推荐

