【ExcelVBA・マクロ】セルの結合・解除を自動化する方法|Mergeメソッドの使い方と注意点【コピペOK】

ExcelVBA

見積書や請求書のフォーマットを整えるとき、複数のセルを手作業で結合しているとかなりの時間がかかります。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.SortAutoFilterで処理しようとすると、「このコマンドを実行するには、結合されたセルが同じサイズになっている必要があります」というエラーが発生することがあります。ソートや抽出処理を行う前に、対象範囲の結合をすべて解除しておきましょう。

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プロパティで結合状態を確認したり、処理前に一時的に結合を解除したりする工夫を組み合わせることが大切です。

表のフォーマット作成と、その後のデータ処理を両立させるためにも、この記事で紹介したコードをぜひ活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました