表の幅を最適化する(インデント維持)

別のデータからコピーした大きな表を貼り付けたり、ドラッグ操作で拡大しすぎたりすると、表が余白やページ端からはみ出してしまうことがあります。あるいは、ドラッグで調整した表のサイズが不ぞろいで恰好が悪くなったりします。このマクロはそうした表の幅をきれいに調整するものです。

表の幅をレイアウトに合わせて調整するマクロ

Public Sub 表の幅を最適化する()
    Dim varFit As Boolean
    With Selection.Tables(1)
        If .Tables.NestingLevel > 2 Or .Rows.LeftIndent = 0 Then
            .AutoFitBehavior wdAutoFitWindow
        Else
            '最大幅に(最大未満の解消)
            .PreferredWidthType = wdPreferredWidthPercent
            .PreferredWidth = 100
            '現在設定 [オプション]の[自動的にセルのサイズを変更する]
            varFit = .AllowAutoFit
            'インデントを保って幅を最適化
            .AllowAutoFit = True '下記機能の前提
            .PreferredWidthType = wdPreferredWidthAuto
            '設定を戻す
            .AllowAutoFit = varFit
            'Auto から Percentに戻すと値が変わる
            .PreferredWidthType = wdPreferredWidthPoints
        End If
    End With
End Sub

解説

このマクロは、メニューやダイアログボックスによる操作と同等機能を持つメソッドの組み合わせから成っています。

Table.AutoFitBehavior wdAutoFitWindow

[自動調整]-[ウィンドウ幅に自動調整]コマンドに相当するメソッドです。[左端からのインデント]の値が0にし、サイズを100%に指定するのと同等の動作になります。「ウィンドウ幅」の語が紛らわしいですが、レイアウト領域に応じた最大幅になります。配置先の領域からはみ出すことはありません。

このマクロでは、インデントがもともとの表と、ネストしている表(表の中にある表)に実行しています。表のインデントを気にしない場合は、すべての表を対象にこの処理をするだけでもOKです。

Table.PreferredWidthType

[幅を指定する]と[基準]の指定に相当するプロパティです。

wdPreferredWidthAuto : [幅を指定する]をオフ
大きすぎる表は領域幅に収まるようにリサイズされます。インデントは維持される点が上記の自動調整と異なります。

wdPreferredWidthPercent : [幅を指定する]をオン & [基準]に「パーセント(%)」

wdPreferredWidthPoints : [幅を指定する]をオン & [基準]に「ポイント(pt)」

処理遷移と表の状態

サイズを100%化する
幅の過大/過小をいったん解消します。インデント付きの場合はそのぶん領域からはみ出た状態になります。

[幅を指定する]をオフにする(自動幅にする)
はみ出た表を領域内に収まるようにリサイズします。なお、VBAから行う場合、事前にAllowAutoFit プロパティを True にしておかないと自動幅が適用されません。適用後は、AllowAutoFit プロパティを元に戻します。

[幅を指定する]をオンにし、[基準]に「ポイント(pt)」を指定する
複雑なので詳述は省きますが、VBAからの処理では仕上げにこうしておくのが無難です。後からダイアログボックスで「パーセント(%)」に切り替えるのは問題ありません。

Table.PreferredWidthプロパティと9999999の値

PreferredWidthは表の幅を取得/設定するプロパティです。しかし、これで表の幅の取得するとほとんどの場合9999999の値が返ります。この値はwdUndefinedという定数に相当するもので、「値が取得できない」ことを意味します。

ダイアログボックスでは値がしっかり表示されているのに、VBAからの取得は失敗するのです。このため、今回のサンプルでは、「フルサイズの表の幅を求めて…」というフローを避ける構造にしています。

 

タイトルとURLをコピーしました