【入門編】【初心者向け】セル内のテキスト量に応じて、行の高さを自動調整するマクロ – Word VBA解析バイブル

スポンサーリンク
スポンサーリンク

「マクロの記録」を卒業しよう。Word VBAで表のレイアウト崩れを支配する技術

こんにちは。プログラミングの世界へようこそ。

Word VBAを学び始めたばかりの頃、多くの人が「マクロの記録」という魔法の杖を使います。「これをクリックして、次にこれを入力する」……その操作を記録してくれる機能は、確かに強力です。

しかし、ある時あなたは壁にぶつかるはずです。
「マクロでセルに長い文章を流し込んだら、文字がセルからはみ出したり、行が重なったりして、見た目がボロボロになってしまった……」

もしあなたが今、そんな経験をしているなら、おめでとうございます。あなたは「単なる操作の自動化」から、「プログラムによる制御」へと進化する入り口に立っています。

今日は、表(Table)のレイアウトを自在に操るための、もっとも基本的で、かつもっとも重要な「行の高さの自動調整」について、その本質を解説していきましょう。ここをクリアすれば、Word VBAの基本はバッチリですよ。

なぜ「マクロの記録」ではレイアウトが崩れるのか?

マクロの記録は、あくまで「あなたのマウスとキーボードの動き」を記録しているだけです。

例えば、セルに文字を入力する動作を記録しても、Wordは「文字の量に合わせて行の高さを広げる」という判断までは記録してくれません。その結果、固定された行の高さの中に、溢れ出したテキストが潜り込んでしまうのです。

これを解決するには、「記録」ではなく、オブジェクト(表や行)に対して「指示(メソッドやプロパティの設定)」を出す必要があります。

核心:行の高さを制御する「HeightRule」

Wordの表において、行の高さがどう振る舞うかは、`HeightRule`(高さのルール)というプロパティが決定しています。

ここが、エンジニアとしての腕の見せ所です。主に使うのはこの3つです。

1. `wdRowHeightAtLeast` (最小値指定): 「最低でもこれくらいの高さは確保してね。でも、文字が増えたら自動で広げてね」という、もっとも柔軟な設定。
2. `wdRowHeightExactly` (固定値指定): 「文字が溢れようが何だろうが、絶対にこの高さで固定して!」という、厳格な設定。
3. `wdRowHeightAuto` (自動): Wordのデフォルトに近い挙動。

初心者が陥りやすいのは、意図せず「固定値(Exactly)」が設定されたままになってしまうパターンです。これを「自動(AtLeast)」に書き換えるコードを書くことができれば、レイアウト崩れは未然に防げます。

実践:セル内のテキスト量に合わせて行の高さを変えるコード

それでは、実際に使えるコードを見てみましょう。
このコードは、「現在カーソルがある表」に対して、すべての行の高さ設定を「文字量に合わせて自動調整」するように書き換えるものです。

Sub AdjustTableRowHeightDynamically()
    ' ===========================================================
    ' 目的: カーソル位置にある表の行の高さを、テキスト量に応じて
    '       自動調整(AutoFit)するように設定する。
    ' ===========================================================
    
    Dim targetTable As Table
    
    ' 1. まず、現在カーソルがある場所が「表の中」かどうかをチェック
    ' これを怠ると、表の外で実行した時にエラーで止まってしまいます(重要!)
    If Selection.Information(wdWithInTable) = False Then
        MsgBox "エラー: カーソルが表の中にありません。表の中にカーソルを置いて実行してください。", vbExclamation
        Exit Sub
    End If
    
    ' 2. カーソルが含まれている表を変数に格納(オブジェクトの取得)
    ' Selection.Tables(1) は「今いる場所の表」を指します
    Set targetTable = Selection.Tables(1)
    
    ' 3. 表全体のレイアウト崩れを防ぐための「魔法の指示」
    On Error GoTo ErrorHandler ' 万が一のエラーに備えるプロの作法
    
    With targetTable
        ' --- 行の高さ設定 ---
        ' すべての行に対して「文字量に応じて最小限の高さまで広がる」設定を適用
        .Rows.HeightRule = wdRowHeightAtLeast
        
        ' --- 列の幅設定 (おまけ) ---
        ' 列の幅も、コンテンツ(文字量)に合わせて最適化する
        ' これにより、横方向のはみ出しも防げます
        .AutoFitBehavior (wdAutoFitContent)
    End With
    
    MsgBox "表のレイアウト調整が完了しました!", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "予期せぬエラーが発生しました: " & Err.Description, vbCritical
End Sub

コードの解説(ここが学びのポイント!)

  • `Selection.Information(wdWithInTable)`:

これは「今、表の中にいますか?」という判定です。プログラミングにおいて、「想定外の状況でエラーを出さないこと」は、非常に高いスキルとみなされます。

  • `With targetTable … End With`:

これは「今から `targetTable` について何度も命令を出すよ」という宣言です。コードがスッキリし、処理速度も向上します。

  • `.Rows.HeightRule = wdRowHeightAtLeast`:

今回の主役です。「文字量に合わせて行を広げる」という意思表示です。

  • `.AutoFitBehavior (wdAutoFitContent)`:

行だけでなく、列の幅も文字量に合わせてギュッと最適化します。これで「横に長すぎる表」も解決します。

陥りやすい罠:なぜか高さが変わらない時は?

もし、上記のコードを実行しても高さが変わらない場合、以下の2点を確認してください。

1. セルの「余白」設定:
セルの上下余白が極端に大きく設定されていると、見た目が変わらないことがあります。
2. 行の高さが「固定値」で上書きされている:
手動で表のプロパティから「行の高さ:固定値」を選んでいると、VBAで制御する際に予期せぬ挙動をすることがあります。マクロを実行する前に、一度表のプロパティを確認してみてください。

まとめ:オブジェクトの「性質」を理解しよう

「マクロの記録」は、あなたの「動き」を真似します。
しかし、今回学んだ「VBA」は、Wordが持つ「表(Table)」というオブジェクトの「性質(Property)」を直接書き換える作業です。

  • 動きを記録するのではなく、ルール(Property)を書き換える。

この視点を持てたなら、あなたはもう初心者ではありません。次からは、「このオブジェクトには、どんなルール(プロパティ)が備わっているんだろう?」と探求してみてください。それが、伝説的なエンジニアへの第一歩です。

一歩ずつ、着実に。応援していますよ!

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