Office関連

セル内にあるブックマークをカウントするWordマクロ

Twitterを眺めていたら下記ツイートを発見しました。

Wordの表中にあるセルに含まれるブックマークをカウントすると、そのセルと同じ行にある他のブックマークまでカウントされるというのです。

さっそく確かめてみることにしました。

まずは下図のようなテスト用の表を用意します。
表中のセルにはブックマークが設定してあり、分かりやすいように蛍光ペンでマークしています。

WordVBA_CountBookmarks_01

この表に対して下記コードを実行したところ、

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

本来であれば下図のようになるはずが、

WordVBA_CountBookmarks_02

下図の結果となりました。

WordVBA_CountBookmarks_03

これを見ると、たしかに指定したセルがある行に含まれるブックマークがすべて取得されてしまっているようです。

やり方を変えて、下図のように特定のセルのみを選択して、Selectionオブジェクトからブックマーク数をカウントしてみましたが、結果は同じでした。

WordVBA_CountBookmarks_04

・・・原因は気になるところですが、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

これでようやく意図した通りの結果を得ることができました。

WordVBA_CountBookmarks_05

関連記事

  1. Office関連

    WordBasicマクロの資料

    Word 97でVBA機能が搭載される以前のWordでは、WordBa…

  2. Office関連

    ビジネスITアカデミーの無料VBAセミナーに行ってきました。

    Excel MVPの伊藤さんやWord MVPの新田さんのブログ記事で…

  3. Office関連

    Office 365 APIをVBAから呼び出す(3)

    前々回の記事でOffice 365とAzure ADの紐づけを、前回の…

  4. Office アドイン

    [Office用アプリ]Mashup Awards 9にOffice 用アプリで応募できる!?

    日本最大級のWebアプリケーション開発コンテスト「Mashup Awa…

  5. Office関連

    PowerShellからNetOfficeを使ってExcelを操作する方法

    先日、Excel MVPの伊藤さんがPowerShellからExcel…

コメント

  • コメント (0)

  • トラックバックは利用できません。

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP