🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の行継続 — アンダースコア、そのルール、そして文字列の罠

|

Excel VBA の行継続 — アンダースコア、そのルール、そして文字列の罠

TL;DR — 行の末尾を スペースとアンダースコア _ で終えると、VBA は次の物理行を同じ文の一部として 扱います。パーサーはコンパイル前に _ を消して行をつなぐので、変わるのは ソースの読み方 だけ — 実行される中身は決して変わりません。3 つのルールが誰もをつまずかせます。_ の前のスペースは必須、その あとには何も(コメントすら)続けてはいけない、そして "string" の中では 区切れません — クォートを 閉じ、& _ を足して、続けます。

' 1 つの論理的な文を、読みやすい 3 行に広げる
Workbooks.Open Filename:="C:\Reports\Q3.xlsx", _
               ReadOnly:=True, _
               UpdateLinks:=False

' 長い文字列: クォートを閉じ、& _ でつなぎ、続ける
MsgBox "The report finished at " & _
       Format(Now, "hh:mm") & " with no errors."

この記事で学べること

  • 考え方の軸 — コンパイル前にパーサーが消す、ソースのトークン
  • ソースだけに効く 3 つのトークンと、その中で継続が占める位置
  • 必須のスペースと、アンダースコアのあとに何も続けられない理由
  • 文字列の罠 — クォートの中で区切れない理由
  • コメントが静かに継続を殺す理由
  • アンダースコアとコロン — 1 つの文を分けるか、多くをつなぐか
  • 意見:継続は人間のためのもの、だから人間のように使う

考え方の軸:パーサーが消し去るトークン

VBA には行の長さ制限がありません — 文は 500 文字の長さでも、完璧に走ります。だから行継続文字が存在する 理由はただ 1 つ — あなた のためです。行の末尾のスペースに続くアンダースコア _ は、パーサーにこう 告げます。「この文はまだ終わっていない。次の物理行がその続きだ」。コンパイラがあなたのコードを見る前に、 パーサーは _取り除き、行同士を貼り合わせ、1 つの論理的な文としてコンパイルします。

これが考え方の軸のすべてで、以下のすべてのルールを説明します。_ はコンパイル前に消費される ソースレイアウト のトークンなので、パーサーが文の休止を予期する場所に座らなければなりません — 自然な 区切りで、前にスペースを置き、あとには本当に何も置かずに。これは読み手のための句読点であって、機械への 指示ではありません。

マクロが決して実行しない 3 つのトークン

行継続は、走っているマクロが決して実行しない、あなたが打ち込む 3 つのものの 1 つです。これらは実行では なく ソースコンパイル を形づくります。

トークン ソースに対して何をするか 実行時のコスト
' コメント メモを残し、コンパイラが削除するコードを無効化する なし — 決して実行されない
_ 行継続 1 つの長い文を複数行に分割する なし — コンパイル前にパーサーが消し去る
Option Explicit すべての名前に宣言を強制する コンパイル 時に走るので、タイプミスはマクロが始まる前に死ぬ

コメントと継続は、どちらもコンパイル前に 消される — 純粋なソースの整形です。この共通の性質こそ、両者が 衝突する理由でもあります。下のコメントの罠が示すとおりです。

ルール 1:アンダースコアの前にスペース、あとには何もなし

継続は決まった順序の 2 文字です — スペース、それからアンダースコア — そして行の 最後 のもので なければなりません。

' 正しい例 — _ の前にスペース、そして行を終える
total = price + _
        tax

' 誤った例 — アンダースコアの前にスペースがない
total = price +_
        tax                ' Compile error / unexpected token

' 誤った例 — アンダースコアのあとに何かがある(コメントでも)
total = price + _ ' 税を足す
        tax                ' Expected: end of statement

スペースを抜かすと +_ は 1 つのトークンとして読まれます。_ のあとに何かを置くと — 余分なスペースは かまいませんが、コメントやコードはだめ — VBA は Expected: end of statement を報告します。直し方は 機械的です。 _ は行の一番端に置き、説明はその上の専用行に書きます。

ルール 2:文字列の中では区切れない

人をここへ送り込む罠がこれです。クォートで囲まれた文字列の のアンダースコアは、ただのリテラルの アンダースコア — 継続ではなく、テキストです。だから、_ を途中に落として長い文字列を折り返すことは できません。

' 壊れている例 — _ はクォートの中では単なるリテラルの文字
MsgBox "This is a very long message _
        that keeps going"       ' 文字列が閉じない -> compile error

' 正しい例 — クォートを閉じ、& _ で連結し、次の行で続ける
MsgBox "This is a very long message " & _
       "that keeps going"

長い文字列を分けるには、クォートを 閉じ & _(連結して、それから続ける)を足し、次の行で新しい クォートを開きます。最初のクォートの中の末尾スペースに注意 — "message " & は、行の区切りが本来 隠してしまうスペースを保ちます。この 1 つのパターン — " ... " & _ — が、本物の継続の使い道の 9 割を カバーします。折り返しが最も要るのは長い文字列(メッセージ、SQL、パス)だからです。

ルール 3:コメントが継続を殺す

コメントと継続はどちらもソースだけのトークンなので、同じ行を共有できません。アポストロフィが 論理的な 文を終わらせるので、' のあとに来る _ はコメントの中にあり、何もしません。

' 壊れている例 — コメントが継続を飲み込む
total = price _  ' 基本価格
      + tax       ' "+ tax" はいまや独立した壊れた文

' 正しい例 — コメントは文の上の、専用の行に
' 基本価格に税を足す
total = price _
      + tax

症状は同じ Expected: end of statement が次の行に出て、間違った場所を指します。ルールは、一度ぶつかれば 単純です。継続された行には決してコメントを置かない — 専用の行へ持ち上げます。(コメントのガイド が、この衝突を反対側から扱っています。)

アンダースコアとコロン:正反対の道具

_1 つ の文を 複数 の行に分けます。コロン : はその正反対をします — 複数 の文を 1 つ の行につなぎます。

' コロン: 3 つの文を 1 つの物理行に詰め込む
x = 1 : y = 2 : z = 3

' アンダースコア: 1 つの文を 3 行にゆったり広げる
result = Application.WorksheetFunction.SumIfs( _
             data, keys, criteria)

どちらも行の境界にかかわるので絶えず混同されますが、両者は逆の方向へ引きます。長い文を 読みやすく するには _ に手を伸ばしましょう。: は控えめに — 文を 1 行に詰め込むと、ブレークポイントからも、 コードを読む誰からもそれらを隠してしまうので、多くてもささいなペアにとどめます。一方の道具は読み手に 仕え、もう一方はたいてい誰にも仕えません。

意見:継続は人間のためのもの、だから人間のように使う

_ がその居場所を稼ぐのは、まさに人間が 1 画面で読むのに苦労する行です — 6 つの名前付き引数を持つ Workbooks.Open、4 つの And 節を持つ If 条件、十数個の範囲を持つ SumIfs、断片から組み立てた SQL や 接続文字列。それらを自然な継ぎ目で区切ると — カンマのあと、演算子の前、それぞれの And の前で — 文の 構造が見えてきます。

しかし継続は読みやすさの道具であって、それ自体が美徳ではありません。短い行を理由もなく折り返したり、 1 つの文を 15 回も継続したりすることは、ある種の読みにくさを別の種類に取り替えるだけです(VBA は 1 つの 文をおよそ 2 ダースの継続で頭打ちにさえします)。テストは正直で単純です。その区切りは、人が読むのに文を より易しく しますか? するなら使う。しないなら、行はそのままにしておく。機械はどちらでも気にしません でした。

長い行が問題ではなく、症状であるとき

ときに、文が長いのはタスクが本当に複雑だからです — 入れ子の WorksheetFunction 呼び出し、広がりすぎた 条件、コードの中で組み立てる数式。行継続はそれを 読みやすく しますが、単純に はしません。8 行に 分けた 200 文字の文は、それでも正しく書くのが難しいままです。ExcelMaster なら、文を手で組み立てる代わりに結果を述べるだけ — 「地域が West で日付が Q3 の売上を合計して」 — すれば、まずファイルをバックアップしたうえで、コードを書いて実行します。長い行はもうあなたの問題では なくなります。二度と自分で打つ必要がないからです。

よくある質問

VBA の行継続文字とは何ですか?

行の末尾の、スペースに続くアンダースコア _ です。文が次の物理行に続くことを VBA に告げます。パーサーは コンパイル前にアンダースコアを取り除いて行を 1 つの文につなぐので、変わるのはソースの並び方だけです。

VBA の行継続が効かないのはなぜですか?

たいてい 3 つの理由のどれかです。アンダースコアの前にスペースがない、アンダースコアのあとに何か (多くはコメント)が続いている、あるいはクォートで囲まれた文字列の中で区切ろうとした。_ は行の最後の 文字でなければならず、その前にスペースが要ります。文字列はクォートの途中で区切るのではなく、 " ... " & _ で分けます。

VBA で長い文字列を複数行に続けるには?

文字列をクォートで閉じ、スペース、アンパサンド、そして継続 — & _ — を足し、次の行で新しいクォートを 開きます:"first part " & _ それから "second part"。アンダースコアをクォートの中に置くことはできません。 そこでは単なるリテラルのアンダースコアだからです。

VBA で継続された行にコメントを置けますか?

いいえ。アポストロフィが論理的な文を終わらせるので、コメントのあとの _ は何もせず、次の行が壊れます。 代わりに、コメントは継続された文の上の専用行に置きましょう。

VBA のアンダースコアとコロンの違いは何ですか?

アンダースコア _ は、読みやすさのために 1 つの文を複数行に分けます。コロン : はその逆 — 複数の文を 1 つの物理行につなぎます。長い文を読みやすくするには _ を使い、: はささいなペアを除いて避けましょう。 ブレークポイントからも読み手からも文を隠すからです。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-06.

関連ガイド: VBA Comment · VBA Option Explicit · VBA MsgBox · VBA If Then Else · VBA Dim