【Word VBA】塗りつぶしで使用されている色(背景色)の数をカウントするWordマクロ

仕事で文字の塗りつぶしで使われている色(背景色)を解析する必要がありました。そのときに、使用されている背景色とその個数を知る必要がありました。

このときに作成したコードを応用して、文書全体で使われている背景色を解析するマクロを紹介します。

16進数のカラーコードで出力します。

このマクロでできること

マクロ実行前

以下のように背景色で着色をされているファイルに対して実行します。Wordで動く翻訳チェックソフト「色deチェック」の着色機能でキーワードに着色をしました。

マクロ実行結果

新規ファイルに、背景色のカラーコード(16進数)と対象箇所の数をタブ区切りで出力します。工夫をすれば、実際の背景色で着色をしたり、表にしたり、出現数で並べ替えたりできますね。

マクロの解説

背景色を取得するため、XMLデータを使います。

(参考)【Word VBA】WordのXMLデータを操作するWordマクロ

XMLデータから、背景色の指定で使われているタグを検索してカラーコードを取得します。

その後、カラーコードごとに個数を計算します。

文字列内で検索をしたり個数を計算したりする場合には、VBScriptのRegExを使うと便利です。

データの保存には、連想配列(Dictionaryオブジェクト)を用いています。

マクロ


Sub 使用されている背景色の数をカウントするWordマクロ()

 'XMLファイルの情報を利用して、RegExで背景色の数を数える

 '-------------------------------------------
 'XMLデータの準備
 '-------------------------------------------
 'XMLのデータをstrXML(String変数)に取得
 Dim strXML As String
 strXML = ActiveDocument.Range.WordOpenXML

 '-------------------------------------------
 '前処理
 '-------------------------------------------
 'オブジェクトを設定
 Dim myRe As Object
 Set myRe = CreateObject("VBScript.RegExp")

 '空の文字列の背景色を削除
 With myRe
  .Pattern = "w:fill=""[0-9A-Z]{6}""/></w:rPr></w:pPr>" '検索する文字列
  .IgnoreCase = True     '大文字と小文字を区別しない
  .Global = True       '文字列全体を検索
  strXML = .Replace(strXML, "")
 End With

 '-------------------------------------------
 '使用されているすべての色の登録
 '-------------------------------------------
 Dim myDicColor As Object
 Set myDicColor = CreateObject("Scripting.Dictionary")

 Dim myMatch As Object

 With myRe
  .Pattern = "w:fill=""([0-9A-Z]{6})""" '検索する文字列"
  .IgnoreCase = True     '大文字と小文字を区別しない
  .Global = True       '文字列全体を検索
  Set myMatch = .Execute(strXML)
  If myMatch.Count > 0 Then
   Dim i As Integer
   For i = 0 To myMatch.Count - 1
    Dim myColor As String
    myColor = myMatch(i).SubMatches(0)
    If myDicColor.Exists(myColor) = False Then
     myDicColor.Add myColor, ""
    End If
   Next
  End If
 End With

 '-------------------------------------------
 '色別にカウント数を登録
 '-------------------------------------------
 Dim Key As Variant
 For Each Key In myDicColor.Keys
  With myRe
   .Pattern = """" & Key & """" '検索する文字列
   .IgnoreCase = True     '大文字と小文字を区別しない
   .Global = True       '文字列全体を検索
   Set myMatch = .Execute(strXML)
   myDicColor(Key) = myMatch.Count
  End With
 Next
 
 '-------------------------------------------
 '結果をWordファイルに出力
 '-------------------------------------------
 Dim myDoc As Document: Set myDoc = Documents.Add
 
 For Each Key In myDicColor.Keys
  myDoc.Range.InsertAfter Key & vbTab & myDicColor.Item(Key) & vbCr
 Next
 
 '-------------------------------------------
 '後処理
 '-------------------------------------------
 Set myRe = Nothing
 Set myMatch = Nothing
 Set myDicColor = Nothing
 Set myDoc = Nothing

End Sub

関連記事

トップへ戻る