在Excel数据连接中使用VBA更改命令文本SQL时接收运行时错误(1004)

时间:2017-08-22 17:03:59

标签: sql excel vba excel-vba

我有以下VBA更新excel中数据连接中的命令文本。

Sub ClaimLine_Macro()

    Dim strsql As String
    strsql = "Select a.* from claim a "
    strsql = strsql & Worksheets("SQL_ClaimLine").Range("claim1")
    strsql = strsql & Worksheets("SQL_ClaimLine").Range("claim2")
    strsql = strsql & Worksheets("SQL_ClaimLine").Range("claim3")

    With ActiveWorkbook.Connections("ClaimLineExtract").ODBCConnection
        .BackgroundQuery = True
        .CommandText = strsql

    End With

    ActiveWorkbook.Connections("ClaimLineExtract").Refresh

End Sub

如果我运行上面的VBA,我得到错误运行时错误1004应用程序定义或对象定义错误。

有趣的是,如果我发表评论

strsql = strsql & Worksheets("SQL_ClaimLine").Range("claim3")

VBA有效!我不确定导致错误的原因。

此外,如果我在没有claim3的情况下运行VBA并将SQL复制并粘贴到TOAD中,我会得到一个非常长的文本字符串。

当我使用claim3运行它时,它现在将文本字符串包装在每行的字符1,023上。我相信这是导致这个问题的原因。包裹的数量是否有1,023个字符?

VBA中的范围(权利要求1,权利要求2和权利要求3)各自引用包含1,000个声明的连接块的单个单元。单元格具有UDF公式,可以将它们置于正确的语法中,同时在需要时在末尾附加“或a.claim”。 Claim1被硬编码在开头说“Where a.claim”。

我一直在努力拍摄,看看它是否是一个特定的声明但我发现的有点奇怪。每个范围都有1,000个声明,无论我更改哪个范围,如果我将声明总数减少到2,580,VBA将无误地工作(如果我将VBA错误增加到2,581)。这意味着strSQL中有32,698个字符。

1 个答案:

答案 0 :(得分:2)

我能够找到解决方案!问题在于字符串的长度以及VBA如何读取/分割线条。经过几个小时的研究,寻找类似的问题,我遇到了一个解决方案。我不得不创建一个将VBA分成更小块的函数。

下面的VBA是一个允许VBA字符串最多200个字符的函数。

Function SplitMeUp(strin As String)

    Const MAX_LEN As Long = 200
    Dim rv(), n, i
    n = Application.Ceiling(Len(strin) / MAX_LEN, 1)
    ReDim rv(0 To n - 1)
    For i = 1 To n
        rv(i - 1) = Mid(strin, 1 + ((i - 1) * MAX_LEN), MAX_LEN)
    Next i
    SplitMeUp = rv
End Function

这意味着在我的命令文本行中现在看起来像这样。

.CommandText = SplitMeUp(strsql)

通过拆分strsql,然后将它放回到一起,可以在数据连接中正确读取SL,并且不会导致运行时错误。

作为奖励,我出了一系列的索赔23(这是23,000个索赔),VBA仍然有效!