Excel 2013 VBA数据库连接刷新报1004错误,移除代码则无法传输求助
Fixing the 1004 Runtime Error with Excel 2013 VBA QueryTable Refresh
我来帮你解决这个头疼的问题——你的代码里有两个关键问题导致了1004错误和数据传输不完整的情况,咱们一步步拆解修复:
1. SQL Syntax Error (Missing Quotes for String Values)
你的CHIAVE变量是字符串类型(比如"CCI 1234"),但在SQL的WHERE子句里,你没给这个字符串值加单引号,这会让数据库解析SQL时直接报错,进而触发1004运行时错误。
修改CommandText里的WHERE部分:
把:
"OM CCI_DATV3.§FIEB01L WHERE ((§FIEB01L.NUDOS=" & CHIAVE & "))"
改成:
"OM CCI_DATV3.§FIEB01L WHERE ((§FIEB01L.NUDOS='" & CHIAVE & "'))"
注意这里给CHIAVE变量包裹了单引号,确保SQL能正确识别字符串值。
2. Conflicting BackgroundQuery Settings
你先设置了.BackgroundQuery = True,又在.Refresh方法里强制BackgroundQuery:=False,这种混合设置在Excel 2013的ODBC连接中很容易引发冲突,导致要么报错要么数据加载不全。
因为你需要确保数据传输完成,推荐统一设置:
.BackgroundQuery = False ' 改为False,让代码等待查询完成再继续 .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .ListObject.DisplayName = "Tabella_Query_da_CCI_DATV3" .Refresh ' 这里不用重复传参数,已经提前设置过BackgroundQuery了
Full Fixed Code
整合所有修改后的完整代码如下,我还加了一些鲁棒性优化:
Sub TransferData() Dim Bolla As String Dim CHIAVE As String Dim ws As Worksheet ' 获取输入并处理空值情况 Bolla = InputBox("Numero Bolla?", "bolla", "", 3000, 5000) If Bolla = "" Then Exit Sub ' 用户取消输入时直接退出,避免后续错误 CHIAVE = "CCI " & Bolla ' 新建工作表并赋值给变量,避免依赖ActiveSheet Set ws = ThisWorkbook.Sheets.Add ws.Name = "Trasferimento" With ws.ListObjects.Add(SourceType:=0, Source:= _ "ODBC;DSN=CCI_DATV3;", Destination:=ws.Range("$A$1")).QueryTable .CommandText = Array( _ "SELECT §FIEB01L.NUDOS, §FIEB01L.RASCS, §FIEB01L.DASPS, §FIEB01L.DESTS, §FIEB01L.DEFIS, §FIEB01L.DESCS, §FIEB01L.QTISS, §FIEB01L.COSTS, §FIEB01L.BOBIS, §FIEB01L.TESIS, §FIEB01L.TESES, §FIEB01L.ORPRS FROM CCI_DATV3.§FIEB01L WHERE ((§FIEB01L.NUDOS='" & CHIAVE & "'))" _ ) .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True .ListObject.DisplayName = "Tabella_Query_da_CCI_DATV3" .Refresh End With End Sub
Quick Additional Tips
- 我添加了变量类型声明和空输入判断,避免用户取消输入时程序崩溃;
- 用
ws变量代替ActiveSheet,让代码更可靠,不会因为工作表切换出问题; - 合并了
CommandText的两行(可选),让SQL语句更易读。
这样修改后,应该既能彻底解决1004错误,又能保证数据完整加载完成。
内容的提问来源于stack exchange,提问作者Antonio Grande
相关产品推荐
相关产品推荐

