【コード】表の1列目を両端揃えにするWordマクロ

お客様からの依頼で表の見栄えを整える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

トップへ戻る