結合セルを調べる


セルを結合するにはRangeオブジェクトのMergeメソッドを実行します。

Sub Sample1()
    Range("A1:B3").Merge
End Sub

こんな感じです。実行するとセル範囲A1:B3が結合されます。ちなみに結合を解除するにはUnMergeメソッドを実行します。

さて、セルを結合したり解除したりするのは簡単ですが、任意のセルが結合されているかどうかを調べるにはどうしたらいいでしょう。実は今やってる仕事の支援システムを作っていて、この判断が必要になりました。そんなに難しいテクニックではありませんが、意外と知られていないようなので、せっかくですからご紹介しましょう。

ここでは上図のようなシートを例にします。セル範囲A3:A4とセル範囲A6:A8が結合されています。B列は結合されていません。よくみかけるレイアウトですよね。

結合セルの判定で役立つのはMergeCellsプロパティとMergeAreaプロパティです。MergeCellsは、任意のセルが結合されていたときTrueを返します。

Sub Sample2()
    Dim i As Long, buf As String
    For i = 2 To 9
        If Cells(i, 1).MergeCells Then
            buf = buf & Cells(i, 1).Address(0, 0) & "-->結合されています" & vbCrLf
        Else
            buf = buf & Cells(i, 1).Address(0, 0) & "-->結合されていません" & vbCrLf
        End If
    Next i
    MsgBox buf
End Sub

MergeAreaプロパティは、その結合セルに含まれるセル範囲を返します。たとえば結合セルA6には、セルA6、セルA7、セルA8が含まれますので、MergeAreaプロパティはこの3セルを含むセル範囲(Rangeオブジェクト)を返します。ここで便利なのが、MergeAreaメソッドは結合されていないセルに対しても有効だということです。

Sub Sample3()
    Dim Target As String, i As Long, buf As String, c
    Target = InputBox("年度を指定してください")
    If Target = "" Then Exit Sub
    For i = 2 To 9
        If Left(Cells(i, 1), 4) = Target Then
            buf = Target & "(" & Cells(i, 1).Address(0, 0) & ")" & vbCrLf
            buf = buf & "----------" & vbCrLf
            For Each c In Cells(i, 1).MergeArea
                buf = buf & c.Address(0, 0) & vbCrLf
            Next c
            MsgBox buf
            Exit For
        End If
    Next i
End Sub

もちろん結合していないセルを操作してもエラーにはなりません。

MergeAreaメソッドは結合されているセル範囲(Rangeオブジェクト)を返しますので、次のようにして結合されている大きさなどを調べることも可能です。

Sub Sample4()
    Dim buf As String
    With Range("A1").MergeArea
        buf = buf & .Rows.Count & "行" & vbCrLf
        buf = buf & .Columns.Count & "列" & vbCrLf
        buf = buf & .Count & "個" & vbCrLf
        buf = buf & .Item(1).Address(0, 0) & ":左上" & vbCrLf
        buf = buf & .Item(.Count).Address(0, 0) & ":右下"
    End With
    MsgBox buf
End Sub

上記のコードでは「Range("A1").MergeArea」をWithステートメントでくくりましたので、左上セルや右下セルを取得するのにItemプロパティを使っています。Itemプロパティは、こんなときに超便利ですね~。もちろん、Range("A1").MergeArea.Item(1)にはRange("A1").MergeArea(1)でもアクセスできます。

以上のことを応用して、指定された年度の受賞者を表示するには次のようなコードになります。

Sub Sample5()
    Dim Target As String, i As Long, buf As String, c
    Target = InputBox("年度を指定してください")
    If Target = "" Then Exit Sub
    For i = 2 To 9
        If Left(Cells(i, 1), 4) = Target Then
            buf = Target & "年の受賞者は、" & vbCrLf
            For Each c In Cells(i, 1).MergeArea
                buf = buf & c.Offset(0, 1) & "さん" & vbCrLf
            Next c
            MsgBox buf
            Exit For
        End If
    Next i
End Sub

しつこいようですが、結合されていないセルもOKです。