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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:08