我有以下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个字符。
答案 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仍然有效!