🚀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;DRAutoFit実行した瞬間に存在する 内容を測り、固定サイズを焼き付けます。これは スナップショット であって、生きたルールではありません。あとから長い値を入れれば、列はまた切れま す。だから 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.AutoFitRows.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