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
これでようやく意図した通りの結果を得ることができました。
この記事へのコメントはありません。