Excel VBAでセルの結合をする方法をお探しですね。
広告
Excel VBAでセルを結合・解除する方法【判定と値の取得も解説】
Excel VBAで帳票や集計表を作るとき、セルの結合や解除を自動化したい場面ってよくありますよね。
でも、結合セルって扱いが少し厄介なんです。
「このセル、結合されてるのかな?」と迷ったり、「解除したら値が消えちゃった!」なんてことも起こりがちです。
この記事では、Excel VBAでセルを結合・解除する基本から、結合されているかの判定方法、結合範囲の取得、実務で使える解除マクロまで、まとめて解説していきます。
1. セルを結合するには「Merge」メソッドを使おう
Excel VBAでセルを結合したいときは、`Merge`メソッドを使います。
たとえば、B2セルからD3セルまでを1つのセルにまとめたいときは、`Range(“B2:D3”).Merge`と書くだけでOKです。
Excelの画面で範囲を選択して「セルを結合」ボタンを押す操作を、VBAで自動化していると考えるとわかりやすいですね。
帳票のタイトル行や見出し、印刷用のレイアウトなど、見た目を整える目的でよく使われます。
“`vb
Sub MergeSample()
Range(“B2:D3”).Merge
End Sub
“`
`Merge`メソッドには引数を指定することもできます。
`True`を指定すると、選択範囲を行ごとに結合できるんです。
たとえば`Range(“B2:D3”).Merge True`とすると、B2:D2が1つ、B3:D3が1つというように、行単位で結合されます。
引数を省略した場合は自動的に`False`になり、指定した範囲全体が1つの大きな結合セルになります。
表の見出しを行ごとにまとめたいのか、範囲全体を大きな1つの枠として扱いたいのか、目的に合わせて使い分けましょう。
“`vb
Sub MergeByRowSample()
Range(“B2:D3”).Merge True
End Sub
“`
ただし注意点もあります。
結合セルを多用すると、並べ替えやフィルター、コピー、データ集計で扱いにくくなることがあるんです。
見た目を整えるだけなら便利なんですが、データベースのように後で集計・加工する表では、結合ではなく「選択範囲内で中央」などの配置設定を検討するのもアリです。
VBAで自動処理する場合も、結合セルがあると想定外の範囲を参照してしまうことがあるので、結合する範囲と目的は明確にしておくと安心です。
まずは`Merge`で結合できることを押さえたら、次は解除方法を見ていきましょう。
2. 結合を解除するには「UnMerge」メソッドを使おう
結合済みのセルを解除したいときは、`UnMerge`メソッドを使います。
基本の書き方は`Range(“B2:D3”).UnMerge`で、指定した範囲に含まれる結合セルを解除できます。
手作業で「セル結合の解除」を実行する操作と同じですが、VBAなら複数の範囲やシート全体に対して一括処理できるのが便利ですね。
外部から受け取った帳票や、見た目重視で作られた表をデータ処理しやすい形に直すときに重宝します。
“`vb
Sub UnMergeSample()
Range(“B2:D3”).UnMerge
End Sub
“`
ここで注意したいのが、結合セルの値は基本的に左上のセルだけに保持されるという点です。
たとえばB2:D3が結合されていて「売上」という文字が表示されている場合、実際に値を持っているのは左上のB2セルだけなんです。
`UnMerge`で解除すると、B2には値が残りますが、C2、D2、B3、C3、D3には自動で同じ値が入るわけではありません。
そのため、結合を解除したあとに各セルへ同じ値を埋めたい場合は、解除前の値を取得してから範囲全体へ代入する処理が必要になります。
“`vb
Sub UnMergeAndFillSample()
Dim target As Range
Dim v As Variant
Set target = Range(“B2:D3”)
v = target.Cells(1, 1).Value
target.UnMerge
target.Value = v
End Sub
“`
実務では、シート内のすべての結合セルを解除して、元の値を結合されていた範囲全体に入力したいケースがよくあります。
その場合は`UsedRange`を使って、データが使われている範囲を順番に調べ、結合セルであれば`MergeArea`で結合範囲を取得してから解除します。
ただし、結合範囲内の各セルをループすると同じ結合範囲を何度も処理してしまう可能性があるので、解除前に結合範囲と値を変数に入れてから処理するのがわかりやすいです。
次のようなマクロを使うと、結合解除と値の補完をまとめて実行できますよ。
“`vb
Sub UnMergeCellsAndFillValues()
Dim rng As Range
Dim area As Range
Dim v As Variant
For Each rng In ActiveSheet.UsedRange
If rng.MergeCells Then
Set area = rng.MergeArea
v = area.Cells(1, 1).Value
area.UnMerge
area.Value = v
End If
Next rng
End Sub
“`
3. 結合されているか判定するには「MergeCells」プロパティを使おう
セルが結合されているかどうかを判定するには、`MergeCells`プロパティを使います。
`Range(“B2”).MergeCells`の結果が`True`なら、そのセルは結合セルに含まれています。
結果が`False`なら、通常の単独セルとして扱われていると判断できます。
VBAで結合セルを処理する場合は、いきなり解除や値取得を行わず、先に`MergeCells`で判定してから処理を分岐させると安全です。
“`vb
Sub CheckMergeSample()
If Range(“B2”).MergeCells Then
MsgBox “B2セルは結合されています。
”
Else
MsgBox “B2セルは結合されていません。
”
End If
End Sub
“`
`MergeCells`は、単一セルに対して使う場合とセル範囲に対して使う場合で、少し注意が必要です。
単一セルなら、そのセルが結合範囲に含まれているかを素直に判定できます。
一方、複数セルの範囲に対して使うと、指定した範囲全体が結合セルとして扱われる場合に`True`になり、範囲内に結合セルが一部だけ含まれる場合は期待どおりの判定にならないことがあるんです。
なので、シート内の結合セルを探す処理では、`For Each rng In Range(…)`のように1セルずつ確認する書き方がわかりやすく、誤判定も避けやすくなります。
“`vb
Sub CheckMergedCellsInColumnA()
Dim i As Long
For i = 1 To 10
If Cells(i, 1).MergeCells Then
Cells(i, 2).Value = “結合されています”
Else
Cells(i, 2).Value = “結合されていません”
End If
Next i
End Sub
“`
ちなみに、`MergeCells`プロパティは値を設定することもできて、`True`を代入すると結合、`False`を代入すると解除のように使えます。
たとえば`Range(“B2:D3”).MergeCells = True`で結合し、`Range(“B2:D3”).MergeCells = False`で解除できます。
ただし、読みやすさの面では、結合には`Merge`、解除には`UnMerge`を使ったほうが処理の意図が伝わりやすいです。
判定には`MergeCells`、操作には`Merge`と`UnMerge`という役割で覚えると、コードを読む人にもわかりやすいVBAになりますよ。
“`vb
Sub MergeCellsPropertySample()
Range(“B2:D3”).MergeCells = True
‘ Range(“B2:D3”).MergeCells = False
End Sub
“`
4. 「MergeArea」で結合範囲を取得して、安全に扱おう
結合セルを扱ううえで重要なのが、`MergeArea`プロパティです。
`MergeArea`は、指定したセルが含まれている結合範囲全体をRangeオブジェクトとして返してくれます。
たとえばB2:D3が結合されているときに`Range(“C3”).MergeArea.Address`を取得すると、結合範囲である`$B$2:$D$3`を確認できます。
どのセルを指定しても、そのセルが同じ結合範囲に含まれていれば、同じ結合範囲を取得できる点が便利なんです。
“`vb
Sub GetMergeAreaSample()
Dim area As Range
If Range(“C3”).MergeCells Then
Set area = Range(“C3”).MergeArea
MsgBox “結合範囲は ” & area.Address & ” です。
”
End If
End Sub
“`
結合セルの値を取得するときにも`MergeArea`は役立ちます。
結合セルでは、見た目は大きなセルに値が入っているように見えますが、VBA上では左上のセルだけが値を持っているんです。
そのため、結合範囲内の右下側のセルを直接参照すると、空白のように見えることがあります。
確実に値を取得したいなら、`Range(“C3”).MergeArea.Cells(1, 1).Value`のように、結合範囲の左上セルを参照しましょう。
“`vb
Sub GetMergedCellValueSample()
Dim v As Variant
If Range(“C3”).MergeCells Then
v = Range(“C3”).MergeArea.Cells(1, 1).Value
Else
v = Range(“C3”).Value
End If
MsgBox v
End Sub
“`
結合セルを含む表をVBAで処理するときは、「結合の有無」「結合範囲」「値の所在」をセットで考えると失敗が少なくなります。
特に、一覧表を集計や検索に使いたい場合、結合された見出しや分類名を解除して、元の値を各行に埋める処理はとても実用的です。
ただし、印刷用の帳票では結合セルを残したほうが見やすいこともあるので、すべての結合を悪いものとして扱う必要はありません。
「表示を整えるための結合」と「データ処理をしやすくするための解除」を使い分けることが、Excel VBAで安定したマクロを作るポイントです。
まとめ
最後に、セル結合に関する主要な使い分けを整理しますね。
– **結合したいとき** → `Merge`
– **解除したいとき** → `UnMerge`
– **結合されているか調べたいとき** → `MergeCells`
– **結合範囲を取得したいとき** → `MergeArea`
この4つを押さえておけば、Excel VBAでセルを結合・解除する方法と結合されているかの判定は、基本から実務レベルまで対応できます。
マクロの中で結合セルを扱う場合は、いきなり値を取得したり解除したりせず、まず判定してから範囲を取得する流れを意識すると、エラーや想定外の空白を避けやすくなりますよ。
広告
