Twitterを眺めていたら下記ツイートを発見しました。
【Word】表中の特定セルにブックマークが存在するかどうか調べる処理を追加したいけれど、うまくいかないなあ、doc.Tables(1).Cell(セル行, セル列)の範囲でブックマークをカウントすると、該当セルと同じ行に含まれるブックマークがすべてカウントされる。あれれ~。
— きがよ083 (@kigayo083) 2015, 9月 1
Wordの表中にあるセルに含まれるブックマークをカウントすると、そのセルと同じ行にある他のブックマークまでカウントされるというのです。
さっそく確かめてみることにしました。
まずは下図のようなテスト用の表を用意します。
表中のセルにはブックマークが設定してあり、分かりやすいように蛍光ペンでマークしています。
この表に対して下記コードを実行したところ、
Public Sub Test()
Dim bm As Word.Bookmark
With ActiveDocument.Tables(1).Cell(1, 1).Range
Debug.Print "Bookmarks:" & .Bookmarks.Count
For Each bm In .Bookmarks
Debug.Print bm.Range.Text
Next
End With
End Sub
本来であれば下図のようになるはずが、
下図の結果となりました。
これを見ると、たしかに指定したセルがある行に含まれるブックマークがすべて取得されてしまっているようです。
やり方を変えて、下図のように特定のセルのみを選択して、Selectionオブジェクトからブックマーク数をカウントしてみましたが、結果は同じでした。
・・・原因は気になるところですが、Wordでマクロを扱っていると、こうした意図しない結果になることはよくあるので、あまり深追いしないことにします。
そして対応としては、単純にブックマークの開始位置と終了位置が、指定したセル内に含まれているかどうかを調べれば良いかと思います。
Public Sub Test2()
Debug.Print "Bookmarks:" & _
CountBookmarks(ActiveDocument.Tables(1).Cell(1, 1))
End Sub
Public Function CountBookmarks(ByVal TargetCell As Word.Cell) As Long
Dim bm As Word.Bookmark
Dim cnt As Long
cnt = 0 '初期化
With TargetCell.Range
For Each bm In ActiveDocument.Bookmarks
If bm.Start >= .Start And _
bm.End <= .End Then
cnt = cnt + 1
End If
Next
End With
CountBookmarks = cnt
End Function
これでようやく意図した通りの結果を得ることができました。























この記事へのコメントはありません。