結合セルの値を得る

Excelで作業をしていた時に、結合セルの値を得たい場面がありました。
その方法を紹介します。

1.事例

たとえば、ワークシートに以下のように入力しているとします。
A列ではセルを縦に結合しています。

 AB
1東京都千代田区
2港区
3新宿区

ここで、以下のようにA列とB列の値を結合して、C列の値にしたいとします。

 ABC
1東京都千代田区東京都千代田区
2港区東京都港区
3新宿区東京都新宿区

「C1セルに『=A1&B1』と入力して、C列の2行目以降にコピーすれば良いのでは・・・」と思いましたが、その方法ではうまくいきません。
結合されているA2セルやA3セルは、値が何も入力されていないという扱いになります。
そのため、上で述べた方法だと、C2セルやC3セルには「港区」や「新宿区」だけが表示されます。

2.VBAで関数を自作

この問題は、VBA(Visual Basic for Applications)で関数を自作して解決できます。

セル範囲のオブジェクト(Range)には、「MergeCells」と「MergeArea」というプロパティがあります。
MergeCellsプロパティは、そのセル範囲が、結合されているセル範囲の一部であるかどうかを表します。
結合されていれば値はTrueになり、結合されていなければFalseです。

また、MergeAreaプロパティは、結合されているセル範囲全体を指すプロパティです。
これに対して「Offset(0,0)」のメソッドを実行すると、結合されているセル範囲の左上のセルを得ることができます。

これらのプロパティを使って、「MergeArea」という名前の関数を作ると、以下のようになります。

Function MergeValue(R As Range)
    If R.MergeCells Then
        MergeValue = R.MergeArea.Offset(0, 0).Value
    Else
        MergeValue = R.Value
    End If
    If TypeName(MergeValue) = "Empty" Then
        MergeValue = ""
    End If
End Function

上記のコードを入力する手順は、以下のとおりです。

  • Excel 2003以前なら、「ツール」→「マクロ」→「Visual Basic Editor」メニューを選びます。
  • Excel 2007以降なら、「開発」リボンを表示して、「Visual Basic」のボタンをクリックします。
  • Visual Basic Editorが起動しますので、「挿入」→「標準モジュール」メニューを選びます。
  • 上記のコードを貼り付けます。

関数の入力が終わったら、ワークシート上で「MergeValue」という関数を使うことができます。
事例の場合だと、C1セルに「=MergeValue(A1)&B1」と入力し、それをC2セル以降にコピーすれば、目的の結果が得られます。