その他

VBAイミディエイト出力文字について。例:SQLが動かない場合の対処法[No62]

投稿日:2020年10月6日 更新日:

スポンサーリンク

VBAでプログラムのコーディングをする時、イミディエイトを良く使います。また、デバックをするときも。

特に、SQLの組み立てをするとき、次のことをあなたも行うと思います。

1.SQL文の文字列をイミディエイトに出力

2.そのSQLをコピペしてA5SQLやMMSMで実行する。

でも、その時、エラーになることがありませんか。長いSQLの場合、SQLの中間に予期せぬ半角スペースが入ってしまうことが原因として考えられます。

今回はそのエラーが何故発生するかの紹介と、対策についてお伝えします。

プログラム

このようなプログラムがあったとします。


Option Explicit

Public Sub TestSub()
    Dim sSQL_A As String
    
    sSQL_A = "VAR0001,VAR0002,VAR0003,VAR0004,VAR0005,VAR0006,VAR0007,VAR0008,VAR0009,VAR0010"
    sSQL_A = sSQL_A & "VAR0011,VAR0012,VAR0013,VAR0014,VAR0015,VAR0016,VAR0017,VAR0018,VAR0019,VAR0020,"
    sSQL_A = sSQL_A & "VAR0021,VAR0022,VAR0023,VAR0024,VAR0025,VAR0026,VAR0027,VAR0028,VAR0029,VAR0030,"
    sSQL_A = sSQL_A & "VAR0031,VAR0032,VAR0033,VAR0034,VAR0035,VAR0036,VAR0037,VAR0038,VAR0039,VAR0040,"
    sSQL_A = sSQL_A & "VAR0041,VAR0042,VAR0043,VAR0044,VAR0045,VAR0046,VAR0047,VAR0048,VAR0049,VAR0050,"
    sSQL_A = sSQL_A & "VAR0051,VAR0052,VAR0053,VAR0054,VAR0055,VAR0056,VAR0057,VAR0058,VAR0059,VAR0060,"
    sSQL_A = sSQL_A & "VAR0061,VAR0062,VAR0063,VAR0064,VAR0065,VAR0066,VAR0067,VAR0068,VAR0069,VAR0070,"
    sSQL_A = sSQL_A & "VAR0071,VAR0072,VAR0073,VAR0074,VAR0075,VAR0076,VAR0077,VAR0078,VAR0079,VAR0080,"
    sSQL_A = sSQL_A & "VAR0081,VAR0082,VAR0083,VAR0084,VAR0085,VAR0086,VAR0087,VAR0088,VAR0089,VAR0090,"
    sSQL_A = sSQL_A & "VAR0091,VAR0092,VAR0093,VAR0094,VAR0095,VAR0096,VAR0097,VAR0098,VAR0099,VAR0100,"
    sSQL_A = sSQL_A & "VAR0101,VAR0102,VAR0103,VAR0104,VAR0105,VAR0106,VAR0107,VAR0108,VAR0109,VAR0110,"
    sSQL_A = sSQL_A & "VAR0111,VAR0112,VAR0113,VAR0114,VAR0115,VAR0116,VAR0117,VAR0118,VAR0119,VAR0120,"
    sSQL_A = sSQL_A & "VAR0121,VAR0122,VAR0123,VAR0124,VAR0125,VAR0126,VAR0127,VAR0128,VAR0129,VAR0130,"
    sSQL_A = sSQL_A & "VAR0131,VAR0132,VAR0133,VAR0134,VAR0135,VAR0136,VAR0137,VAR0138,VAR0139,VAR0140,"
    sSQL_A = sSQL_A & "VAR0141,VAR0142,VAR0143,VAR0144,VAR0145,VAR0146,VAR0147,VAR0148,VAR0149,VAR0150,"
    sSQL_A = sSQL_A & "VAR0151,VAR0152,VAR0153,VAR0154,VAR0155,VAR0156,VAR0157,VAR0158,VAR0159,VAR0160,"
    sSQL_A = sSQL_A & "VAR0161,VAR0162,VAR0163,VAR0164,VAR0165,VAR0166,VAR0167,VAR0168,VAR0169,VAR0170,"
    sSQL_A = sSQL_A & "VAR0171,VAR0172,VAR0173,VAR0174,VAR0175,VAR0176,VAR0177,VAR0178,VAR0179,VAR0180,"
    sSQL_A = sSQL_A & "VAR0181,VAR0182,VAR0183,VAR0184,VAR0185,VAR0186,VAR0187,VAR0188,VAR0189,VAR0190,"
    sSQL_A = sSQL_A & "VAR0191,VAR0192,VAR0193,VAR0194,VAR0195,VAR0196,VAR0197,VAR0198,VAR0199,VAR0200,"
    sSQL_A = sSQL_A & "VAR0201,VAR0202,VAR0203,VAR0204,VAR0205,VAR0206,VAR0207,VAR0208,VAR0209,VAR0210,"
    sSQL_A = sSQL_A & "VAR0211,VAR0212,VAR0213,VAR0214,VAR0215,VAR0216,VAR0217,VAR0218,VAR0219,VAR0220,"
    sSQL_A = sSQL_A & "VAR0221,VAR0222,VAR0223,VAR0224,VAR0225,VAR0226,VAR0227,VAR0228,VAR0229,VAR0230,"
    sSQL_A = sSQL_A & "VAR0231,VAR0232,VAR0233,VAR0234,VAR0235,VAR0236,VAR0237,VAR0238,VAR0239,VAR0240,"
    sSQL_A = sSQL_A & "VAR0241,VAR0242,VAR0243,VAR0244,VAR0245,VAR0246,VAR0247,VAR0248,VAR0249,VAR0250,"
    sSQL_A = sSQL_A & "VAR0251,VAR0252,VAR0253,VAR0254,VAR0255,VAR0256,VAR0257,VAR0258,VAR0259,VAR0260,"
    sSQL_A = sSQL_A & "VAR0261,VAR0262,VAR0263,VAR0264,VAR0265,VAR0266,VAR0267,VAR0268,VAR0269,VAR0270,"
    sSQL_A = sSQL_A & "VAR0271,VAR0272,VAR0273,VAR0274,VAR0275,VAR0276,VAR0277,VAR0278,VAR0279,VAR0280,"
    sSQL_A = sSQL_A & "VAR0281,VAR0282,VAR0283,VAR0284,VAR0285,VAR0286,VAR0287,VAR0288,VAR0289,VAR0290,"
    sSQL_A = sSQL_A & "VAR0291,VAR0292,VAR0293,VAR0294,VAR0295,VAR0296,VAR0297,VAR0298,VAR0299,VAR0300,"
    sSQL_A = sSQL_A & "VAR0301,VAR0302,VAR0303,VAR0304,VAR0305,VAR0306,VAR0307,VAR0308,VAR0309,VAR0310,"
    sSQL_A = sSQL_A & "VAR0311,VAR0312,VAR0313,VAR0314,VAR0315,VAR0316,VAR0317,VAR0318,VAR0319,VAR0320,"
    sSQL_A = sSQL_A & "VAR0321,VAR0322,VAR0323,VAR0324,VAR0325,VAR0326,VAR0327,VAR0328,VAR0329,VAR0330,"
    sSQL_A = sSQL_A & "VAR0331,VAR0332,VAR0333,VAR0334,VAR0335,VAR0336,VAR0337,VAR0338,VAR0339,VAR0340,"
    sSQL_A = sSQL_A & "VAR0341,VAR0342,VAR0343,VAR0344,VAR0345,VAR0346,VAR0347,VAR0348,VAR0349,VAR0350,"
    sSQL_A = sSQL_A & "VAR0351,VAR0352,VAR0353,VAR0354,VAR0355,VAR0356,VAR0357,VAR0358,VAR0359,VAR0360,"
    sSQL_A = sSQL_A & "VAR0361,VAR0362,VAR0363,VAR0364,VAR0365,VAR0366,VAR0367,VAR0368,VAR0369,VAR0370,"
    sSQL_A = sSQL_A & "VAR0371,VAR0372,VAR0373,VAR0374,VAR0375,VAR0376,VAR0377,VAR0378,VAR0379,VAR0380,"
    sSQL_A = sSQL_A & "VAR0381,VAR0382,VAR0383,VAR0384,VAR0385,VAR0386,VAR0387,VAR0388,VAR0389,VAR0390,"
    sSQL_A = sSQL_A & "VAR0391,VAR0392,VAR0393,VAR0394,VAR0395,VAR0396,VAR0397,VAR0398,VAR0399,VAR0400,"
    sSQL_A = sSQL_A & "VAR0401,VAR0402,VAR0403,VAR0404,VAR0405,VAR0406,VAR0407,VAR0408,VAR0409,VAR0410,"
    sSQL_A = sSQL_A & "VAR0411,VAR0412,VAR0413,VAR0414,VAR0415,VAR0416,VAR0417,VAR0418,VAR0419,VAR0420,"
    sSQL_A = sSQL_A & "VAR0421,VAR0422,VAR0423,VAR0424,VAR0425,VAR0426,VAR0427,VAR0428,VAR0429,VAR0430,"
    sSQL_A = sSQL_A & "VAR0431,VAR0432,VAR0433,VAR0434,VAR0435,VAR0436,VAR0437,VAR0438,VAR0439,VAR0440,"
    sSQL_A = sSQL_A & "VAR0441,VAR0442,VAR0443,VAR0444,VAR0445,VAR0446,VAR0447,VAR0448,VAR0449,VAR0450,"
    sSQL_A = sSQL_A & "VAR0451,VAR0452,VAR0453,VAR0454,VAR0455,VAR0456,VAR0457,VAR0458,VAR0459,VAR0460,"
    sSQL_A = sSQL_A & "VAR0461,VAR0462,VAR0463,VAR0464,VAR0465,VAR0466,VAR0467,VAR0468,VAR0469,VAR0470,"
    sSQL_A = sSQL_A & "VAR0471,VAR0472,VAR0473,VAR0474,VAR0475,VAR0476,VAR0477,VAR0478,VAR0479,VAR0480,"
    sSQL_A = sSQL_A & "VAR0481,VAR0482,VAR0483,VAR0484,VAR0485,VAR0486,VAR0487,VAR0488,VAR0489,VAR0490,"
    sSQL_A = sSQL_A & "VAR0491,VAR0492,VAR0493,VAR0494,VAR0495,VAR0496,VAR0497,VAR0498,VAR0499,VAR0500 "
    sSQL_A = sSQL_A & "From table "
    
    Dim sSQL_B As String
    sSQL_B = sSQL_A
    
End Sub

ブレイクポイントを設定して、イミディエイトでsSQL_Aの値を出力すると次のようになります。

イミディエイトの出力SQLをコピペしてサクラエディタに貼り付けてみます。

「設定」→「折り返し方法」→「右端で折り返す」を選択します。

正規表現で「\r\n」を検索します。

スポンサーリンク

この状態のSQLを実行すると予期せぬ空白があるのでエラーになります。「VAR0384」とするところが「VAR038 4」となるため。

「置換」を押します。正規表現を使わなくても改行を消しても良いです。このSQLではエラーになりません。

イミディエイトの一行あたりの最大文字数

半角文字で最大1023文字のようです。

まとめ&対策

  • イミディエイトに出力された文字列が半角1023文字を超える場合
  • イミディエイトに出力された文字列が複数行の時

文字列の折り返し地点を探して、改行を削除し1行にしましょう。

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

タグ

-その他

© 2021 BookALittle