その他

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

スポンサーリンク

イミディエイトは何か確認したいことがあった時、すぐに確かめることができるウィンドウです。イミディエイトを使用したい際は、VBEの表示メニューの中の「イミディエイトウィンドウ」をクリック、またはショートカットキー「Ctrl + G」で表示することができます。

私はVBAでプログラムのコーディングをする時やデバックをする時などに、イミディエイトをよく使います。

特に、SQLの組み立てをする時は、次の2つの作業をみなさんも行うと思います。

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

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

でも、この作業の過程でエラーになったことはありませんか。

長いSQLの場合、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ではエラーになりません。

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

実際に試してみたところ、半角文字で最大1023文字のようです。

エラーの発生条件&対策方法

以上のことから、エラーの発生条件や対策方法について、私なりに考えて結論をまとめてみました。

発生条件

  • イミディエイトに出力された文字列が、1行あたりの最大文字数である半角1023文字を超える場合
  • イミディエイトに出力された文字列が複数行である場合

対策方法

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

まとめ

イミディエイトはコーディングをする時やデバックをする時以外にも、インターネットや書籍で得た関数・変数値・計算処理などが自分のプログラミングでも応用できるのかを確認したい時など、プログラミングを行っていると様々な場面で活用できる便利な機能なので、使いこなせるとVBAを用いた開発の効率が上がります。

今回ご紹介したようなよくあるエラーも、原因と対策方法をしっかりと心得ておけば何も問題ありません。今度またエラーが起きた際には、是非この記事を思い出して対策をとってみて下さい。

雑記

秋も徐々に深まり、あちらこちらで栗やさつまいも、ブドウなど季節の味覚を使ったスイーツを見かけるようになりましたね。

私はモンブランがケーキの中でも特に大好きなのですが、最近ではチョコレートやイチゴ、さつまいもやかぼちゃなど、栗ではない様々な材料で作られたモンブランが売られていて驚きました。はじめこそ「栗を使っていないなんて、こんなのモンブランじゃない!」と思ったものの、食べてみるとやはりどれも美味しいんです。

そこで調べてみたところ、モンブランという名称はその形状から、アルプス山脈にあるフランスとイタリアの最高峰・モンブランが由来で、栗は関係していなかったのです。

「知る」って財産ですよね。

これからも日常の些細な疑問をそのままにせず、きちんと調べ、その都度新たな知識を身につけていきたいと思います。

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

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

スポンサーリンク

-その他