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
