🚀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 — サイズ設定は 列や行の全体 のプロパティで、2 つの寸法は 異なる単位 を使います。 ColumnWidth は標準フォントの 文字数RowHeightポイント です。だから ColumnWidth = 10RowHeight = 10 は、どんな意味でも同じサイズではありません。罠は AutoFit です — これは列や 行の全体でしか動かず(Columns("A:C").AutoFit または rng.EntireColumn.AutoFit)、表示された テキストを測るので、結合セルを静かに無視します。

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
ws.Columns("A:C").AutoFit                 ' A:C を最も広い内容に合わせる
ws.Columns("D").ColumnWidth = 18          ' 標準フォントの 18 文字分
ws.Rows(1).RowHeight = 28                 ' 28 ポイント

サイズ変更は、書式設定ファミリーの中で最も単純なものに見えますし、たいていはそのとおりです — AutoFit が何もしなかったり、設定した幅が思っていた幅と一致しなかったりするまでは。どちらも同じ 根から来ています。本ガイドが軸にする考えです。サイズを変えるのは列や行の全体で、幅と高さは 異なる単位で話す。 そこを握れば、読み取り専用の .Width プロパティ、AutoFit のルール、そして 「なぜこれは隠れないのか」という混乱がすべて解けます。

この記事で学べること

  • 考え方の軸 — サイズを変えるのは列や行の全体で、2 つの異なる単位を使う
  • 最も大事なルール — AutoFit は列や行の全体を必要とし、表示を測る
  • ColumnWidth(文字数)対 読み取り専用の .Width(ポイント)
  • RowHeight、折り返し、そして行がひとりでに広がるとき
  • AutoFit の盲点 — 結合セル
  • 列を正しく隠す方法、そして幅ゼロが罠である理由

考え方の軸:サイズを変えるのは列や行の全体、単位は 2 つ

幅と高さはセルには属しません — それらは、セルが収まっている列と行に属します。セルから たどり着く ことはできますが、値は行や列の全体に適用されます。

ws.Range("D5").EntireColumn.ColumnWidth = 18   ' D5 だけでなく、D 列 全体 を広げる
ws.Range("D5").EntireRow.RowHeight = 28        ' 5 行目 全体 の高さを変える

モデルの後半は単位で、ここが人をつまずかせる部分です。ColumnWidth文字数 で測ります — 具体的には、標準スタイルのフォントの 0 の数字が列にいくつ収まるか(既定の 8.43 はおよそ 8 個の ゼロを意味します)。RowHeightポイント で測り、これはフォントサイズと同じ 1/72 インチの 単位です。2 つの数値は比較できず、両者の間にきれいな変換もありません。一方はフォントに依存し、 もう一方は依存しないからです。レイアウトがおかしく見えるとき、それはたいてい、ポイントであるかの ように考えられた幅の値です。

最も大事なルール:AutoFit は列や行の全体を必要とする

AutoFit は内容に合わせてサイズを変える最速の方法で、1 つの固い要件があります。列の全体か行の 全体に対して呼ばなければならない ことです。任意のセル範囲に対しては決してできません。

ws.Columns("A:C").AutoFit          ' OK - 列の全体
ws.Rows("1:5").AutoFit             ' OK - 行の全体
ws.Range("A1:C5").EntireColumn.AutoFit   ' OK - 先に列の全体へ格上げ

ws.Range("A1:C5").AutoFit          ' 誤り - セルのブロックは行でも列でもない -> error 1004

直し方はいつも同じです。まず .EntireColumn.EntireRow で範囲を行や列の全体へ格上げします。 ルールの後半はもっと微妙です — AutoFit は格納されているものではなく、表示されているものを測る。 最も広い 描画された テキストに合わせるので、"0" として表示される数値の列は、下にある 5.4999 ではなく 5 に合わせます。そして、内容が狭い NumberFormat の裏に 隠れている列は、値ではなく書式に合わせます。

ColumnWidth 対 読み取り専用の Width

幅のプロパティは 2 つあり、設定できるのはそのうち 1 つだけです — 「なぜこれはコンパイルできないのか」 という混乱のよくある源です。

  • ColumnWidth設定可能 で、文字数で測ります。代入する相手はこちらです。
  • .Width読み取り専用 で、ポイントで測ります。画面上での範囲の描画された幅を教えて くれますが、代入はできません — Columns("A").Width = 100 は失敗します。
ws.Columns("A").ColumnWidth = 20          ' 設定する - 文字数
Debug.Print ws.Columns("A").Width          ' 読む - ポイント (別の数値)

列を特定のポイント数やピクセル数に合わせる必要があるとき、直接のセッターはありません。 ColumnWidth を文字数で設定し、それから .Width を読み戻して、ポイントが合うまで短いループで 調整します。これは設計上、手間がかかります — Excel の列幅は常に文字の尺度であり、.Width は後付けで 読み取り専用の便宜として取り付けられたものだからです。

RowHeight と折り返し

ポイント単位の RowHeight は素直ですが、知っておく価値のある振る舞いが 1 つあります。セルの 折り返し(wrap text)がオンのとき、Excel は折り返した行に合わせて行の高さを自動的に広げます — ただし 明示的な RowHeight を設定していない場合に限ります。設定するとそれが高さを固定し、 テキストを切り取ることがあります。

ws.Range("B2").WrapText = True     ' 長いテキストを複数行に折り返させる
ws.Rows(2).EntireRow.AutoFit       ' 折り返したテキストに合わせて行を広げる
' このあと Rows(2).RowHeight = 15 を設定しないこと - それが高さを固定し、折り返しを切り取る

目安はこうです。折り返した内容に行を合わせたいなら、WrapText をオンにして、AutoFit(または Excel の自動的な伸長)にサイズを任せましょう。そのあとで固定の RowHeight を設定するとそれを 上書きし、折り返したテキストが切れてしまう原因になります。

AutoFit の盲点:結合セル

最も時間を無駄にするのがこれで、VBA Merge Cells にまっすぐつながります。 AutoFit は結合セルを無視します。 背の高い内容が結合された折り返しセルだけという行は、それに 合わせて広がり ませんAutoFit は非結合のセルを測り、余分な高さを必要とするものが見えないので、 テキストは切れたままです。これは、結合セルがコードで問題を起こすもう 1 つの理由です。結合セルを 読めるようにするために手を伸ばすまさにそのコマンドを、結合セルが無力化するのです。結合された 折り返しブロックをどうしても保つなら、その RowHeight を明示的に設定します(テキストを測り、高さを 自分で計算します)。より良いのは、結合を避けて Center Across Selection を使うことで、これは AutoFit が 見られます

列を隠す:幅ゼロではなく

列を隠す魅力的な近道は、幅をゼロに設定することです。こらえましょう — VBA Hide Columns で扱った .Hidden プロパティを使います。

ws.Columns("B").Hidden = True      ' 正しいやり方 - 元に戻せて、わかりやすく、元の幅を復元する
ws.Columns("B").ColumnWidth = 0    ' 罠 - "隠れる" が、元の幅を失っている

Hidden = True は列の本当の幅を覚えていて、再表示するときにそれを復元します。ColumnWidth = 0 は その幅を捨ててしまい — あとで再表示するには、それがいくつだったかを当てずっぽうで決めることに なります — そして幅ゼロの列は、あとで誰かがデータが欠けているように見える理由を訝しむとき、 見落としやすいのです。幅はサイズ設定のためのもの。表示・非表示には Hidden を使いましょう。

ExcelMaster の活用

サイズ設定は、見た目以上に多くの落とし穴を隠しています。幅と高さの 2 つの異なる単位、セル範囲で エラーになり結合セルを静かに飛ばす AutoFit、読めても設定はできない .Width、そして元のサイズを 失う幅ゼロの「非表示」。そのどれもが静かに失敗します — 切れたテキスト、予想外の数値、あるいは 戻ってこない列。

ExcelMaster なら、レイアウトに 何をさせたいかを言うだけで済みます。「A 列から C 列を自動調整して、1 行目に少し余裕を持たせて」と 頼めば、AutoFit を呼ぶ前に範囲を EntireColumn へ格上げし、RowHeight をポイントで設定し、 テキストが流れる必要のある場所では WrapText をオンにし、幅ゼロではなく .Hidden で列を隠します。 ブックもコードもあなたの手元に残り、AutoFit が結合セルを一度も見なかったせいで切れて出てきた レイアウトを飛ばせます。

よくある質問

Excel VBA で列幅と行の高さを設定するには?

列や行の全体に ColumnWidthRowHeight を代入します。Columns("A").ColumnWidth = 20Rows(1).RowHeight = 28 です。単位が違うことを忘れずに — ColumnWidth は標準フォントの文字数、 RowHeight はポイント — なので同じ数値でもそれぞれ違うサイズを意味します。セルからは、 Range("A1").EntireColumn.ColumnWidth を使って列の全体のサイズを変えます。

VBA で列を AutoFit するには?

列や行の全体に対して AutoFit を呼びます。Columns("A:C").AutoFit または Range("A1:C5").EntireColumn.AutoFit です。Range("A1:C5").AutoFit のような素のセル範囲に対して AutoFit を呼ぶと error 1004 になります。AutoFit は列や行の全体でしか働かないからです。まず .EntireColumn.EntireRow で範囲を格上げしましょう。

結合セルで AutoFit が効かないのはなぜ?

AutoFit は結合セルを無視します — 非結合の内容だけを測るので、背の高い内容が結合された折り返しセルに ある行は、それに合わせて広がらず、テキストは切れたままになります。その行の RowHeight を明示的に 設定するか、結合を避けて AutoFit が測れる Center Across Selection を使いましょう。

VBA の ColumnWidth と Width の違いは?

ColumnWidth は設定可能で、標準フォントの文字数で測ります — これが代入する相手のプロパティです。 .Width は読み取り専用でポイントで測ります。描画された幅を報告しますが、設定はできません。特定の ポイント数に合わせるには、ColumnWidth を文字数で設定し、それから .Width を読み戻して、一致 するまで調整します。

VBA で列を隠すのに列幅をゼロにすべき?

いいえ。Columns("B").Hidden = True を使いましょう。これは列を元に戻せる形で隠し、再表示するときに 元の幅を復元します。ColumnWidth = 0 を設定すると元の幅を捨て、列を見落としやすくし、あとでサイズを 当てずっぽうで決めさせられます。幅はサイズ設定のために取っておき、表示・非表示には Hidden を 使いましょう。

検証環境

動作確認: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-14。

関連ガイド: VBA Hide Columns · VBA Merge Cells · VBA Borders · VBA Range · VBA With