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

VBA
スポンサーリンク

Contents

スポンサーリンク

この記事でできること

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

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

完成イメージ(Before / After)

Before(実行前):

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

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(実行後):

閾値(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超過

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

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

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

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

実行前の準備

バックアップを取る

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

Excelをマクロ有効ブック(.xlsm)で保存する

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

.xlsx のままだとマクロは保存できない。必ず .xlsm にすること。

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで `Alt + F11` を押す
  2. VBE(Visual Basic Editor)が開く

企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」
  2. 白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. `Alt + F8` → マクロ名を選んで「実行」

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

まずはこれだけで動く。指定範囲のセルにコメントを一括追加するマクロと、一括削除するマクロの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 で想定外の範囲のコメントが消えた

原因: 範囲指定を間違えた、または 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 かどうかを確認する。実務版コードではこの対策を入れている。

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 のコードは変わらない

関連記事

  • [セルの値に応じて行を自動色分けする方法](/006) — セルの値に応じた処理の基本。コメント追加でも同じ考え方が使える
  • [複数条件でデータを抽出してまとめる方法](/021) — 条件付き処理の応用。抽出結果にコメントを付ける運用にも
  • [エラー処理で止まらないマクロを作る方法](/022) — AddCommentのエラー1004対策にエラー処理が必要な理由

次にやりたくなること

  • **[特定の文字を含むセルを検索してハイライトする方法](/010)**: コメント付与とハイライトをセットで運用したい場合はこちら
  • **[複数シートに同じ処理を一括実行する方法](/015)**: 全シートのコメントを一括操作したい場合はこちら

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

コメント

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