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

我有以下的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的作品! 我不确定是什么导致了错误。

此外,如果我运行没有声明3的VBA,并将SQL复制并粘贴到TOAD,我会得到一个非常长的文本string。

当我使用claim3运行它时,它现在将文本string包装在每行的字符1,023处。 我相信这是造成这个问题的原因。 围绕1023个字符的包装有什么办法吗?

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

我一直在解决问题,看是否是一个具体的说法,但我发现有点奇怪。 每个范围有1000个声明,不pipe我改变哪个范围,如果我把声明的总数减less到2580,VBA将无错误地工作(如果我增加到2581个VBA错误)。 这意味着在strSQL中有32,698个字符。

我能find一个解决scheme! 问题在于string的长度以及VBA如何读取/分割线条。 经过几个小时的研究,寻找类似的问题,我遇到了一个解决scheme。 我必须创build一个function,打破了VBA成小块。

下面的VBA是一个允许VBAstring在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(所以这是23000的索赔)和VBA仍然工作!