見積書や請求書のフォーマットを整えるとき、複数のセルを手作業で結合しているとかなりの時間がかかります。ExcelVBAのMergeメソッドを使えば、決まったパターンのセル結合を一瞬で自動化できます。
この記事では、セルを結合・解除する基本コードから、結合セルが原因で発生するエラーとその対処法、実務でよく使う一括処理のサンプルまで解説します。
セルを結合する基本コード(Mergeメソッド)
セルを結合するには、RangeオブジェクトのMergeメソッドを使います。
Sub MergeCellsSample()
Range("A1:C1").Merge
End Sub
Mergeメソッドは、引数にTrueを指定すると「行ごとに結合」、False(省略時の既定値)を指定すると「範囲全体を1つのセルとして結合」します。
Sub MergeAcross()
' A1:C1、A2:C2、A3:C3をそれぞれ別々に結合する
Range("A1:C3").Merge Across:=True
End Sub
セルの結合を解除する基本コード(UnMergeメソッド)
結合を解除するにはUnMergeメソッドを使います。
Sub UnMergeCellsSample()
Range("A1:C1").UnMerge
End Sub
シート内のすべての結合セルを一括で解除したい場合は、以下のようにCells全体に対してUnMergeを実行します。
Sub UnMergeAllCells()
Cells.UnMerge
End Sub
表の見出し行を自動で結合するマクロ
実務でよくあるのが、表のタイトル行を横方向にまとめて結合する処理です。以下は、A1からE1までを結合して中央揃えにするサンプルです。
Sub MergeTitleRow()
Dim titleRange As Range
Set titleRange = Range("A1:E1")
With titleRange
.Merge
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Font.Bold = True
End With
End Sub
同じ値が連続するセルを自動で結合するマクロ
一覧表で、同じ部署名や担当者名が連続しているセルをまとめて結合したい場合は、上から順にセルを比較しながら結合範囲を判定していきます。
Sub MergeSameValueCells()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim startRow As Long
Dim i As Long
startRow = 2 ' 見出し行の次から開始
For i = 3 To lastRow + 1
If i > lastRow Or ws.Cells(i, "A").Value <> ws.Cells(startRow, "A").Value Then
If i - startRow > 1 Then
ws.Range(ws.Cells(startRow, "A"), ws.Cells(i - 1, "A")).Merge
ws.Cells(startRow, "A").VerticalAlignment = xlCenter
End If
startRow = i
End If
Next i
End Sub
このマクロは、A列の値が同じセルが連続している範囲をまとめて結合します。あらかじめ結合セルが残っていると正しく判定できないため、実行前にUnMergeAllCellsなどで結合を解除しておくのがおすすめです。
結合セルが原因で起こりやすいエラーと対処法
結合セルは表を見やすくする一方で、VBAでの処理においてはエラーの原因になりやすい要注意ポイントです。代表的なトラブルと対処法を紹介します。
ソートやオートフィルターでエラーが出る
結合セルを含む範囲をRange.SortやAutoFilterで処理しようとすると、「このコマンドを実行するには、結合されたセルが同じサイズになっている必要があります」というエラーが発生することがあります。ソートや抽出処理を行う前に、対象範囲の結合をすべて解除しておきましょう。
Sub SortSafely()
Dim targetRange As Range
Set targetRange = Range("A1:C10")
' 結合を解除してからソートする
targetRange.UnMerge
targetRange.Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlYes
End Sub
結合セルの値を取得すると空欄になる
結合セルの値は、結合範囲の左上のセルにしか格納されていません。そのため、結合範囲の左上以外のセルを参照すると空文字("")が返ってきます。
Sub CheckMergedValue()
Range("A1:C1").Merge
Range("A1").Value = "サンプル"
Debug.Print Range("A1").Value ' "サンプル"
Debug.Print Range("B1").Value ' "" (空欄になる)
End Sub
結合範囲のどのセルからでも値を取得したい場合は、MergeAreaプロパティを使って結合範囲全体を取得し、その左上セルの値を参照します。
Sub GetMergedValueSafely()
Dim targetCell As Range
Set targetCell = Range("B1")
Debug.Print targetCell.MergeArea.Cells(1, 1).Value
End Sub
セルが結合されているかどうかを判定する
処理の前に、対象セルが結合されているかどうかを確認したい場合はMergeCellsプロパティを使います。
Sub CheckIsMerged()
If Range("A1").MergeCells Then
Debug.Print "A1は結合セルです"
Else
Debug.Print "A1は結合セルではありません"
End If
End Sub
まとめ
Mergeメソッド・UnMergeメソッドを使えば、セルの結合・解除を自動化して手作業の手間を大きく減らせます。ただし結合セルはソートやオートフィルター処理でエラーの原因になりやすいため、MergeCellsプロパティで結合状態を確認したり、処理前に一時的に結合を解除したりする工夫を組み合わせることが大切です。
表のフォーマット作成と、その後のデータ処理を両立させるためにも、この記事で紹介したコードをぜひ活用してみてください。

コメント