お客様からの依頼で表の見栄えを整えるWordマクロを作成しています。
そのマクロで、表の1列目だけを両端揃えにする処理がありました。
表の1列目なので、Columns(1) プロパティで設定して処理をしたのですが、「実行時エラー 5992 セル幅がすべて同じではないため、このコレクションの個別の列にアクセスすることができません。」というエラーが出ました。
原因を調べたところ、Wordの表の列処理について癖があることがわかりました。
簡単なサンプルマクロを作ったので紹介します。
このマクロでできること
表の列1のセルのみ両端揃えにします。ショートカットキーで [Ctrl] + [J] で設定される段落書式ですね。
(マクロ実行前)
(マクロ実行後)
マクロの解説
処理対象の表を特定するために、Information(wdWithInTable)プロパティ を使います。
カーソルが表内にあるのかどうかを判定できます。
マクロ1は、セルの結合のない以下のような表では問題なく動作します。
しかし、以下の1行目のようにセルが複数の列で結合されている場合に、15行目のmyTable.Columns(1).Cellsでエラーになってしまいます。
なので、マクロ2では処理を少し工夫しました。
マクロ2では、15行目のようにmyTable.Range.Cells を使って表のセル1つ1つを判定しています。16行目のmyCell.ColumnIndex で列番号を取得し、セル毎に1列目であるのかどうかを判定して1列目のみを処理しています。
マクロ1(エラーが発生します)
Sub 表の列への処理1() Dim myTable As Table Dim myCell As Cell '処理対象の表をオブジェクト変数に設定 If Selection.Information(wdWithInTable) = True Then Set myTable = Selection.Tables(1) Else MsgBox "表内にカーソルを置いてください。" Exit Sub End If '1列目の両端揃え For Each myCell In myTable.Columns(1).Cells With myCell.Range.ParagraphFormat .Alignment = wdAlignParagraphJustify End With Next End Sub
マクロ2
Sub 表の列への処理2() Dim myTable As Table Dim myCell As Cell '処理対象の表をオブジェクト変数に設定 If Selection.Information(wdWithInTable) = True Then Set myTable = Selection.Tables(1) Else MsgBox "表内にカーソルを置いてください。" Exit Sub End If '1列目の両端揃え For Each myCell In myTable.Range.Cells If myCell.ColumnIndex = 1 Then With myCell.Range.ParagraphFormat .Alignment = wdAlignParagraphJustify End With End If Next End Sub