Excel VBA

マクロの入力に関するルールと基本用語

マクロを管理したり、改良したりするときのために、「わかりやすいマクロ」を作成することが大切です。ここでは、そのためのルールを、基本用語とともに紹介していきます。

コード

VBAで記述された命令や記述全体のことを「コード」と呼びます。1行の文、マクロ全体、行の中の一部分のいずれもコードと呼ばれます。

※「マクロ」とは、Excelに組み込んだ処理のまとまりのことで、内部的には「プロシージャ」と呼ばれる単位で構成されています。通常は Sub マクロ名()End Sub の間にコードを書きます。

補足:VBAのプロシージャにはいくつか種類があります。もっともよく使うのは「Sub プロシージャ」で、これを一般的に「マクロ」と呼びます。このほか、値を計算して返す「Function プロシージャ」、Excel のオブジェクトの性質を操作する「Property プロシージャ」などもありますが、初心者のうちはまず Sub プロシージャ を使いこなすことを目標にしましょう。

コメント

自分で作成したマクロでも、時間が経つとコードの意味や意図を忘れがちです。後日編集するときのために、また、複数人で作業している場合のメンバーに引き継ぐ時のために、マクロにメモや覚書を残しておきましょう。「コメント」という機能を使うと、マクロの中に自由に書きたいことを書けます

コメントを入れるには、'」(シングルクォーテーション)に続けてコメントの内容を入力します。「'」から行末までがコメントとみなされます。標準設定では緑色で表示されます(※色は環境設定で変更可能です)。

1行まるごとコメントにすることも、コードの末尾にコメントを入れることもできます。

コメントの入力例(緑色で表示される)

インデントと空白行

Sub マクロ名() から End Sub の間のコードは、通常字下げして入力します。この字下げのことを「インデント」と呼びます。インデントを付けることでマクロの始まりと終わりがわかりやすくなります

行頭で Tab キーを押すとインデントが設定されます。既定では半角スペース4つ分に相当しますが、環境設定によって幅を変更できます。解除する場合は Backspace キーを押します。

また、マクロの中に空白行を入れても構いません。処理のまとまりごとに空白行を入れると、コードが読みやすくなります。

インデントと空白行の例

実務で使えるインデントのルール

インデントは「見た目」ではなく、コードの意味を読み取りやすくする大事な約束事です。次の最低限を守るだけで、将来の自分や他の人が読んだときにグッと理解しやすくなります。

ネストの階層ごとにインデントを必ず付ける

If文やFor文などの入れ子構造(ネスト)は、外側よりも内側をさらに1段下げて書きます。

これにより、「どの処理がどこまで続いているか」が一目で分かるようになります。

VBA

If 条件 Then
    For i = 1 To 10
        ' この部分は2段階インデント
        Cells(i, 1).Value = i
    Next i
End If
インデントは「スペース」か「タブ」で統一する

環境によっては、タブとスペースが混ざると見た目がずれてしまいます。

VBE の既定タブ幅は 4(スペース相当)です。Tab とスペースの混在はズレの原因になるため、プロジェクト内でどちらかに統一しましょう。

※補足:[ツール]→[オプション]→[エディタ]でタブ幅と自動インデントを調整できる。

1画面で見やすい「縦の揃え方」を意識する

代入やWith句の中のプロパティなどは縦に揃えると読みやすくなります。

VBA

With Range("A1")
    .Value     = "テスト"
    .Font.Size = 12
    .Font.Bold = True
End With

縦揃えは読みやすくなりますが、将来の編集でズレやすい点に注意し、やり過ぎない範囲で使いましょう。

空白行は「処理のかたまり」を分ける目印にする

空白行を多用しすぎると逆に見づらくなるので、「初期化処理」「計算処理」「結果出力」など、論理的なかたまりごとに1行空けるとベストです。

長い条件式や代入文は「継続行」とインデントを組み合わせる

行継続文字(_)を使う場合、2行目以降にインデントを入れると、「続きの式」であることが直感的に分かるようになります。

VBA

If (条件1 = True And 条件2 = True) _
    Or (条件3 = True And 条件4 = True) Then
    MsgBox "条件を満たしました"
End If
インデントは「未来の自分や他人へのメッセージ」

コードを読む時間は、書く時間よりもはるかに長いです。インデントを整えることは、「読み手に優しいマクロ」を作るための最低限のマナーです。

コードの改行

コードが長くなると読みにくくなります。長いコードは適宜改行しましょう。また、意味の切れ目で改行すると、コードの意味がわかりやすくなるメリットもあります。ただし、勝手な位置で改行してしまうとエラーになります。

コードを複数行に分けるときは、半角スペースの直後にアンダースコア(_)を置いてから改行します(スペース + _ は必須)。この「_」を「行継続文字」と呼びます(行継続の書式は スペース + _ + 改行 です)。

※アンダースコアの入力方法は、日本語キーボードの場合 Shift + キーです。英語配列キーボードでは位置が異なるため、キートップを確認してください。

なお、行継続文字は、文字列の途中に入れられません。コードに含まれる「=」「.」「,」「()」などの記号の前後の区切りの良い位置に入れましょう。その際、2行目以降の行にインデントを付けると、ひと続きのコードであることがわかりやすくなります。

行継続行とコメントの注意

行継続文字(_)を置いた行の末尾には、空白(スペースやタブ)以外の文字を置けません。そのため、同じ行の _ の後ろにコメント(')を書くことはできません。コメントを付けたい場合は、次の行に書くか、継続前の行に書きましょう。

NG(コンパイルエラー)

VBA

If 条件1 And _ ' ← この行(_の後ろ)にコメントは置けない
    条件2 Then
    MsgBox "OK"
End If

OK

VBA

' 継続前の説明コメント
If 条件1 And _
    条件2 Then  ' ← 継続「後」の行や最終行末尾にはコメントを書ける
    MsgBox "OK"
End If
行継続文字を使った改行の例

_ は式や文の継続を示す記号であり、リテラル文字列の継続には使えません。そのため長い文字列は一度閉じて & で結合します(行末で & のあとに スペース + _ を置いて改行します)。

VBA

MsgBox "これは長いメッセージの前半です。" & _
        "こちらが後半です。"