VBAコードは「読まれる」前提で書く | 変数名・コメント・インデント・Sub分割の実践ガイド

VBAコードは「数ヶ月後の自分」や「引き継ぎを受けた後任者」が読むことを前提に書くべきです。変数名・コメント・インデント・Sub分割の4つを意識するだけで、同じ処理でも読みやすさが大きく変わります。

この記事では、次の内容を順番に解説します。

  • 読みにくいコードと読みやすいコードのBefore/After
  • 意味の伝わる変数名のつけ方
  • 効果的なコメントの書き方
  • インデントと構造の整え方
  • Sub分割で処理をシンプルに保つ方法

読みにくいコードと読みやすいコードの違い

まず同じ処理を「読みにくい書き方」と「読みやすい書き方」で比べてみます。

Before(読みにくい):

For i = 2 To 100
    If Cells(i, 3).Value = "未" Then
        Cells(i, 5).Value = "対応中"
    End If
Next i

何行目まで処理するか・3列目が何の列か・5列目が何の列か、コードを読んだだけでは判断できません。

After(読みやすい):

Sub UpdateStatus()
    Dim lastRow    As Long
    Dim i          As Long
    Const STATUS_COL As Long = 3  ' ステータス列(C列)
    Const RESULT_COL As Long = 5  ' 処理結果列(E列)

    ' 最終行を動的に取得
    lastRow = Cells(Rows.Count, STATUS_COL).End(xlUp).Row

    For i = 2 To lastRow
        ' ステータスが「未」の行だけ処理する
        If Cells(i, STATUS_COL).Value = "未" Then
            Cells(i, RESULT_COL).Value = "対応中"
        End If
    Next i
End Sub

変数名・定数・コメントを加えることで「何をしている処理か」が一目でわかるようになります。

意味の伝わる変数名をつけるには?

変数名は「何が入っているか」が名前から読み取れることが理想です。

避けるべき変数名改善後の変数名理由
irowIndex または i(ループ変数は慣例でOK)ループ変数の i は許容範囲
xasalesAmounttargetSheet何が入っているか全くわからない
datacustomerNameinvoiceDate「データ」では何のデータかわからない
flagisProcessedhasErrorTrue/Falseのフラグはisやhasから始めると意図が明確
wswsDatawsSummary複数シートを扱う場合はどのシートか明示する
' 変数名の改善例
' Before
Dim ws As Worksheet
Dim n  As Long
Set ws = Sheets("Sheet1")
n = ws.Cells(Rows.Count, 1).End(xlUp).Row

' After
Dim wsData  As Worksheet
Dim lastRow As Long
Set wsData  = Sheets("データ")
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row

効果的なコメントの書き方

コメントは「すべての行に書く」より「読む人がつまずくポイントに書く」方が効果的です。

コメントが必要な場面:

  • 処理の目的・全体の流れを説明する冒頭コメント
  • パッと見てわかりにくい条件式の意味
  • マジックナンバー(直接書いた数値)の意味
  • 例外処理・特殊なケースへの対応
  • 後で修正する可能性があるTODO
'==================================
' Sub名  :ExportReport
' 処理内容:月次レポートをPDFで出力する
' 引数    :なし
' 更新日  :2025/06/01
'==================================
Sub ExportReport()
    Dim ws      As Worksheet
    Dim pdfPath As String

    Set ws = ThisWorkbook.Sheets("レポート")

    ' 出力先パス(マクロファイルと同じフォルダに保存)
    pdfPath = ThisWorkbook.Path & "\report_" & Format(Date, "yyyymmdd") & ".pdf"

    ' 印刷範囲を設定してPDF出力
    ws.PageSetup.PrintArea = "A1:H50"
    ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath

    MsgBox "PDF出力が完了しました。" & vbCrLf & pdfPath
End Sub

コメントを書く必要がない場面:コード自体で意図が明確な場合は書かない方がすっきりします。

' 不要なコメントの例
Cells(1, 1).Value = "売上"  ' A1セルに「売上」と入力する ← コードを読めばわかるので不要

インデントと構造を整えるには?

インデントが崩れたコードは、構造が見えにくくなります。VBEでは Tab でインデント追加、ShiftTab で解除できます。

インデントが崩れた例(読みにくい):

For i = 2 To lastRow
If Cells(i, 1).Value <> "" Then
If Cells(i, 2).Value = "完了" Then
Cells(i, 3).Value = "済"
End If
End If
Next i

インデントが整った例(読みやすい):

For i = 2 To lastRow
    If Cells(i, 1).Value <> "" Then
        If Cells(i, 2).Value = "完了" Then
            Cells(i, 3).Value = "済"
        End If
    End If
Next i

また、処理のかたまりの間に空行を入れると、セクションが見えやすくなります。

Sub分割で処理をシンプルに保つには?

1つのSubが長くなると読みにくくなります。処理の役割ごとにSubを分けて Call で呼び出すと、各Subがシンプルに保たれます。

' 分割前(1つのSubに全部書いている)
Sub ProcessAll()
    ' ① 準備処理(20行)
    ' ② データチェック(30行)
    ' ③ 集計処理(40行)
    ' ④ 出力処理(25行)
End Sub

' 分割後(役割ごとに分けて呼び出す)
Sub ProcessAll()
    Call PrepareProcess    ' ① 準備
    Call CheckData         ' ② チェック
    Call CalcSummary       ' ③ 集計
    Call ExportResult      ' ④ 出力
    MsgBox "処理が完了しました。"
End Sub

Sub PrepareProcess()
    ' 準備処理の中身
End Sub

Sub CheckData()
    ' チェック処理の中身
End Sub

このようにすると「ProcessAllを読めば全体の流れがわかる」構造になり、詳細は各Subを見れば確認できます。

まとめ

  • 読まれる前提で書く:数ヶ月後の自分・チームメンバー・引き継ぎ者が読むことを意識する。
  • 変数名:「何が入っているか」が名前から読み取れるようにする。
  • コメント:全行に書かず「読む人がつまずくポイント」と「処理の目的」に絞る。
  • インデント:構造を見やすくするために必ずそろえる。処理のかたまりの間に空行を入れる。
  • Sub分割:1つのSubが長くなったら役割ごとに分けてCallで呼び出す。

よくある質問

コメントはどのくらいの量が適切ですか?

目安は「コードの行数の20〜30%程度」ですが、量より質が大切です。「このコードを初めて見る人が迷いそうな箇所」にコメントを入れる意識が最も効果的です。全行にコメントを書くと、逆にコードが読みにくくなることがあります。

英語の変数名と日本語のコメントはどちらがいいですか?

変数名は英語、コメントは日本語が一般的で実務的です。変数名を日本語にすることも技術的には可能ですが、全角文字の入力ミスやVBAエディタでの表示の問題が起きやすいため、英語(または英語+数字)が推奨されます。

Sub分割するとき、共通処理と個別処理の分け方がわかりません。

「複数のSubから同じコードが出てくる」か「1つのSubの中で処理の性格が変わる」かが分け時のサインです。例えば「処理前の準備(ScreenUpdating停止など)」は必ず共通処理として独立させ、「チェック」「集計」「出力」のように処理の役割で分けるのが基本です。

コードを整理する時間が取れません。動けばいいという考えではダメですか?

1回限りで使い捨てのマクロであれば「動けばOK」で問題ありません。ただし「定期的に使う」「他人も触る」「6ヶ月後に自分が修正する」マクロであれば、整理に投資した時間は後で必ず回収できます。最低限「変数名を意味のあるものにする」だけでも大きく変わります。

コードレビューをしてもらえる環境がありません。どうやって品質を上げればいいですか?

「1週間後の自分がこのコードを読んで意味がわかるか?」と自問しながらコードを書く習慣をつけましょう。書いた直後は「当然わかる」と思えても、時間が経つと意外と読めなくなります。書き終わったら一度VBEを閉じて、翌日改めてコードを開いて読んでみるのも効果的です。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール