こんにちは! 業務自動化の現場を渡り歩いてきた、シニアアーキテクトの私です。
「マクロの記録」ボタンを押してExcelを操作するのは卒業したけれど、いざWordのVBA(Visual Basic for Applications)を開いてみると……Excelとは何かが違う。ドキュメント、段落、レンジ、そして「コメント(注釈)」……。どこをどう指定すればいいのか、途方に暮れていませんか?
大丈夫、安心してください。今日ここでお伝えする「Word内のコメントをExcelに抽出して進捗管理に活かす」というテクニックをマスターすれば、Word VBAのオブジェクトモデルの本質が手に取るように分かるようになります。
ここをクリアすれば、Word VBAの基本はバッチリです。さあ、ワンランク上のエンジニアへの扉を開きましょう!
—
なぜ「コメントのExcel化」が業務革命になるのか?
複数人でWordファイルをレビューする際、あちこちに飛び交う「コメント(注釈)」。
「あそこを直したっけ?」「この指摘は誰が対応するんだっけ?」と、Wordの画面と睨めっこしながらステータスを追うのは、エンジニアの仕事というより「苦行」です。
これをWord VBAで一網打尽にし、Excelのテーブルへきれいに流し込むことができたらどうでしょう?
- 誰が、いつ、どんな指摘をしたのかが一目瞭然
- 「未対応」「対応中」「完了」といった進捗ステータス列をExcel側に付与できる
- レビューの全体工数が可視化され、プロジェクトが劇的にスムーズになる
このツールは、単なる便利スクリプトではなく、チームの生産性を底上げするキラーツールなのです。
—
Word VBAの核心:Excelとは何が違うのか?
コードを書く前に、Word VBA特有の「世界観」を知っておく必要があります。ここを勘違いすると、無限ループやエラーの沼にハマります。
Excelは「セルの集合体(2次元グリッド)」ですが、Wordの本質は「文字と構造の連続体(ストリーム)」です。
Wordの文書は、表紙から裏表紙まで、1つの途切れない物語(ストーリー)として流れています。その中に「コメント」という特殊なオブジェクトが、いわば“付箋”のようにぶら下がっているイメージです。
したがって、コメントを回収するアプローチはこうなります。
1. 対象のWord文書(`Document`)を開く
2. その文書に紐づくコメントのコレクション(`Comments`)を特定する
3. 1つひとつのコメント(`Comment`)から、「作成者」「日付」「本文」を串刺しで抜き出す
—
実装コード:WordからExcelへコメントを叩き出す!
今回は、「コメントが書かれているWord側」からマクロを実行し、裏でExcelを起動してデータを流し込むという、最もスマートで実用的な方式をとります。
以下のコードを、WordのVBAエディタ(`Alt + F11` で起動)の標準モジュールに貼り付けてください。
Option Explicit
‘ ====================================================================
‘ 処理名: Word文書内の全コメントをExcelへエクスポートし進捗管理化する
‘ 解説 : ドキュメント内のコメントを走査し、新規Excelブックに一覧出力します。
‘ ====================================================================
Sub ExportCommentsToExcel()
Dim wdDoc As Document
Dim cmt As Comment
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Dim rowIdx As Long
‘ 1. 現在アクティブなWord文書を対象にする
Set wdDoc = ActiveDocument
‘ ドキュメント内にコメントが存在するかチェック
If wdDoc.Comments.Count = 0 Then
MsgBox “この文書にはコメントが存在しません。”, vbInformation, “確認”
Exit Sub
End If
‘ 2. Excelアプリケーションをバックグラウンドで起動
On Error Resume Next
Set xlApp = CreateObject(“Excel.Application”)
If xlApp Is Nothing Then
MsgBox “Excelの起動に失敗しました。インストールを確認してください。”, vbCritical, “エラー”
Exit Sub
End If
On Error GoTo 0
‘ Excelを表示モードにする(必要に応じてFalseにしてバックグラウンド処理も可)
xlApp.Visible = True
‘ 3. 新規ワークブックを作成し、先頭シートを変数に格納
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “レビュー進捗管理”
‘ 4. 見出し行の作成(ここがExcelでの進捗管理の土台になります)
xlWs.Cells(1, 1).Value = “No.”
xlWs.Cells(1, 2).Value = “ページ(推定)” ‘ Wordではページ厳密特定が難しいため参考値
xlWs.Cells(1, 3).Value = “作成者”
xlWs.Cells(1, 4).Value = “日時”
xlWs.Cells(1, 5).Value = “コメント内容”
xlWs.Cells(1, 6).Value = “ステータス” ‘ 進捗管理用の独自列!
xlWs.Cells(1, 7).Value = “担当者” ‘ 担当者アサイン用!
‘ 見出しの書式設定(ちょっとしたプロのこだわり)
With xlWs.Range(“A1:G1”)
.Interior.Color = RGB(41, 128, 185) ‘ プロフェッショナルな青
.Font.Color = RGB(255, 255, 255)
.Font.Bold = True
End With
‘ 5. コレクションループ:Wordのコメントを1つずつ舐めていく
rowIdx = 2 ‘ 2行目から書き込み開始
For Each cmt In wdDoc.Comments
xlWs.Cells(rowIdx, 1).Value = rowIdx – 1
‘ コメントが付けられている参照先の範囲からページ番号を取得(Word VBAの小技)
On Error Resume Next
xlWs.Cells(rowIdx, 2).Value = cmt.Scope.Information(wdActiveEndPageNumber)
On Error GoTo 0
xlWs.Cells(rowIdx, 3).Value = cmt.Author ‘ 作成者
xlWs.Cells(rowIdx, 4).Value = cmt.Date ‘ 日付
xlWs.Cells(rowIdx, 5).Value = cmt.Range.Text ‘ コメント本文
‘ 進捗管理用のデフォルト値をセット
xlWs.Cells(rowIdx, 6).Value = “未対応”
xlWs.Cells(rowIdx, 7).Value = “未割当”
rowIdx = rowIdx + 1
Next cmt
‘ 6. 仕上げ:表の見た目を整える(列幅の自動調整)
xlWs.Columns(“A:G”).EntireColumn.AutoFit
‘ 完了メッセージ
MsgBox “全 ” & wdDoc.Comments.Count & ” 件のコメントをExcelへエクスポートしました!”, vbInformation, “処理完了”
‘ オブジェクトの解放(メモリリークを防ぐ美しいエンジニアの作法)
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
Set wdDoc = Nothing
End Sub
—
コードの重要なポイントと「初心者が陥りがちな罠」
今回のコードには、実務で必ず直面する「Word VBA特有の罠」を回避する知見が詰まっています。いくつか解説しておきましょう。
① なぜ `CreateObject(“Excel.Application”)` なのか?
WordのVBAからExcelを操作する場合、初期設定のままではExcelのライブラリ(参照設定)を見失うリスクがあります。`CreateObject` を使った「遅延バインディング(Late Binding)」という手法をとることで、相手のPCのExcelのバージョン違いによるエラーを華麗に回避できます。プロの現場では必須のテクニックです。
② `cmt.Scope` と `cmt.Range` の違い
- `cmt.Scope`: 文書側で「どの文字列に対してコメントが付けられたか」の範囲を指します。これを使うことで、何ページ目にコメントがあるか(`wdActiveEndPageNumber`)を逆算できます。
- `cmt.Range`: コメント「そのものの」テキストボックスの中身を指します。ここから `.Text` を取得することで、レビューワーが書いた指摘内容を丸ごと回収できます。
③ メモリの解放(オブジェクトの破棄)
コードの最後で `Set xlApp = Nothing` などの後片付けをしています。これをサボると、見えないところでExcelのプロセスが裏で生き残り続け(ゾンビプロセス)、PCの動作が重くなる原因になります。後始末まで美しく書くのが、一流のエンジニアです。
—
さあ、実践してみよう
このマクロを実行すると、数秒で新しいExcelが立ち上がり、綺麗な表が目の前に現れます。
あとは、このExcelに「ステータス(未対応/対応中/完了)」や「対応メモ」の列を加え、チーム共有の進捗管理表として育てていくだけです。
Wordのコメント地獄からあなたを解放し、レビュー業務をスマートなデータ管理へと昇華させるこのツール。ぜひ、あなたの手元の業務で試してみてください。
「ここをもっとこうしたい」「こういうエラーが出るんだけど」といった疑問があれば、いつでもまた私を頼ってください。あなたのVBAライフを、私はいつも応援しています!
