TL;DR — 結合は書式設定では ありません。
Range("A1:C1").Mergeは 3 つのセルを 3 列に またがる 1 つのセルに融合し、残るのは 左上 の値だけ —B1とC1は警告なしに消去されます。 そして結合されたブロックは、並べ替え、Rangeの計算、列の挿入、ループを壊します。タイトルを 数列にまたがって中央に置きたいだけなら、Center Across Selection (HorizontalAlignment = xlCenterAcrossSelection)を使いましょう。見た目は同じなのに、すべての セルが独立したままです。
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
' これは中央揃えのタイトルに 見える - そして B1 と C1 を静かに削除する。
ws.Range("A1:C1").Merge
' すべてのセルを別々に保つ、そっくりさん:
ws.Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection
セルの結合は、書式設定ファミリーの中で唯一、見た目だけの操作ではありません。 Font、Interior、NumberFormat は、セルがどう 見える かを変えるだけで、その中身には決して触れません。結合はその逆です。 グリッドそのもの を変え、その過程でデータを破壊します。本記事は、たった 1 つの区別を軸に 組み立てられています — 結合は構造的であって、見た目ではない — なぜなら、この先で起きる結合 セルの頭痛はどれも、データモデルの変更を書式設定の選択であるかのように扱ったことの帰結だから です。
この記事で学べること
- 考え方の軸 — 結合は見た目だけでなく、グリッドを変える
- 最も大事なルール — 結合を生き延びるのは左上の値だけ
Merge・UnMerge・MergeCells・MergeArea— 実際に使う 4 つ- 結合セルが並べ替え・
Rangeの計算・挿入・ループを壊す、その正確な仕組み - セルを独立に保つそっくりさん — Center Across Selection
- 結合セルをコードで安全に見つけて片付ける
考え方の軸:結合は見た目ではなくグリッドを変える
結合されたセルは、同じ中身を持つ大きなセルではありません — それは新しい構造的なオブジェクトです。
かつて 3 つの独立したセルがあった場所に、いまやアドレスが左上(A1)で、占有範囲(MergeArea)が
A1:C1 である 1 つのセルがあります。B1 と C1 は座標としては依然として存在しますが、いまや空で
使えません。それらが持っていたものは消えています。
だからこそ、見た目クラスターのルール — 「書式設定は値を決して変えない」 — はここでは当てはまり ません。結合はそれを証明する例外です。以下のすべては、それを真剣に受け止めることから導かれ ます。結合がグリッドを書き換えて値を消すのなら、あとでそのグリッドを並べ替えたり、挿入したり、 ループしたり、算術を行ったりするコードは、想定しているきれいな長方形にもはや一致しない形に対処 しなければなりません。
最も大事なルール:残るのは左上の値だけ
一度言っておきます。Merge は左上のセルの値を残し、あとは捨てる。 手作業で結合すると Excel は
これについての警告ダイアログを出しますが、VBA にはダイアログがありません — ただそうなるだけです。
ws.Range("A1").Value = "Q3"
ws.Range("B1").Value = "Region"
ws.Range("C1").Value = "Total"
ws.Range("A1:C1").Merge ' A1 は "Q3" を保つ; "Region" と "Total" は 消去される
Debug.Print ws.Range("B1").Value ' 何も表示されない - B1 は今や空
データを失いたくないなら、値を保持しているセルにまたがって結合してはいけません — 空の範囲だけを 結合するか、先に値を外へ移しましょう。「ヘッダーを整えるだけ」のマクロが、ラベルの 2 列を静かに 削除できてしまうのはこのためです。結合は配置に見えて、実は削除だったのです。
ここに頼れる安全網はありません。リボンの結合ボタンとは違い、VBA の .Merge は警告をいっさい出さず、
使用中のデータの上から結合するのを止めるものは何もありません。ですから確認は自分で行い、空だとわかって
いる範囲だけを結合してください。Application.DisplayAlerts = False で警告を抑えても(大量処理のマクロ
ではよくあります)、隠せるのは警告だけで、データの喪失は決して隠せません。警報を切っても、火事が安全に
なるわけではありません。
Merge・UnMerge・MergeCells・MergeArea
結合でやることのすべては、4 つのメンバーでカバーできます。
ws.Range("A1:C1").Merge ' 1 つのセルに融合する (左上の値が勝つ)
ws.Range("A1:C3").Merge Across:=True ' 各 行 を別々に結合 - 1 つのブロックではなく、3 つの 1x3 結合
ws.Range("A1").UnMerge ' 結合ブロックを個々のセルに分割し直す
Debug.Print ws.Range("B1").MergeCells ' B1 が結合セルの一部なら True
Debug.Print ws.Range("B1").MergeArea.Address ' "$A$1:$C$1" - B1 が属するブロック全体
2 つはじっくり見る価値があります。Merge Across:=True は行方向のバリエーションで — 範囲の各行を
独立に結合します。これは繰り返される行タイトルに欲しいもので、名前からはまず自明ではありません。
そして MergeArea はあなたを救うプロパティです。結合ブロック内の 任意の セルを与えると、ブロック
全体を返すので、正確な境界を知らなくても読んだり結合を解除したりできます。
結合セルがマクロを壊す仕組み
これが実際のコストであり、経験ある開発者がデータ範囲での結合を避ける理由です。4 つのものが 壊れます。
- 並べ替えがエラーを投げます。 結合セルを含む範囲を並べ替えると、Excel は 「この操作を行うには、 結合したセルをすべて同じサイズにする必要があります。」 を出します。結合されたヘッダーが 1 つ あるだけで、VBA Sort を止められます。
Rangeの計算が嘘をつきます。 結合されたA1:C1は.MergeArea.Columns.Countを 3 と報告 しますが、値としてはA1にある 1 つのセルのように振る舞います。値ごとに 1 列を想定するコードは 数え間違えます。- 挿入と削除がブロックされます。 結合ブロックの真ん中を通る列は挿入も削除もできません — Excel が拒むので、問題ないと思っていたレイアウトで 構造的な編集 が失敗 します。
- ループがセルを飛ばします。
For Each c In Range("A1:C1")はA1(値あり)を訪れ、次にB1、C1を 空 のセルとして訪れます — 結合はそれらを 1 回の反復にしたのではなく、そのうち 2 つを 空白にしたのです。
これらのどれも「結合が原因だ」と名乗り出てはくれません。並べ替えエラー、2 つずれた集計、あるいは ラベルがあるはずの場所の空白として表面化します — 何時間もあと、結合からは遠く離れて。
セルを独立に保つそっくりさん:Center Across Selection
ここが意見の分かれる部分であり、本ガイドで唯一いちばん役に立つことです。タイトルを数列に
またがって中央に置きたいだけなら、結合せず、Center Across Selection を使いましょう。 見た目の
結果は同じですが、すべてのセルは別々のままなので、並べ替え、挿入、ループ、Range の計算がすべて
動き続けます。
' A1:C1 にまたがる結合タイトルとまったく同じに見える - でも A1, B1, C1 は独立したまま。
ws.Range("A1").Value = "Quarterly Report"
ws.Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection
テキストは左上のセルに宿り、その右側の空のセルにまたがって中央に描かれます。純粋に配置としてです。
何も消えず、何も融合しません。本物の Merge は、物理的に 1 つのセルが本当に必要なまれな場合 —
印刷フォーム上の 1 つのキャプションブロック — のために取っておき、並べ替えたりフィルターしたり
するデータの上のヘッダーには決して使わないでください。
結合セルを見つけて片付ける
結合だらけのシートを引き継いだ? 安全な片付け方はこうです。各結合ブロックをその MergeArea を
通じて見つけ、値を記録し、結合を解除し、それから見た目が残るように Center Across Selection を
当て直します。
Dim c As Range
For Each c In ws.UsedRange
If c.MergeCells Then
With c.MergeArea
.UnMerge
.HorizontalAlignment = xlCenterAcrossSelection ' 中央揃えの見た目を保ち、結合を捨てる
End With
End If
Next c
結合を判定するときの注意が 1 つ。MergeCells は、範囲が結合セルと非結合セルを混在させているとき、
True、False、または Null を返します。その Null を Boolean 変数に読み込むと型エラーが
起きるので、(上のように)単一のセルに対してテストするか、Null を安全に扱う
If c.MergeCells = True Then を使いましょう。この Null は、VBA のほかの場所でも出会う同じ
「混在状態」の考えです — 範囲全体を記述するプロパティは、範囲が一様なときにしかきれいに答え
られません。
ExcelMaster の活用
結合セルが罠なのは、まさに無害に見えるからです — 中央揃えのタイトル、整ったヘッダー — その裏で
値を消し、マクロの先の方で並べ替え・挿入・ループ・Range の計算を無力化します。そして解決策
(Center Across Selection)は、ほとんどの人が聞いたこともない、いかにもそれらしい結合ボタンの陰に
隠れたものです。
ExcelMaster なら、レイアウトを
どうしたいかを言うだけで済みます。「タイトルを上の 3 列にまたがって中央に置いて」と頼めば、データを
破壊する結合の代わりに xlCenterAcrossSelection — 安全なそっくりさん — を使い、引き継いだ結合
だらけのシートを渡せば、それらの結合を解除し、値を保ち、中央揃えの見た目を残します。ブックも
コードもあなたの手元に残り、空白のラベルや「結合したセルをすべて同じサイズにする必要があります」
というエラーを、そこにあると忘れていた結合まで遡って追いかける午後を飛ばせます。
よくある質問
Excel VBA でセルを結合するには?
範囲を 1 つのセルに融合するには Range("A1:C1").Merge を使います。残るのは左上の値だけで — ほかは
コードでは警告なしに消去されます — なので空の範囲だけを結合するか、先に値を外へ移しましょう。
ブロックの各行を別々に結合するには Range("A1:C3").Merge Across:=True を使います。
VBA でセルを結合したらデータが消えたのはなぜ?
Merge が左上のセルの値だけを残し、範囲内のほかすべてを捨てるからです。手作業で結合すると Excel は
警告を出しますが、VBA は静かに結合します。データを失わずに見た目が欲しいなら、
Range("A1:C1").HorizontalAlignment = xlCenterAcrossSelection を使いましょう。これは各セルの値を
無傷に保ったまま、タイトルを列にまたがって中央に置きます。
VBA で結合を解除するには?
ブロック内の任意のセルに対して UnMerge を呼びます。Range("A1").UnMerge です。正確な境界が
わからないかもしれないので、まず MergeArea を使いましょう — Range("B1").MergeArea.UnMerge は
B1 が属するブロック全体を分割します。結合を解除したあと、元の左上の値は左上のセルに残り、ほかの
セルは空です。
Merge と Center Across Selection の違いは?
Merge はセルを物理的に 1 つに融合し、左上の値を除くすべてを消して、並べ替え・挿入・ループを
壊します。Center Across Selection(HorizontalAlignment = xlCenterAcrossSelection)は、左上の値を
隣接するセルにまたがって中央に 描く だけです — それらは独立したままなので、数式・並べ替え・
構造的な編集が動き続けます。見た目は同じで、ほとんど常にこちらのほうが良い選択です。
範囲に結合セルがあると並べ替えが失敗するのはなぜ?
結合ブロックが異なるサイズになってしまう場合、Excel は行を並べ替えられないので、「この操作を 行うには、結合したセルをすべて同じサイズにする必要があります」を出して並べ替えを拒みます。データ 範囲の上に結合されたヘッダーセルが 1 つあるだけで、これを引き起こすのに十分です。並べ替える前に 範囲の結合を解除しましょう(そしてタイトルは Center Across Selection に切り替えましょう)。
検証環境
動作確認: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-14。
関連ガイド: VBA Borders · VBA Column Width · VBA Range · VBA Sort · VBA Cell Color
