【VBA】セル結合・解除する方法|結合セルの判定・トラブル回避まで解説

セル結合は、表の見た目を整えるために便利な機能です。しかし、セル結合されているデータをVBAで扱う場合は、値が消える・ソートできない・処理が止まる など、思わぬトラブルの原因にもなります。

  • セルの結合・解除をコードで行いたい
  • 結合セルを含むシートを安全に処理したい
  • 結合セルの値が消えないように、解除後に値を復元したい
  • 結合セルかどうかを判定したい
  • MergeAreaで結合範囲を取得したい
  • 結合セルを使わず見た目だけ整える方法を知りたい

こういった悩みをすべて解決するために、この記事では 基本から応用まで完全網羅 して解説します。

目次

VBAでセルを結合する基本(Merge)

セルを結合する基本コードはこちらです。

' B2セルからD3セルまで を結合する
Range("B2:D3").Merge

これは Excel で一般的に使われるA1形式での範囲指定で、視覚的にも分かりやすく、初心者でも扱いやすい記法です。

結合すると複数セルの値はどうなる?

Excel では、複数セルに値が入っている状態で結合すると、左上セルの値だけが残り、他は削除されます。これはVBAでも同様ですので注意してください。

【補足】セル範囲の指定方法の違い・メリット比較

セル結合の操作はCells を使って行番号・列番号で指定する方法 でも書けます。

' B2:D3 と同じ範囲を Cells で結合
Range(Cells(2, 2), Cells(3, 4)).Merge

これは、

  • Cells(2,2) → B2
  • Cells(3,4) → D3
    という意味で、「開始セル」と「終了セル」を動的に指定できます。

① A1形式(Range(“B2:D3”))のメリット

  • 視覚的に分かりやすく、可読性が高い
  • 固定範囲を指定する場合に最適
  • コードが短く、直感的

▶ 固定された表・テンプレートの成形にはこちらが便利

② Cells形式(Range(Cells(x,y), Cells(a,b))))のメリット

  • 変数を使って範囲を動的に指定できる
  • 行番号や列番号をループで動かす処理に強い
  • シート構造が変わっても柔軟に対応できる
  • 範囲が数式で決まるケース(最終行など)に相性が良い

例えば下記コードのように

Dim lastRow As Long
lastRow = Cells(Rows.Count, 2).End(xlUp).Row

Range(Cells(2, 2), Cells(lastRow, 4)).Merge

→ データ量に応じて結合範囲を自動で調整できる

▶「最終行を使った処理」「動的範囲」「ループ処理」と組み合わせる時に便利

セル結合を解除する(UnMerge)

結合を解除するコードはとても簡単です。

' 結合解除(結合されている範囲内のどのセルを指定してもOK)
Range("B2").UnMerge

結合範囲内であればどのセルを指定しても結合が解除されます。

セル結合を解除した結果は

  • 元の結合セルの 左上セルの値 が残ります
  • 結合範囲のその他のセルは 空白 になります

セルが結合されているか判定する方法(MergeCells)

MergeCells を使えば、セルが結合されているかを判定できます。

If Range("B2").MergeCells Then
    MsgBox "B2 は結合セルです"
Else
    MsgBox "結合していません"
End If

このコードはB2セルがセル結合されているかどうかを判定しています。この判定は、結合セルを含むシートを安全に扱う際に非常に重要なチェックです。

結合セルの範囲を取得する(MergeArea)

結合セルを扱う上で最も便利なのが MergeArea です。

指定セルが結合されている場合、その結合セル全体を 1 つの Range として扱えます。

Dim area As Range
Set area = Range("B2").MergeArea

MsgBox area.Address   ' → $B$2:$D$3 のように表示

MergeAreaでできること

  • 結合セルの範囲サイズを取得
  • 結合セル全体に書式・値をまとめて設定
  • “結合の左上セルだけを処理する” などの条件分岐
  • 結合セルの前処理/後処理に活用

例:前述したMergeCells を使いセル結合の有無を判定
   ⇒MergeArea を使い結合されているセル範囲を取得

結合セルを扱うマクロでは 最重要プロパティです。

【実務で必須】セル結合解除後に値を自動展開するマクロ

最も需要が高いのが、こちらのマクロです。

「結合セルを解除したいが、値が空白になるのは困る」
「整形された表をデータとして使いたい」

そんな場合に役立つのが 結合解除 → 結合範囲すべてに元の値を展開 する処理です。

' 結合セルを解除し、結合範囲内のすべてのセルに元の値を設定する
Sub UnmergeAndFill()
    Dim c As Range
    For Each c In ActiveSheet.UsedRange
        If c.MergeCells Then
            With c.MergeArea
                .UnMerge
                .Value = c.Value
            End With
        End If
    Next c
End Sub

このマクロは「見た目重視で作られたExcelを、データとして使える形に直す」 場面で特に威力を発揮します。

このマクロが便利な理由は下記の通りです。

  • 表形式のデータに変換する際に必須
  • どんなレイアウトのシートにも対応
  • 左上セルの値を結合範囲すべてに展開してくれる
  • 「見出し行だけ結合されているファイル」に最適

外部からもらった Excel を処理するときの 標準テンプレ として使えます。

例えば、下の画像のようにセル結合がされている箇所を結合解除すると、右図のように空白セルができて、データとして不完全な状態になってしまいます。

しかし上記コードのマクロを実行すると、空白セルができずに各行にデータが入力されます。

このように、MergeCellsMergeArea などを組み合わせることで、データを整えることもできます。

結合セルがあるシートで安全に処理する方法

結合セルを含むシートには、次のような危険があります。

操作よくあるトラブル
コピー範囲外へ貼り付けるとエラー
ソート並べ替えできない
フィルター行がずれる、フィルターが機能しない
CSV出力レイアウトが崩れる
For Eachループ狙い通りに全セルを取得できない

こうしたトラブルを避けるには、事前に結合セルを検出するのが安全です。

結合セルを検出してイミディエイトウィンドウに出力する

Sub CheckMergedCells()
    Dim rng As Range
    For Each rng In ActiveSheet.UsedRange
        If rng.MergeCells Then
            Debug.Print "結合セル → " & rng.MergeArea.Address
        End If
    Next rng
End Sub

結合セルがどこにあるかを洗い出すことで、「結合セルが原因で処理が止まった」というトラブルを未然に防げます。

結合セルを可視化(色づけ)して把握する

Sub HighlightMergeCells()
    Dim rng As Range
    For Each rng In ActiveSheet.UsedRange
        If rng.MergeCells Then
            rng.MergeArea.Interior.Color = RGB(255, 255, 0)
        End If
    Next rng
End Sub

大量の結合セルがあるシートでは、これだけで一気に状況が把握できます。

結合セルと書式設定をまとめて行う

結合セルの見た目を整える場合は、結合と書式設定をセットで行うことが多いです。

With Range("B2:D3")
    .Merge
    .HorizontalAlignment = xlCenter '中央揃え(横)
    .VerticalAlignment = xlCenter '中央揃え(縦)
    .Interior.Color = RGB(240, 240, 240) '背景色
    .Borders.LineStyle = xlContinuous '罫線
End With

レポートや見出しセルの自動生成などに使えます。

【裏技】結合セルを使わずに見た目だけ整える方法

実務では、結合セルを使わずに見た目だけ整える“Center Across Selection(選択範囲内で中央)” が便利です。

メリットは以下の通りです。

  • 見た目は結合セルとほぼ同じ
  • ソート・フィルターが正常に動く
  • データ処理の妨げにならない
  • マクロとの相性が良い
With Range("B2:D2")
    .HorizontalAlignment = xlCenterAcrossSelection
End With

セル結合を避けながら、見た目は整えたいという場合におすすめの方法です。

まとめ:実務でのセル結合との付き合い方

セル結合はデータの見た目を整えられたり便利な一方、実務では多くの問題を引き起こします。

  • セル結合は見た目用の機能。データ加工には向かない
  • マクロを使う場合はなるべく結合セルを避ける
  • 必要であれば「Center Across Selection」に置き換える
  • 外部ファイルを扱う時は
    1. 結合セルの検知
    2. 必要なら解除
    3. 値展開(UnmergeAndFill)
  • 結合セルを含むシートは事前準備が重要

この記事のマクロをテンプレート化しておけば、どんな Excel ファイルにも即対応できるようになります。

この記事を書いた人

うつ病により二度の休職を経験。
現在は自動車メーカー勤務で、開発業務改善に従事。
自身の経験を基にしたメンタル改善のための情報や、仕事を楽にするためのVBAのノウハウ発信をしています。

目次