【ExcelVBA・マクロ】行の高さを自動調整する方法|AutoFitが効かない結合セルへの対処法も解説【コピペOK】

ExcelVBA

セルに長い文章を入力して折り返し表示にすると、行の高さが足りずに文字が途中で見切れてしまうことがあります。手動でドラッグして高さを調整するのは簡単ですが、行数が多い表や、マクロで自動生成した表ではその都度手作業をするわけにはいきません。

この記事では、EntireRow.AutoFit を使った基本的な行高さの自動調整方法と、AutoFitが正しく効かない「結合セル」のケースへの対処法をVBAコードで解説します。

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

行の高さ自動調整の基本:AutoFitメソッド

Excelには、セルの内容に合わせて行の高さを自動計算してくれる AutoFit メソッドがあります。対象の行(Rowsオブジェクト)に対して呼び出すだけで、折り返しテキストの行数に応じた最適な高さに調整されます。

Sub AutoFitAllRows()

    Dim ws As Worksheet
    Set ws = ActiveSheet

    'シート全体の行の高さを内容に合わせて自動調整する
    ws.Rows.AutoFit

End Sub

特定の範囲だけ調整したい場合は、対象範囲の EntireRow に対して AutoFit を実行します。

Sub AutoFitSelectedRange()

    Dim targetRange As Range
    Set targetRange = ActiveSheet.Range("A2:D100")

    '選択範囲に含まれる行だけを自動調整する
    targetRange.EntireRow.AutoFit

End Sub

表を作成した直後や、セルの値を書き換えた直後にこのマクロを実行すれば、見た目の崩れを防げます。

注意点:折り返し設定がないと効果がない

AutoFit は、対象セルの WrapText(折り返して全体を表示する)がTrueになっていないと、複数行の高さを正しく計算できません。折り返し設定を忘れると、文字が1行分の高さのまま切れてしまうため、AutoFitを実行する前に折り返し設定も済ませておきましょう。

Sub SetWrapAndAutoFit()

    Dim targetRange As Range
    Set targetRange = ActiveSheet.Range("A2:D100")

    targetRange.WrapText = True
    targetRange.EntireRow.AutoFit

End Sub

AutoFitが効かないケース:結合セル

AutoFit には大きな弱点があります。それは、結合セルに対しては正しく高さを計算できないということです。結合セルにAutoFitを実行しても、実際の文字数に関わらず行の高さが変わらない、あるいは1行分の高さで止まってしまうことがあります。

これはExcelの仕様上の制限のため、結合セルの高さを自動調整したい場合は、次のような回避策を使います。

対処法:非表示シートで文字数から高さを逆算する

考え方はシンプルで、「結合セルと同じ幅・同じフォントの単一セル」を非表示シート上に作り、そのセルにテキストを入れてAutoFitを実行し、計算された高さを結合セル側に反映させるという方法です。

Sub FitMergedRowHeight(targetCell As Range)

    Dim helperSheet As Worksheet
    Dim helperCell As Range
    Dim totalWidth As Double
    Dim col As Range

    If Not targetCell.MergeCells Then
        targetCell.EntireRow.AutoFit
        Exit Sub
    End If

    '計算用の非表示シートを一時的に作成する
    Set helperSheet = ThisWorkbook.Worksheets.Add
    helperSheet.Visible = xlSheetVeryHidden

    '結合セル全体の幅を合計する
    totalWidth = 0
    For Each col In targetCell.MergeArea.Columns
        totalWidth = totalWidth + col.Width
    Next col

    Set helperCell = helperSheet.Range("A1")
    helperCell.ColumnWidth = totalWidth / 7#
    helperCell.Value = targetCell.Value
    helperCell.WrapText = True
    helperCell.Font.Name = targetCell.Font.Name
    helperCell.Font.Size = targetCell.Font.Size

    helperSheet.Rows(1).AutoFit

    '計算された高さを結合セルの行に反映する
    targetCell.EntireRow.RowHeight = helperSheet.Rows(1).RowHeight

    '一時シートを削除する
    Application.DisplayAlerts = False
    helperSheet.Delete
    Application.DisplayAlerts = True

End Sub

呼び出す側では、結合セルを1つずつ渡してループ処理します。

Sub AdjustAllMergedRows()

    Dim ws As Worksheet
    Dim r As Long

    Set ws = ActiveSheet

    For r = 2 To 100
        FitMergedRowHeight ws.Cells(r, "A")
    Next r

End Sub

ColumnWidth に指定する値は文字数単位のため、ピクセルやポイント単位の Width プロパティとは換算が必要です。上記コードでは簡易的に7で割って近似していますが、フォントによって多少の誤差が出る点は留意してください。厳密に合わせたい場合は、実際の環境で数値を微調整することをおすすめします。

実務で使うときのポイント

  • 大量の行に対して1行ずつ非表示シートを作成すると処理が遅くなるため、AdjustAllMergedRows のように非表示シートは使い回さず毎回作り直すのではなく、ループの外で1回だけ作成し使い回す形に変更すると高速化できます。
  • 通常のセル(結合していないセル)であれば、Rows.AutoFit だけで十分対応できます。結合セルが含まれる表だけ、上記の回避策を適用するとよいでしょう。
  • マクロの実行後に画面がちらつく場合は、Application.ScreenUpdating = False を処理の前後に入れると改善します。

まとめ

この記事では、行の高さを自動調整する基本の AutoFit メソッドと、それだけでは対応できない結合セルのケースへの対処法を紹介しました。通常のセルであれば Rows.AutoFit の1行で済みますが、結合セルを含む帳票やレポートを扱う場合は、非表示シートを使った高さの逆算処理が必要になります。

表の見た目が崩れて文字が見切れてしまうと、資料としての完成度も下がってしまいます。行の高さ調整をマクロに組み込んで、常にきれいな表を保てるようにしておきましょう。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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