🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の AutoFit — 列と行を内容にぴったり合わせる正しい方法

|

Excel VBA の AutoFit — 列と行を内容にぴったり合わせる正しい方法

TL;DR — AutoFit は 実行した瞬間に存在する 内容を測り、固定サイズを焼き付けます。これは スナップショット であって、生きたルールではありません。あとから長い値を入れれば、列はまた切れま す。だから AutoFit はマクロの 最後 の一行、すべての書き込みを終えたあとに置くべきものです。幅には Columns("A:D").AutoFit、高さには Rows("1:100").AutoFit を使い、部分的な範囲から始めるときは .EntireColumn を通さないと一行分にしか合いません。結合セルは行の AutoFit を静かに無効化します—— これが「何も起きない」ときの一番の原因です。

' AutoFit は「いま」あるものを測るので、データを書いたあとに走らせる。
Columns("A:D").AutoFit          ' 現在の最長値に列幅を合わせる
Rows("1:100").AutoFit           ' 行の高さを合わせる(折り返しや背の高い文字のときだけ伸びる)
Cells.EntireColumn.AutoFit      ' シート上の使用済み列すべてを一行で合わせる

' 部分的な範囲から始める場合は、範囲だけでなく列全体を広げる:
Range("A1:D1").EntireColumn.AutoFit

AutoFit は、二つの列見出しの境界をダブルクリックする操作——列を最も幅の広いセルにちょうど合わせる、 あの「列の幅の自動調整(オートフィット)」——のコード版です。レポートを組み立てるどんなマクロでも最 もよく使われる一行であり、同時に最も誤解されている一行でもあります。人はこれを、ずっと 正しいまま でいてくれる設定のように扱うからです。実際はそうではありません。これを「ある一瞬に取った測定値」と捉 えた瞬間、あらゆる奇妙な挙動——切れた列、伸びてくれない行、何もしていないように見える呼び出し——がすっ と腑に落ちます。

この記事で学べること

  • 考え方の軸——AutoFit は一度きりの測定であって、測り直し続けるルールではない
  • ほとんどのバグを防ぐ唯一のルール——データを書いたあと、最後 に走らせる
  • 幅と高さの違い——なぜ Columns.AutoFit は必ず動き、Rows.AutoFit はしばしば動かないのか
  • .EntireColumn で部分的な範囲を、Cells.EntireColumn.AutoFit でシート全体を合わせる
  • なぜ結合セルが行の AutoFit を静かに壊すのか
  • 自分で決めた固定幅が AutoFit の再実行に勝る場面

考え方の軸:ルールではなく、測定

AutoFit は、列の中の現在の最長値に定規をあて、その幅に固定するものだと思ってください。それがすべて で、鍵になる言葉は 現在 です。AutoFit は「常に十分な幅であれ」というルールを取り付けるわけではあ りません。セルを一度だけ読み、固定幅を設定して、去っていきます。そのあと列は、測った時点 にあったデ ータにたまたま合っている、ごく普通の固定幅の列になります。

だから定番の不満——「列を AutoFit したのにまた切れた」——はバグではありません。測ったあと、データが変わ っただけです。あとで長い文字列、大きな数値、幅の広い日付書式を受け取ったセルは、固定した幅からあふれ、 Excel は #### を表示します。AutoFit はあなたが頼んだとおりに動きました——ただ、それが問うたのは「過 去」についての問いだったのです。ここさえ握れば、この記事の残りはすべて常識になります。

最も大事なルール:AutoFit は最後に走らせる

AutoFit は 現在の 内容を測るので、最もよくある間違いは、内容が存在する前に走らせてしまうことです。

Columns("A:D").AutoFit          ' 誤り:列はまだ空 - 何もないものに合わせてしまう
' ... A:D に見出しとデータを書き込むコード ...

ここではマクロが空の四列を髪の毛のような細さに合わせ、そのあと埋めるので、すべてが切れてしまいます。 対処は習慣です。AutoFit はマクロが範囲に対して行う最後の操作であって、決して最初の操作ではない。 見出しを書き、データを書き、数値書式を適用し、それから AutoFit します。書き込みと書式設定を両方や るルーチンなら、AutoFit の呼び出しを一番最後に置いて、仕上がった成果物を測らせましょう。同じルールは 組み立てループの中でも効きます——一行書くたびに AutoFit するのではなく、全行を書いてから、ブロックを 一度だけ AutoFit してください。

幅は必ず動く。高さはしばしば動かない

Columns.AutoFit と Rows.AutoFit は対称に見えて、振る舞いは違います。その理由を知っておくと、午後 まるまるを節約できます。列の AutoFit は最長値の 幅 を測り、合わせるべきものはほぼ必ずあるので、毎回 目に見えて動きます。行の AutoFit は内容が必要とする 高さ を測ります——そして普通の一行のセルはちょ うど既定の高さで足りるので、行の AutoFit は「何もしない」ように見えるのです。

行の高さが伸びるのは、セルが本当に一行より背が高いときだけです——折り返しをオンにしたテキスト、ハード な改行(Chr(10))を含むテキスト、あるいは大きなフォントです。これが AutoFit と 折り返し表示 の本当のつながりです。折り返しをオンにすると、固定した列幅の 内側 でテキストが数行に折りたたまれ、そのとき初めて Rows.AutoFit に測るべき背の高い形が生まれ、 行を伸ばして中身を見せます。折り返しなしで固定幅のまま行の高さを AutoFit しても、なぜ何も起きないのか と悩み続けることになります。

部分的な範囲を合わせる、そしてシート全体

AutoFit が広げるのは 列 ですが、範囲から呼び出すこともできます——そしてそれが罠です。部分的な範囲 に対して呼ぶと、その範囲の中の セルだけを使って列を合わせます。

Range("A1:D1").AutoFit          ' 1 行目だけで A:D を合わせる - たいてい狭すぎる
Range("A1:D1").EntireColumn.AutoFit  ' それらの列のすべてのセルで A:D を合わせる

一行目は見出し行だけを測って下のデータを無視するので、結果はほぼ必ずきつすぎます。始点が列全体ではな くセルのブロックであるときは、いつも .EntireColumn(高さなら .EntireRow)に手を伸ばしましょう。シ ート全体を一文で合わせるなら Cells.EntireColumn.AutoFit です——引数なしの Cells はすべての使用済 みセルを指し、.EntireColumn がそれをデータを含むすべての列へと引き上げます。ほとんどのレポートマク ロが締めに置く、きれいな一行です。

AutoFit が静かに何もしない場所:結合セル

最も紛らわしい失敗は、あなたのコードが間違っていることとは無関係です。行の AutoFit は結合セルを含 む行を無視します。 これは古くからある Excel の制限です。結合セルは複数の列にまたがることがあり、Excel はどの列に高さを吸収させるべきか決められないので、行のリサイズそのものを拒みます。結合したタイトルセ ルで折り返しをオンにして Rows.AutoFit を呼んでも、行は一行分のまま、テキストは切れたままです——エラ ーも警告もありません。

レポートが見出しに結合セルを頼っているなら、そこでは行の AutoFit をあてにできません。自分で計算した明 示的な RowHeight を設定するか、結合を避けるしかありません(横位置の「選択範囲内で中央」を使えば、結 合なしで見た目だけを得られます)。これは、マクロが保守しなければならないものにおいて 結合セル が見合う以上の手間を生む、もう一つの理由です。

固定幅が AutoFit に勝るとき

AutoFit は 最終の スナップショットには完璧です——レポートを組み終え、データが落ち着き、引き渡しやエ クスポートの前に各列を一度だけサイズ調整したいときです。生きている シートには向かない道具です。数値 が更新されるダッシュボードでは、変更のたびに AutoFit を走らせると、値が伸び縮みするたびに列が飛び跳 ね、しかも編集のたびに何千もの列を AutoFit するのは本当に遅いのです。そこで欲しいのはスナップショット ではなく ルール です。自分で決めた明示的な 列幅 を設定し (Columns("A:D").ColumnWidth = 14)、データが何をしてもレイアウトが安定するようにします。判断はシン プルです。内容が仕上がっていて 一度だけ 合わせたいなら AutoFit、内容が変わり続けてレイアウトを保ちた いなら固定幅、です。

ExcelMaster の活用

AutoFit は些細に見えて、静かに午後をまるごと奪います——呼び出しが書き込みの下ではなく上に置かれて空の 列に合ってしまう、部分的な範囲が見出し行だけに合う、結合したタイトルが伸びずに送付コピーでテキストが 切れる。どれもエラーを出さないので、誰かが #### を見て初めて気づくのです。

ExcelMaster には、やりたいことを そのまま伝えられます——「すべての列をデータに合わせて」「この説明列を折り返して伸ばして」——すると、 AutoFit をルーチンの終わりのあるべき場所に書き、範囲から始めるときは .EntireColumn を通し、折り返し を行の AutoFit と組み合わせて背の高いテキストが実際に見えるようにし、結合セルのせいで AutoFit が仕事 をできないときには警告します。ブックとコードはあなたの手元に残ります。

よくある質問

VBA の AutoFit が効かないのはなぜ?

ほぼ必ず三つのうちのどれかです。データを書く 前 に AutoFit を走らせて空のセルを測ってしまったなら ——呼び出しをルーチンの終わりに移します。部分的な範囲に対して呼んで、そのわずかなセルだけに列を合わせ てしまったなら——代わりに .EntireColumn.AutoFit を使います。行に結合セルが含まれていて、行の AutoFit が仕様上それを無視しているなら——そこでは明示的な RowHeight を設定します。

VBA でシート上のすべての列を AutoFit するには?

Cells.EntireColumn.AutoFit を使います。引数なしの Cells はすべての使用済みセルを指し、.EntireColumn がそれをデータを持つすべての列へと引き上げるので、シート全体が一行で合います。行も一緒にするなら Cells.EntireRow.AutoFit を足します。ブロックに限定するなら列を名指しします——Columns("A:H").AutoFit。

Columns.AutoFit と Rows.AutoFit の違いは?

Columns.AutoFit は各列の 幅 を最長値に設定し、ほぼ毎回目に見えて動きます。Rows.AutoFit は各行の 高さ を表示すべき内容に設定しますが、普通の一行のセルはすでに既定の高さで足りるので、セルが背の高い とき——折り返したテキスト、ハードな改行、大きなフォント——だけ変化します。行の高さと折り返しはセットで 考えるものです。

AutoFit で行の高さが変わらないのはなぜ?

内容がまだ一行に収まっているからです。行の高さは本当に背の高い内容に対してだけ伸びます。WrapText = True をオンにし(テキストが折り返す相手を持てるよう、列幅は固定して)、あるいはハードな改行を使い、それか ら Rows.AutoFit を呼びます。行に結合セルが含まれていると、AutoFit はまったくリサイズしません——これ は別個の Excel の制限です。

AutoFit と固定の列幅、どちらを使うべき?

データが仕上がっていて各列を一度だけサイズ調整したいなら AutoFit——これからエクスポートや引き渡しをす るレポートです。ダッシュボードのように更新され続けるシートには固定の ColumnWidth を設定します。固定 幅はレイアウトを安定させ、列が飛び跳ねるのを防ぎ、更新のたびに多くの列で AutoFit を走らせるよりずっと 速いのです。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-10。

関連ガイド: VBA 折り返し表示 · VBA ウィンドウ枠の固定 · VBA 列幅と行の高さ · VBA セルの結合 · VBA Range