excelvba上的除法sql查询

excelvba上的除法sql查询,sql,excel,vba,Sql,Excel,Vba,我想在这里划分一个长查询,当我删除第二行(用!!表示)时,一切正常,但当我添加时,收到错误“类型不匹配”。原因是行的长度,如果我缩短第二行并添加,则没有问题 这种方法我用以划分查询但收到错误行长度的原因有什么想法 strSqla = "SELECT DT4 .ABH, DT4 .S1 , CASE WHEN S1 = 'AV' OR S1 = 'AN' OR S1 = 'AY' THEN 'PDE' " ' !!!!!!strSqla = strSqla & "WHEN S1 = 'AE

我想在这里划分一个长查询,当我删除第二行(用!!表示)时,一切正常,但当我添加时,收到错误“类型不匹配”。原因是行的长度,如果我缩短第二行并添加,则没有问题

这种方法我用以划分查询但收到错误行长度的原因有什么想法

strSqla = "SELECT DT4 .ABH, DT4 .S1 , CASE WHEN S1 = 'AV' OR S1 = 'AN' OR S1 = 'AY' THEN 'PDE' "
' !!!!!!strSqla = strSqla & "WHEN S1 = 'AE' OR S1 = 'AH' OR S1 = 'AK' OR S1 = 'FE' THEN 'EME' "
strSqla = strSqla & "ELSE 'MANUAL' END AS division "
strSqla = strSqla & "FROM H9.PCFILES.DT4 DT4 WHERE DT4 .IDATE > '" & X & "'"
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DSN=PCFILES289;", Destination:=Range("$A$1")).QueryTable
   .CommandText = Array(strSqla)
    .RowNumbers = False

使用行连续器和字符串连接:

strSqla = "SELECT DT4 .ABH, DT4 .S1 , CASE WHEN S1 = 'AV' OR " & _
          "S1 = 'AN' OR S1 = 'AY' THEN 'PDE' WHEN S1 = 'AE' OR " & _
          "S1 = 'AH' OR S1 = 'AK' OR S1 = 'FE' THEN 'EME' " & _
          "ELSE 'MANUAL' END AS division FROM H9.PCFILES.DT4 " & _
          "DT4 WHERE DT4 .IDATE > '" & X & "'"

作为对
Macro-Man
所说内容的补充:

  • 在大约20行的情况下,行的延续是有限制的
  • 在那之后,他们不得不求助于像你一样的东西

    strSqla=“…”
    strSqla=strSqla&“…”

  • 无论哪种方式,查询构造都会变得相当笨拙,特别是如果您有单引号
    “字符串表达式”

这样,如果你经常使用更长的SQL,并时不时地改变它们,请考虑下列选项之一:

A) 将SQL存储在单独的文本文件中,然后使用存储函数将其读入字符串,如下所示:

Function fetchSQL(path As String) As String
    Dim Line As String
    Dim iFile As Integer
    iFile = FreeFile
    Open path For Input As #iFile

    Do Until EOF(iFile)
        Line Input #iFile, Line
        fetchSQL = fetchSQL & vbNewLine & Line
    Loop

    Close #iFile
End Function
并在代码中使用它,如下所示:

strSqla = fetchSQL("c:\yourpath\p01.sql")
Function fetchSQL as String()
    Dim i as Integer
    i = 1
    While Not IsEmpty(yoursheet.Cells(i, 2))
        fetchSQL = strSQL & vbCrLf & " " & yoursheet.Cells(i, 2).Value
        i = i + 1
    Wend
End Function
B) 或者,如果您更喜欢将SQL存储在工作簿中(假设您使用excel),则可以将SQL存储在工作表列中,并使用如下方式:

strSqla = fetchSQL("c:\yourpath\p01.sql")
Function fetchSQL as String()
    Dim i as Integer
    i = 1
    While Not IsEmpty(yoursheet.Cells(i, 2))
        fetchSQL = strSQL & vbCrLf & " " & yoursheet.Cells(i, 2).Value
        i = i + 1
    Wend
End Function

尝试了第二个选项,但仍然得到错误类型不匹配这里是图像

它起作用了,对于从单元格获取sql查询,这是正确的代码

Function fetchSQL() As String
Dim i As Integer
i = 1
While Not IsEmpty(Sheets("sheet2").Cells(i, 7))
fetchSQL = fetchSQL & Sheets("Sheet2").Cells(i, 7).Value & " "
i = i + 1
Wend
End Function

我尝试将两者结合起来,但仍然收到错误
strSqla=“SELECT DT4.ABALPH,DT4.S1,当S1='AV'或S1='AN'或S1='AY'然后是'XDE'&“当S1='AE'或S1='AH'或S1='XE'然后是'XME'”时的情况,strSqla=strSqla&“ELSE'MANUAL”结束为div“strSqla=strSqla&”来自H9.PCFILE.DT4 DT4其中DT4.IDATE>“&X”
这对我来说意味着什么吗?Martin感谢您的回答,我尝试了第二个选项,从单元格获取SQL查询,但仍然出现“类型不匹配”错误。我试过了;将所有代码写入一个单元格,dvide并写入一个单元格,将代码分成两个单元格。它们中的任何一个都不起作用:(fetchSQL=此行给出错误,没有第二行。为什么要使用
.CommandText=Array(fetchSQL)
而不是
。CommandText=fetchSQL
?`试试
Debug.Print(fetchSQL)
用于测试您的SQL字符串在使用前是否与您期望的一样。谢谢Martin!现在您的更正选项1正在工作。但选项2“从单元格获取查询”仍有错误。将查询划分为单元格,写入单个单元格,添加“”或者继续,没有一个有效elit,很抱歉-我错过了你的回答。Excel中的AFAIK SQL不支持
大小写
表达式。请改用,看看它是否有效。此外,对于第一次测试,请尝试一个稍微不太复杂的查询,在那里可以排除任何语法错误,例如
从表中选择前10*
很高兴我能帮忙p、 确保A)通过编辑原始帖子或作为评论发布您的问题,B)如果一篇帖子解决了您的问题,请将其标记为答案