【Word VBA】表中の結合されたセルを着色するWordマクロ

2015年1月28日

2017年10月25日(追記)
改良版をアップしました。
【コード】表中の結合されたセルを着色するWordマクロ(その2) ←バグあり
【コード】表中の結合されたセルを着色するWordマクロ(その3) ←改良版

前回の記事「【Wordマクロ】表中の結合・分割セルの有無を判定する 」にて、結合・分割のセルの有無を判定しましたが、今回の記事では、どのセルが結合しているのかを判定します。

このマクロでできること

表のセルが結合しているかどうかを判定し、結合している場合にセルの背景を黄色に着色します。

下図のとおり、入れ子構造(ネスト)のセルの結合状態については判定しません。

マクロの解説

Wordのセルには結合を判定するプロパティがないため、判定方法を工夫しています。

この判定には、Microsoft MVP for Office System のきぬあささん の「すべてのテーブルの結合を解除するWordマクロ 」を参考にさせていただきました。技ありの判定方法です。

縦方向の結合は、Selection オブジェクトのInformation プロパティから判定しています(20~21行目)。

さらに、横方向の結合は、xmlの情報を取得して判定しています(44~60行目)。

マクロ


Sub セルの結合を判定する()

 Dim myTable As Table
 Dim myCell As Cell
 Dim rowSpan As Long
 Dim myDoc As Document
 Dim blnMerged As Boolean
 
 Set myDoc = ActiveDocument
 
 For Each myTable In myDoc.Tables
    
  For Each myCell In myTable.Range.Cells
   
   myCell.Select
   
   With Selection
    
    '縦方向の結合の判定
    rowSpan = (.Information(wdEndOfRangeRowNumber) - _
          .Information(wdStartOfRangeRowNumber)) + 1
    
    If rowSpan <> 1 Then
     blnMerged = True
    Else
     '横方向の結合の判定
     With myCell
      blnMerged = IsMergedCell(myTable, .RowIndex, .ColumnIndex)
     End With
    End If
   
   End With
  
   If blnMerged = True Then
    myCell.Range.Shading.BackgroundPatternColorIndex = wdYellow
   End If
  
  Next myCell
  
 Next myTable

End Sub

Function IsMergedCell(myTable As Table, i As Long, n As Long) As Boolean
 
 Dim myXML As Object
 
 i = i - 1
 n = n - 1
 
 IsMergedCell = False
 
 Set myXML = CreateObject("MSXML2.DOMDocument")
  
 If myXML.LoadXML(myTable.Range.XML) Then
  With myXML.SelectNodes("/w:wordDocument/w:body/wx:sect/w:tbl/w:tr")
   With .Item(i).SelectNodes("w:tc")
    If .Item(n).SelectNodes("w:tcPr/w:gridSpan").Length > 0 Then
     IsMergedCell = True
    End If
   End With
  End With
 End If
 
End Function

関連記事

すべてのテーブルの結合を解除するWordマクロ (きぬあささんの記事)

【Wordマクロ】表中の結合・分割セルの有無を判定する

ちなみにいくつかの記事を読みましたが、これらの記事では判定は難しいとされています。
きぬあささんの技に感謝!

How do I detect a Word table with (horizontally) merged cells?

Check for merged cells with VBA

Finding merged cells

コメント

 

  • 2. Re:Re:【Wordマクロ】表中の結合されたセルを着色する

    >kinuasaさん

    コメントをありがとうございます。
    この記事には助けられました!

    こういうプロパティ追加してほしいですよね。

  • 1. Re:【Wordマクロ】表中の結合されたセルを着色する
    きぬあさです。
    ご紹介いただき、ありがとうございます。記事を書いた当時、苦肉の策としてXMLを使うという滅茶苦茶な処理に行きついたのですが、もうちょっと簡単な方法があると良いですよね。次期バージョンのWordで追加は・・・やっぱり難しいかな?(^^;
    kinuasa

 

-コード
-, ,