TL;DR — サイズ設定は 列や行の全体 のプロパティで、2 つの寸法は 異なる単位 を使います。
ColumnWidthは標準フォントの 文字数、RowHeightは ポイント です。だからColumnWidth = 10とRowHeight = 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 で列幅と行の高さを設定するには?
列や行の全体に ColumnWidth と RowHeight を代入します。Columns("A").ColumnWidth = 20 と
Rows(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
