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マクロ (きぬあささんの記事)
ちなみにいくつかの記事を読みましたが、これらの記事では判定は難しいとされています。
きぬあささんの技に感謝!
How do I detect a Word table with (horizontally) merged cells?
Check for merged cells with VBA
コメント
-
2. Re:Re:【Wordマクロ】表中の結合されたセルを着色する
>kinuasaさん
コメントをありがとうございます。
この記事には助けられました!こういうプロパティ追加してほしいですよね。