最近、顧問契約をしている特許事務所様からの要望で、コメントの特定の位置に特定の文字列を追記をするWordマクロを作成しました。
Wordのコメントを通じて書類の作者と添削者が会話をするのですが、この会話を素速くするための仕組みです。
これはよく考えられたマクロです。効率を追求する所長さんのアイディアがつまったマクロです。
このマクロを開発していたときに、コメントのオブジェクトの取扱いでバグのような現象を発見しました。このメモとしてサンプルマクロを紹介します。
バグについては記事の後半で紹介します。
なお、ここで紹介するサンプルマクロは上記の会話用のマクロとは用途が異なりますのでご了承ください。
<目次>
このマクロでできること
選択された範囲内にあるコメントの冒頭に[済]と入力して蛍光ペンで着色します。
マクロ実行前
3つコメントがある文書のうち、2つ目と3つ目のコメントが挿入されている文字列を選択しました。この状態でマクロを実行します。
マクロ実行後
2つ目と3つ目のコメントのそれぞれの先頭に[済]と挿入されました。
マクロ1の解説
選択範囲内にコメントが挿入された文字列がある場合、そのコメントそれぞれに対して”[済]”と挿入する処理を実行します(16行目)。
Rangeオブジェクトの先頭に文字列を入力するときには、もちろんInsertBefore メソッドを使います。
また、挿入した文字列をわかりやすくするために黄色の蛍光ペンで着色します(18行目)。
マクロ1
Sub コメントに追記する() Dim myText As String Dim myComment As Comment Dim i As Integer Dim iMax As Integer myText = "[済] " iMax = Selection.Comments.Count If iMax > 0 Then For i = 1 To iMax Set myComment = Selection.Comments(i) With myComment.Range .InsertBefore myText .SetRange .Start, .Start + Len(myText) .HighlightColorIndex = wdYellow End With Next i Else MsgBox "コメントを含むように範囲を選択してください。", vbExclamation End If End Sub
バグらしき症状
上記のマクロではFor...Next ステートメントでカウンター変数 i を用いてマクロを記述しました。
通常、この手の処理ではFor Each... Next ステートメントを用いた方が処理が速いとされています。
ところが、For Each... Next ステートメントを用いると、なぜか選択されていない箇所のコメント(今回の例では1つ目のコメント)にも[済]と文字列が挿入されてしまうのでした。。。
マクロ2を実行したときの結果です。
以前の記事「【コード】選択範囲内のコメントを削除するWordマクロ」でも同様のバグを紹介しています。
今回のようにインデックス番号でオブジェクトを特定すればうまくいくのです。
他の記事「【コード】文書中のテキストボックス内の文字列を別紙に書出す(その3)」でもFor Each... Next ステートメントがうまくいかない事例(Word 2010に限りますが)を紹介しています。ご参考まで。
気をつけましょう。
マクロ2
Sub コメントに追記する_NG() Dim myText As String Dim myComment As Comment myText = "[済] " If Selection.Comments.Count > 0 Then For Each myComment In Selection.Comments With myComment.Range .InsertBefore myText .SetRange .Start, .Start + Len(myText) .HighlightColorIndex = wdYellow End With Next myComment Else MsgBox "コメントを含むように範囲を選択してください。", vbExclamation End If End Sub