1

access-vba の文字列に関して、いくつかの問題がありました。

問題は、アクセス (場合によっては) 文字列の長さを約 255 文字に制限することです。

ただし、文字列の作成方法によっては、255 文字を超える可能性があります。

WORKINGコードの例があります:

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]

文字列を連結できる方法とできない方法を近似的に知っていることは知っていますが、文字列がアクセス 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)

むしろ、文字列を連結するために使用する方法に基づいて問題が発生しています。その問題がどこにあるのか正確にはわかりませんが、文字列に追加するときに使用できる行継続の数には制限があることはわかります。たとえば、次のコードはエラーなしでコンパイルおよび実行されます。ただし、行の継続 () をもう 1 つ追加する& cstrSegment _と、コンパイラは「行の継続が多すぎます」と文句を言います。

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 に答える