1

我在 access-vba 中遇到了很多字符串问题。

问题是,访问(有时)将字符串的长度限制为大约 255 个字符。

但是,根据字符串的构建方式,它可能会变得大于 255 个字符。

有一个工作代码的例子:

Dim strReq as String
strReq = "SELECT exampleField1, exampleField2, exampleField3, exampleField4, exampleField5 "
strReq = strRec & ", exampleField6, exampleField7, exampleField8, .... [etc. insert many fields, you get it]"

strReq = strReq & " FROM myTable INNER JOIN Tbl2 ON ...[many JOINs as well]"

等等,我经常处理大型查询,因此 256 个字符很容易被破坏。

但是,这些示例不起作用:

Dim strReq as String
strReq = "SELECT exampleField1, exampleField2, exampleField3, exampleField4, exampleField5 " & _
", exampleField6, exampleField7, exampleField8, .... [etc. insert many fields, you get it]" & _
" WHERE exampleField1 = x AND  exampleField2 = y AND  exampleField3 = z" & _
" ORDER BY 1,2,3,4,5,6"

这也不起作用:

Dim strReq as String
Dim strWhere as String
strReq = "SELECT exampleField1, exampleField2, exampleField3, exampleField4, exampleField5 "
strReq = strRec & ", exampleField6, exampleField7, exampleField8, .... [etc. insert many fields, you get it]"
strWhere = "WHERE exampleField1 = x "
strWhere = strWhere & "AND  exampleField2 = y"
strWhere= strWhere & " AND  exampleField3 = z"

strReq = strReq & strWhere [& strJoin / strOrder / strHaving / etc]

我知道大致知道如何连接字符串或不能连接字符串,但我想知道字符串在 access vba 上的确切工作方式,因为,我承认,到目前为止它似乎很随机......

*(请注意,这些字符串的长度应该比 255 个字符更长,并且查询只是作为示例,语法错误或其中的确切长度不是这里的重点

*编辑——添加我实际使用的代码(在工作版本中,尝试了两个错误版本来清理代码并且两者都在错误

        strReq = "SELECT " & IIf(Len(rsRap.Fields("top")) > 0, " TOP " & rsRap.Fields("top"), "") & " " & rsRap.Fields("champs") & ", Sum([Canada]*[Quantité]) AS Montant, Sum(TblDetailCom.Quantité) AS Qty " & IIf(Len(rsRap.Fields("rep")) > 0, ", NickName", "")

        strReq = strReq & " FROM (SELECT * FROM TblRepresentant WHERE RefRep not In(13,15,26,27,28)) AS TblRepresentant INNER JOIN "
        strReq = strReq & " ((TblProduits LEFT JOIN TblTypBijoux ON TblProduits.Type = TblTypBijoux.IdTypBijoux) "
        strReq = strReq & " INNER JOIN (TblCouleur INNER JOIN ((TblClients INNER JOIN ((TblComm LEFT JOIN RqMaxIdTrait ON TblComm.ID = RqMaxIdTrait.IdCommande) "
        strReq = strReq & " LEFT JOIN TblTraitement ON RqMaxIdTrait.MaxOfIdTrait = TblTraitement.IdTrait) ON TblClients.ID = TblComm.RefClient) "
        strReq = strReq & " INNER JOIN TblDetailCom ON TblComm.ID = TblDetailCom.RefCom) ON TblCouleur.ID = TblDetailCom.RefCoul) "
        strReq = strReq & " ON TblProduits.IdMod = TblDetailCom.RefProd) ON TblRepresentant.RefRep = TblClients.RefRepre "

        strReq = strReq & " WHERE (TblClients.RefRepre <> 5 OR (TblClients.RefRepre=5 AND TblClients.ID In (1210,219,189,578))) "
        '(((TblProduits.Coll)=16) AND((TblComm.CoDatCom)>=#2011-01-01# And (TblComm.CoDatCom)<=#2014-01-01#) " 'Params Collection (16) DteDeb/fin
        'strReq = strReq & " AND "
        If Len(rsRap.Fields("type")) > 0 Then
         strReq = strReq & " AND TblProduits.[Type] = " & rsRap.Fields("type")
        End If

        If Len(txtDe) > 0 Then
           strReq = strReq & " AND TblTraitement.DtTrait >= #" & txtDe & "# "
        End If

        If Len(txtA) > 0 Then
           strReq = strReq & " AND TblTraitement.DtTrait <= #" & txtA & "# "
        End If


        If Len(rsRap.Fields("pays")) > 0 Then
           strReq = strReq & " AND TblClients.ClPaiePays = '" & rsRap.Fields("pays") & "' "
        End If
        If Len(rsRap.Fields("rep")) > 0 Then
           strReq = strReq & " AND TblClients.RefRepre = " & rsRap.Fields("rep")
        End If

        If Len(rsRap.Fields("col")) > 0 Then
         strReq = strReq & " AND TblProduits.Coll=" & rsRap.Fields("col")
        End If



        If Len(rsRap.Fields("group")) > 0 Then
            strReq = strReq & " GROUP BY " & rsRap.Fields("group") & IIf(Len(rsRap.Fields("rep")) > 0, ", NickName", "")
        End If

        strReq = strReq & " HAVING Sum([Canada]*[Quantité]) >= 0 "

        If Len(rsRap.Fields("order")) > 0 Then
            strReq = strReq & " ORDER BY " & rsRap.Fields("order")
        End If
4

2 回答 2

2

您似乎接受了 VBA 字符串可以包含超过 255 个字符的事实。例如,此代码创建一个 264 字符的字符串。

Const cstrSegment As String = "0123456789" & vbCrLf
Dim MyBigString As String
Dim i As Long
For i = 1 To 22
    MyBigString = MyBigString & cstrSegment
Next
Debug.Print "Len(MyBigString): " & Len(MyBigString)

相反,根据您用于连接字符串的方法,您会遇到麻烦。我不知道问题到底出在哪里,但我可以告诉你,在添加到字符串时可以使用的续行数是有限制的。例如下面的代码编译并运行没有错误。但是,如果我再添加一个续行符 ( & cstrSegment _),编译器会抱怨 " Too many line continuations"

MyBigString = MyBigString & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment _
    & cstrSegment

如果这描述了您看到的问题,则限制基于行继续,而不是字符串长度。如果需要,您可以通过分多个步骤构建字符串来解决该限制。"MyBigString = MyBigString & cstrSegment _"一直到行延续的限制,然后添加到另一个MyBigString"MyBigString = MyBigString & cstrSegment _"

确保您没有被看到的字符数量所误导。也许情况是您只看到前 255 个字符,但字符串实际上包含更多字符。这是有道理的,因为您报告说您没有收到错误,构建字符串显然失败了。

确认字符串的实际长度Len()

Debug.Print "Len(MyBigString): " & Len(MyBigString)

您还可以将字符串的内容打印到即时窗口以查看它包含的内容:

Debug.Print MyBigString

您可以使用Ctrl+g打开立即窗口。

于 2013-07-29T15:27:02.380 回答
0

为 SQL 连接字符串时,vbCrLf当行可能变长时添加一个字符。Access 似乎无法提取大于约 1000 个字符的 VBA 字符串(作为 SQL 执行)。例如

strSQL = strSQL & "SELECT some fields " & vbcrlf & "FROM some table "
于 2019-01-09T02:00:45.980 回答