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
