「数ヶ月前に自分で書いたVBAコードなのに、何をしているのかわからない」「引き継ぎを受けたマクロの処理が全く追えない」——こうした問題はVBAのコメントを適切に活用することで大幅に防げます。
コメントはコードそのものには影響を与えず、人間が読むための説明を記録するための重要な機能です。この記事では、VBAコメントの基本的な書き方から応用テクニック・チーム開発での活用・注意点まで体系的に解説します。
VBAのコメントとは

コメントの基本概念
VBAのコメントとは、コード中にプログラムの動作には影響しない説明文・メモを記述するための機能です。Excelなどのアプリケーションがマクロを実行する際、コメント行は完全に無視されます。
VBAエディター(VBE)ではコメント行が緑色で表示されるため、コードと視覚的に区別できます。
' これはコメントです(実行されません)
MsgBox "Hello, World!" ' これも行末コメントです
コードに注釈を追加する目的
VBAコメントを記述する主な目的は以下の通りです。
- 処理の説明: このコードが何をしているかを日本語で説明する
- 設計意図の記録: なぜこの方法で実装したかを残す
- 変数・引数の補足: 変数名だけでは伝わらない意味を補足する
- デバッグの補助: 問題のある行を一時的に無効化する(コメントアウト)
- TODO・注意点の記録: 後で対応が必要な箇所を目印としてマークする
可読性・保守性の向上
コメントが整備されたコードとそうでないコードでは、後から読む際の理解速度が大きく変わります。
| コメントあり | コメントなし |
|---|---|
| 処理の目的がすぐわかる | コードを一行ずつ追わないと意図が不明 |
| 引き継ぎ・チーム共有が容易 | 他の人が理解するまでに時間がかかる |
| 数ヶ月後でも自分で読み返せる | 作成者本人でも読み返しが困難 |
| 修正箇所の特定が速い | どこを直せばいいかの判断に時間がかかる |
コメントの書き方

シングルラインコメントの書き方
アポストロフィー(’)を使ったコメント
VBAのコメントはアポストロフィー(')を行の先頭または途中に置くことで記述します。アポストロフィー以降、その行の終わりまでがコメントとして扱われます。
' ========================
' 行頭にアポストロフィー
' ========================
' シート「売上データ」を選択する
Sheets("売上データ").Select
' 変数を宣言する
Dim i As Long ' ループカウンター
Dim total As Double ' 合計値
' 処理の開始
For i = 1 To 10
total = total + Cells(i, 1).Value ' A列の値を合計に加算
Next i
VBAコメントの基本的な書き方と活用例はこちらの記事も参考になります。
Remキーワードを使ったコメント:
' アポストロフィー以外にもRemキーワードでコメントを書ける
Rem これはRemキーワードを使ったコメントです
Rem ただし行中には使えない(行頭のみ)
' 現代のVBAではアポストロフィー(')が一般的で推奨される
Tips: VisualBasicEditorでは行頭に'を書かなくても、ツールバーの「コメントブロック」ボタンで選択行をまとめてコメントアウトできます。VBEの表示 → ツールバー → 編集 でボタンを表示してください。
複数行コメントの方法
複数行に’を使って連続記述
VBAには他言語のような/* */形式の複数行コメントブロック構文がありません。複数行にわたるコメントは各行の先頭にアポストロフィーを付けます。VBAのコメントアウト方法の詳細はこちらの記事も参考になります。
' ===================================================
' プロシージャ名: CalcMonthlySales
' 作成日: 2024/04/01
' 作成者: 山田太郎
' 概要: 月次売上の合計・平均・最大値を計算する
' 引数: targetMonth (Integer) 対象月(1〜12)
' 戻り値: なし(結果をシートに直接書き込む)
' ===================================================
Sub CalcMonthlySales(targetMonth As Integer)
' --- 変数の宣言 ---
Dim total As Double ' 合計値
Dim average As Double ' 平均値
Dim maxVal As Double ' 最大値
Dim rowCount As Long ' データ件数
' --- 処理開始 ---
' 対象月のデータを集計する
' 入力データはA列(日付)とB列(金額)に格納されている
' 対象月以外のデータはスキップする
End Sub
コメントの応用

コードの説明や処理手順の明記
処理の流れをコメントで番号付きに整理することで、コード全体の構造が一目でわかります。
Sub ProcessOrderData()
' ==============================================
' 受注データの処理フロー
' 1. 入力シートのデータを確認・バリデーション
' 2. 重複データの除去
' 3. 金額の集計
' 4. 結果を出力シートに書き込む
' 5. 完了メッセージを表示
' ==============================================
' --- 1. 入力データのバリデーション ---
If Sheets("入力").Cells(2, 1).Value = "" Then
MsgBox "入力データがありません", vbExclamation
Exit Sub
End If
' --- 2. 重複データの除去 ---
' A列を基準にRemoveDuplicatesで重複行を削除する
Sheets("入力").Range("A:D").RemoveDuplicates Columns:=1
' --- 3. 金額の集計 ---
Dim total As Double
total = WorksheetFunction.Sum(Sheets("入力").Columns(3))
' --- 4. 出力シートへの書き込み ---
Sheets("出力").Cells(1, 1).Value = total
' --- 5. 完了メッセージ ---
MsgBox "処理が完了しました。合計: " & total, vbInformation
End Sub
後から修正・確認するためのメモ
コードの特定の箇所に後で対応が必要なメモを残す場合のパターンです。
' TODO: 2024/06/01までに消費税率の変更に対応する(現在は10%固定)
Const TAX_RATE As Double = 0.1
' FIXME: データ件数が1000件を超えると処理が遅くなる問題あり → 要最適化
For i = 1 To lastRow
' 処理内容
Next i
' NOTE: この処理はExcel 2016以降でのみ動作する(2013では非対応)
Dim dict As New Scripting.Dictionary
' 確認待ち: 営業部に集計基準の確認が必要
' → 2024/05/15 山田課長より確認中と回答あり
デバッグ時に一時的にコードを無効化
コメントアウトはデバッグ時に特定の処理を一時的に無効化する手法です。VBAのコメントアウトを使ったデバッグの方法はこちらの記事も参考になります。
Sub DebugSample()
Dim result As Double
result = CalcData()
' --- デバッグ中: 途中結果を確認するためDebug.Printを一時追加 ---
Debug.Print "result = " & result ' デバッグ後に削除する
' --- 一時的に無効化した処理 ---
' SaveToSheet result ' 確認完了後にコメントを外す
' SendEmail result ' メール送信は検証後に有効化
' 現在は画面表示のみ
MsgBox "計算結果: " & result
End Sub
注意:コメントアウトしたコードを長期間放置すると、どれが有効なコードでどれが無効化しているコードかわからなくなります。デバッグ後は不要なコメントアウトを削除する習慣をつけましょう。
モジュールやプロシージャの冒頭での概要記述
モジュールとプロシージャの先頭に標準化されたコメントブロックを記述すると、コード全体の見通しが大幅に改善します。
' ================================================================
' モジュール名: mod_SalesReport
' 説明: 月次売上レポートの生成・集計・出力に関する処理
' 作成日: 2024/04/01
' 更新履歴:
' 2024/04/15 山田 - 消費税計算ロジックを追加
' 2024/05/01 鈴木 - エラーハンドリングを追加
' ================================================================
Option Explicit ' 変数の明示的な宣言を強制
' ----------------------------------------------------------------
' 関数名: GetLastRow
' 説明: 指定シートの指定列の最終行番号を取得する
' 引数:
' ws (Worksheet) 対象のワークシート
' col (Integer) 対象の列番号
' 戻り値: Long型 最終行番号
' ----------------------------------------------------------------
Function GetLastRow(ws As Worksheet, col As Integer) As Long
GetLastRow = ws.Cells(Rows.Count, col).End(xlUp).Row
End Function
コメントの効率的な活用方法

重要処理にポイントコメントを入れる
すべての行にコメントを書く必要はありません。ひと目ではわかりにくい処理・特別な条件・注意が必要な箇所に絞ってコメントを入れることが効果的です。
Sub AdjustPrices()
Dim ws As Worksheet
Set ws = Sheets("価格表")
Dim lastRow As Long
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To lastRow
' 在庫切れ商品(D列が0)は価格調整の対象外にする
If ws.Cells(i, 4).Value = 0 Then GoTo NextRow
' 定価の20%引き(0.8掛け)で価格を更新
' ただし100円未満にはならないよう下限を設定する
Dim newPrice As Double
newPrice = ws.Cells(i, 2).Value * 0.8
ws.Cells(i, 3).Value = IIf(newPrice < 100, 100, newPrice)
NextRow:
Next i
End Sub
定型処理や関数の説明を簡潔に記載
' 一般的な処理には簡潔なコメントを1行で十分
' ------------------------------------------------
' シートの最終行を取得
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 配列を初期化してデータを格納
Dim dataArr() As Variant
ReDim dataArr(1 To lastRow, 1 To 5)
' 計算結果を書式付きで表示
ws.Cells(1, 1).Value = Format(total, "#,##0.00")
チーム開発での情報共有
複数人でVBAを開発・管理する場合は、修正履歴や担当者情報をコメントに含めることで引き継ぎコストを削減できます。チーム開発でのVBAコメント活用のベストプラクティスはこちらの記事も参考になります。
' ==============================================
' 変更履歴(新しいものが上)
' 2024/05/20 [鈴木] エラー時のロールバック処理を追加
' 2024/05/10 [山田] 集計対象期間を当月のみから3ヶ月に変更
' 2024/04/01 [田中] 初版作成
' ==============================================
' [山田 2024/05/10] 期間変更に伴い、ループの終了条件を修正
' 変更前: For i = startRow To endRow
' 変更後: For i = startRow To endRow3Month(3ヶ月分のデータを集計)
自分用のTODOや注意点を記録
' ===== TODO リスト =====
' TODO: [優先度:高] エラーハンドリングをすべてのSubに追加する
' TODO: [優先度:中] 処理速度の改善(Application.ScreenUpdating=Falseを追加)
' TODO: [優先度:低] ログ出力機能の実装
' ===== 注意事項 =====
' WARNING: このマクロはExcel 2019以降でのみ動作する
' WARNING: シート名を変更するとエラーになる(シート名はハードコードされている)
' CAUTION: 実行前に必ずバックアップを取ること
注意点

コメントが多すぎてコードが見づらくならないようにする
コメントは「なぜこう書いたか」や「何をしているか一目でわからない処理」に絞って入れることが重要です。すべての行にコメントを付けると、かえってコードが読みにくくなります。
' 悪い例: 自明な処理にコメントを付けすぎている
Dim i As Long ' iという変数を宣言する
i = 1 ' iに1を代入する
i = i + 1 ' iに1を加算する
' 良い例: 説明が必要な処理のみコメントを入れる
' ループカウンター(1始まりはヘッダー行をスキップするため)
Dim i As Long
i = 2
古いコメントは定期的に更新
コードを修正した際にコメントの更新を忘れると、コメントとコードの内容が矛盾します。矛盾したコメントは誤解を生むため、コードを直す際はコメントも同時に見直す習慣をつけましょう。
' 悪い例: コードを変更したがコメントを更新していない
' 消費税率8%で計算する ← 古いコメント(実際は10%になっている)
price = basePrice * 1.1
' 良い例: コメントとコードが一致している
' 消費税率10%(2019年10月以降の税率)で計算する
price = basePrice * 1.1
重要な情報はコメントだけに頼らずコードにも反映
処理の条件・業務ルールなど重要な情報は、コメントだけに書くのではなく、定数・変数名・関数名にも反映させることで、コメントがなくても意図が伝わるコードになります。
' 悪い例: 重要な情報がコメントにしかない
' 割引率は15%(特定顧客向けの特別割引率)
price = basePrice * 0.85
' 良い例: コードそのものが意図を示している
Const SPECIAL_DISCOUNT_RATE As Double = 0.15 ' 特定顧客向け特別割引率
price = basePrice * (1 - SPECIAL_DISCOUNT_RATE)
まとめ
VBAコメントは可読性・保守性向上に不可欠
VBAのコメントは実行には影響しませんが、コードの読みやすさ・保守のしやすさ・チームでの共有のしやすさを大きく左右します。特に業務で使うマクロは数ヶ月後・数年後も修正が発生するため、コメントの充実がその後の作業効率を左右します。
アポストロフィーで簡単に記述可能
- 行の先頭に
'(アポストロフィー)を付けるだけでコメントになる - コードの末尾にも
'で行末コメントを追加できる - VBAには複数行コメントブロックがないため、複数行は各行に
'を付ける - VBEの「コメントブロック」ボタンで複数行を一括コメントアウトできる
- デバッグ時のコメントアウトは解決後に必ず整理する
適切にコメントを活用して効率的なコード管理を実現
コメントは「なぜこう書いたか」「何に注意すべきか」を未来の自分や仲間に伝えるメッセージです。TODOメモ・変更履歴・プロシージャの概要など用途を使い分けながら、コードとコメントが常に一致した状態を保つことが、長く使えるVBAコードを書くための最も重要な習慣です。

