【VBA】セルのコメント(メモ)を一括操作する方法(コピペOK)

【VBA】セルのコメント(メモ)を一括操作する方法の解説用アイキャッチ画像 VBA

この記事でできること

  • VBAでセルのコメント(メモ)を一括追加できる
  • 閾値を超えたセルに条件付きで警告コメントを自動追加できる
  • シート内の全コメントの内容を別シートに一覧で書き出しできる
  • 不要になったコメントを一括削除できる

完成イメージ(Before / After)

Before(実行前):

Before(実行前)のExcel画面

検査データの「数値」列に閾値超えのデータがあるが、コメントは付いていない。

A B C
1 製品名 ロット 数値
2 部品A L001 85
3 部品B L002 120
4 部品C L003 95
5 部品D L004 150
6 部品E L005 78

After(実行後):

After(実行後)のExcel画面

閾値(100)を超えるセル(C3, C5)に警告コメントが自動追加される。

A B C
1 製品名 ロット 数値
2 部品A L001 85
3 部品B L002 120(コメント:警告: 閾値100超過)
4 部品C L003 95
5 部品D L004 150(コメント:警告: 閾値100超過)
6 部品E L005 78

さらに、別シート「コメント一覧」に全コメントの内容が書き出される。

A B C
1 シート名 セル位置 コメント内容
2 Sheet1 $C$3 警告: 閾値100超過
3 Sheet1 $C$5 警告: 閾値100超過

レビュー結果をセルのコメントに手作業で1つずつ入力していた。50セルもあると30分以上かかる。VBAで一括操作できるようにしてからは、リスト1つあれば全セルに一括追加。

品質データ500行にチェックコメントを1個ずつ手打ちしていたことがある。右クリック→メモの挿入→テキスト入力→次のセルへ…を繰り返して半日かかった。右クリックの繰り返しが地獄だった。

VBAで閾値超えのセルに自動コメントを付けるようにしたら5秒で完了した。手打ちで半日かかっていたのが嘘みたいだった。セルの値に応じた処理の基本は セルの値に応じて行を自動色分けする方法 でも解説しているが、コメント追加でも同じ考え方が使える。

この記事では、セルのコメント(メモ)を一括操作する方法を最小版と実務版の2パターンで紹介する。まずは最小版をコピペして、一括操作の手軽さを体験してほしい。

Excel 365 をお使いの方へ: Excel 365 では従来の「コメント」が「メモ」に名称変更されている。ただし VBA のコード(AddComment / Comment オブジェクト)は変わらない。この記事のコードはそのまま動く。

どんな場面で使う?

  • 品質チェックで閾値を超えたセルに警告コメントを自動追加したい
  • 大量のセルに付いたコメントの内容を一覧表に書き出して管理したい
  • 不要になった古いコメントをシート全体から一括削除したい
  • レビュー結果のコメントを条件に応じて自動で付与したい

実行前の準備

バックアップを取る

対象のExcelファイルをコピーしてバックアップを取ること。コメントの削除は Ctrl+Z で元に戻せない。VBAから削除した場合、復元する手段がない。

コード(最小版)– セルにコメントを一括追加&一括削除

まずはこれだけで動く。指定範囲のセルにコメントを一括追加するマクロと、一括削除するマクロの2本セット。


'============================================================
' ■ セルにコメント(メモ)を一括追加(最小版)
'   → 指定範囲の全セルにコメントを追加する
'   → 既存コメントがあるセルは削除してから追加する
'============================================================
Sub AddCommentsAll()

    '--- ★書き換えポイント ---
    Dim targetRange As String
    targetRange = "C2:C100"        '← コメントを追加する範囲

    Dim commentText As String
    commentText = "チェック済み"    '← 追加するコメントの内容
    '--- ★ここまで ---

    Dim rng As Range
    Set rng = ActiveSheet.Range(targetRange)

    Dim cell As Range
    Dim addCount As Long
    addCount = 0

    Application.ScreenUpdating = False

    For Each cell In rng
        ' 空白セルはスキップ
        If cell.Value <> "" Then
            ' 既存コメントがあれば削除
            If Not cell.Comment Is Nothing Then
                cell.Comment.Delete
            End If
            ' コメントを追加
            cell.AddComment commentText
            addCount = addCount + 1
        End If
    Next cell

    Application.ScreenUpdating = True

    MsgBox addCount & " 件のセルにコメントを追加しました。", vbInformation

End Sub

'============================================================
' ■ セルのコメント(メモ)を一括削除(最小版)
'   → 指定範囲の全コメントを削除する
'============================================================
Sub DeleteCommentsAll()

    '--- ★書き換えポイント ---
    Dim targetRange As String
    targetRange = "C2:C100"    '← コメントを削除する範囲
    '--- ★ここまで ---

    Dim rng As Range
    Set rng = ActiveSheet.Range(targetRange)

    ' 範囲内の全コメントを一括削除
    rng.ClearComments

    MsgBox "コメントを一括削除しました。", vbInformation

End Sub

書き換えポイント

変数 説明 初期値
targetRange コメントを追加/削除する範囲 "C2:C100"
commentText 追加するコメントの内容 "チェック済み"

コードの流れ(AddCommentsAll)

  1. 範囲の指定: targetRange で指定した範囲のセルをループ
  2. 空白チェック: 空白セルにはコメントを追加しない
  3. 既存コメント削除: コメントがあるセルは先に削除(エラー1004防止)
  4. コメント追加: AddComment でコメントを追加
  5. 件数表示: 追加した件数をMsgBoxで表示

コードの流れ(DeleteCommentsAll)

  1. 範囲の指定: targetRange で指定した範囲を取得
  2. 一括削除: ClearComments で範囲内の全コメントを一括削除

既存コメントの確認について: AddComment は既にコメントがあるセルに実行するとエラー1004が発生する。最小版コードでは If Not cell.Comment Is Nothing Then cell.Comment.Delete で事前に削除してから追加している。

コード(実務版)– 条件付きコメント追加+コメント内容を別シートに書き出し

最小版で一括追加・一括削除の手軽さを体験したら、実務版で条件付きコメントと一覧書き出しに進もう。閾値チェックとコメント付与がセットで動くと、データの品質管理が格段に楽になる。

業務で使うなら、閾値を超えたセルだけにコメントを付けたい、付けたコメントの一覧を確認したい、という要望がある。実務版では2つの機能をセットで提供する。

エラー処理の仕組みは エラー処理で止まらないマクロを作る方法 で詳しく解説している。


'============================================================
' ■ 条件付きコメント追加+コメント一覧書き出し(実務版)
'   → 閾値を超えるセルに警告コメントを自動追加
'   → シート内の全コメントを「コメント一覧」シートに書き出し
'   → エラー処理付き
'============================================================
Sub AddCommentsAndExport()

    '--- ★書き換えポイント ---
    Dim wsName As String
    wsName = "Sheet1"              '← 処理対象のシート名

    Dim dataCol As String
    dataCol = "C"                  '← 数値データが入っている列

    Dim startRow As Long
    startRow = 2                   '← データの開始行(1行目がヘッダーなら2)

    Dim threshold As Double
    threshold = 100                '← 閾値(この値を超えたらコメント追加)

    Dim warnText As String
    warnText = "警告: 閾値" & threshold & "超過"  '← コメントの内容
    '--- ★ここまで ---

    On Error GoTo ErrHandler
    Application.ScreenUpdating = False

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(wsName)

    '--- 最終行を取得
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, dataCol).End(xlUp).Row

    '--- 条件付きコメント追加
    Dim cell As Range
    Dim addCount As Long
    addCount = 0

    Dim i As Long
    For i = startRow To lastRow
        Set cell = ws.Cells(i, dataCol)

        ' 数値かつ閾値超過の場合のみコメント追加
        If IsNumeric(cell.Value) And cell.Value <> "" Then
            If cell.Value > threshold Then
                ' 既存コメントがあれば削除
                If Not cell.Comment Is Nothing Then
                    cell.Comment.Delete
                End If
                ' 警告コメントを追加
                cell.AddComment warnText
                addCount = addCount + 1
            End If
        End If
    Next i

    '--- コメント一覧を別シートに書き出し
    Dim wsOut As Worksheet

    ' 「コメント一覧」シートがあれば削除して再作成
    On Error Resume Next
    Set wsOut = ThisWorkbook.Worksheets("コメント一覧")
    On Error GoTo ErrHandler

    If Not wsOut Is Nothing Then
        Application.DisplayAlerts = False
        wsOut.Delete
        Application.DisplayAlerts = True
    End If

    Set wsOut = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
    wsOut.Name = "コメント一覧"

    ' ヘッダー行
    wsOut.Cells(1, 1).Value = "シート名"
    wsOut.Cells(1, 2).Value = "セル位置"
    wsOut.Cells(1, 3).Value = "コメント内容"
    wsOut.Cells(1, 4).Value = "セルの値"
    wsOut.Rows(1).Font.Bold = True

    ' コメント付きセルを取得して書き出し
    Dim cmtCell As Range
    Dim outRow As Long
    outRow = 2

    On Error Resume Next
    Dim cmtRange As Range
    Set cmtRange = ws.Cells.SpecialCells(xlCellTypeComments)
    On Error GoTo ErrHandler

    If Not cmtRange Is Nothing Then
        For Each cmtCell In cmtRange
            wsOut.Cells(outRow, 1).Value = ws.Name
            wsOut.Cells(outRow, 2).Value = cmtCell.Address
            wsOut.Cells(outRow, 3).Value = cmtCell.Comment.Text
            wsOut.Cells(outRow, 4).Value = cmtCell.Value
            outRow = outRow + 1
        Next cmtCell
    End If

    ' 列幅を自動調整
    wsOut.Columns("A:D").AutoFit

    Application.ScreenUpdating = True

    MsgBox "コメント追加: " & addCount & " 件" & vbCrLf & _
           "コメント一覧: " & (outRow - 2) & " 件を「コメント一覧」シートに書き出しました。", vbInformation

    Exit Sub

ErrHandler:
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox "エラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "内容: " & Err.Description, vbCritical

End Sub

書き換えポイント

変数 説明 初期値
wsName 処理対象のシート名 "Sheet1"
dataCol 数値データが入っている列 "C"
startRow データの開始行 2
threshold 閾値(この値を超えたらコメント追加) 100
warnText コメントの内容 "警告: 閾値100超過"

コードの流れ

  1. 設定値の定義: シート名・列・開始行・閾値・コメント内容を書き換えポイントに集約
  2. 最終行の取得: データの範囲を自動検出
  3. 条件付きコメント追加: 数値が閾値を超えるセルにのみ警告コメントを追加。既存コメントは事前に削除
  4. コメント一覧シートの作成: 「コメント一覧」シートを作成(既存なら削除して再作成)
  5. SpecialCells で一括取得: xlCellTypeComments でコメント付きセルを一括取得し、シート名・セル位置・コメント内容・セルの値を書き出し
  6. エラー処理: On Error GoTo で安全に復帰

特定の文字を含むセルを検索してコメントを付けたい場合は、特定の文字を含むセルを検索してハイライトする方法 の Find メソッドと組み合わせることもできる。

SpecialCells(xlCellTypeComments) はコメント付きセルだけを一括取得できる便利なメソッド。コメントが1つもない場合はエラーになるため、On Error Resume Next で対応している。

よくある落とし穴5選

1. AddComment でエラー1004が出る

原因: 既にコメントがあるセルに AddComment を実行した。

自分もこれで30分ハマった。品質データに一括コメントを付けようとしたら、前回のコメントが残っているセルでエラー1004が出て止まった。既存コメントを削除してから追加が必要だと気づくまで、何が原因か分からなかった。

対策: AddComment の前に既存コメントの有無を確認し、あれば削除する。


If Not cell.Comment Is Nothing Then
    cell.Comment.Delete
End If
cell.AddComment "テキスト"

2. コメントがないセルで .Comment.Text を参照してエラー

原因: CommentNothing のセルに対して .Text を参照した。

対策: If Not cell.Comment Is Nothing Then で事前チェックする。

3. ClearComments で想定外の範囲のコメントが消えた

自分も一度、範囲をA:Zと指定して実行したら、別の担当者が付けた重要なレビューコメントまで全部消えた。Ctrl+Zでも戻せず、バックアップから復元する羽目になった。それ以来、ClearCommentsの前には必ず範囲を二重チェックしている。

原因: 範囲指定を間違えた、または ActiveSheet.Cells.ClearComments でシート全体のコメントを削除した。

対策: 削除範囲を明示的に指定する。バックアップを取ってから実行する。VBAからのコメント削除は Ctrl+Z で元に戻せない。

4. Excel 365 で「コメント」と「メモ」が混同される

原因: Excel 365 では従来の「コメント」が「メモ」に名称変更された。新しい「コメント」はスレッド型(返信可能)の別機能。

対策: VBA の Comment / AddComment は旧型の「メモ」を操作する。この記事のコードはそのまま動く。新しいスレッド型コメントは VBA から直接操作する標準メソッドがないため注意。

5. SpecialCells(xlCellTypeComments) でエラーが出る

原因: シート内にコメントが1つもない状態で SpecialCells(xlCellTypeComments) を実行した。

対策: On Error Resume Next で囲み、結果が Nothing かどうかを確認する。実務版コードではこの対策を入れている。

VBAでコメント追加時にエラー1004が出るときの対処法

「AddCommentを実行するとエラーが出る」という場合、原因は対象セルに既にコメントが存在していることだ。cell.Comment.Delete で既存コメントを削除してから cell.AddComment を実行すれば解決する。事前に If Not cell.Comment Is Nothing Then でチェックするのが安全だ。

VBAでコメントの一覧書き出しが途中で止まるときの対処法

「一部のコメントしか書き出されない」という場合、原因は結合セルやエラー値セルが混在していてループが中断されることだ。On Error Resume Next でエラーをスキップするか、If cell.MergeCells Then で結合セルを除外する分岐を入れれば最後まで処理が完了する。

FAQ

Q1: 既存のコメントを削除せず上書き(書き換え)したい

Comment.Text で直接テキストを書き換えられる。


If Not cell.Comment Is Nothing Then
    cell.Comment.Text "新しいテキスト"
End If

Q2: コメントの書式(フォントサイズや色)を変えたい

Comment.Shape.TextFrame.Characters.Font で設定できる。


cell.AddComment "警告"
cell.Comment.Shape.TextFrame.Characters.Font.Size = 12
cell.Comment.Shape.TextFrame.Characters.Font.Color = RGB(255, 0, 0)

Q3: ボタンクリックでコメント追加マクロを実行したい

ボタン設置(マクロをボタン1つで実行する方法)と組み合わせれば、ワンクリックでコメント一括追加が走る。ボタンの OnAction にマクロ名を指定するだけ。

Q4: 複数シートのコメントを一括で操作したい

シートをループして各シートで処理を実行する。複数シートの一括処理は 複数シートに同じ処理を一括実行する方法 で解説している。

Q5: コメント付きセルだけを検索してハイライトもしたい

SpecialCells(xlCellTypeComments) でコメント付きセルを取得し、Interior.Color でハイライトする。検索とハイライトの基本は 特定の文字を含むセルを検索してハイライトする方法 を参照。

まとめ

  • Range.AddComment "テキスト" でセルにコメント(メモ)を追加できる
  • Range.ClearComments で範囲内のコメントを一括削除できる
  • AddComment は既存コメントがあるとエラー1004。事前に削除が必要
  • SpecialCells(xlCellTypeComments) でコメント付きセルを一括取得できる
  • Excel 365 では「コメント」→「メモ」に名称変更されたが、VBA のコードは変わらない

関連記事

次にやりたくなること

コメントの手打ちは、一度 VBA で一括操作を体験すると戻れなくなる。まずは最小版で一括追加と一括削除を試してみてほしい。

コメント

タイトルとURLをコピーしました