You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:43:23