VBAで結合されたセルに入力されているデータを取得する方法について説明します。
結合されたセルのデータを取得する場合、一番左上のセル以外を指定してデータを取得しようすると空白が返ってきます。
結合されたセルのどこを指定しても入力されているデータを取得する方法もありますので、併せて説明します。
その他のセルの操作については下記記事をご覧ください。
結合セルのデータをそのまま取得する
記述方法
結合されたセルをVBAでそのまま取得しようとすると、一番左上のセル以外は空白になってしまします。
そのため、基本的には一番左上のセルを固定で取得することになります。
そのままデータを取得しようとすると、どのようにデータが取得できるか、次のようなB列の「年」が結合されて、「月」が右に入力されたデータを取得してみます。
サンプルコード
次のコードは上記データを2行目から25行目までループして、各行のB列とC列を取得して変数へ格納します。
最後にメッセージボックスに表示させます。
「& vbCrLf」は変数の中の文字列を改行するコードで、1行ごとに改行して格納しています。
Sub Sample1()
Dim i As Long
Dim d As String
For i = 2 To 25
d = d & Cells(i, 2) & Cells(i, 3) & vbCrLf
Next i
MsgBox d
End Sub
結果
1月は年と月が正常に取れましたが、それ以外の月は月のみが取得されました。
結合セルのデータを取得する方法
記述方法
上記の様に普通に取得しようとすると、左上のセル以外データを取得できません。
そのため、結合されたセルのデータを取得するには「MergeAreaメソッド」を使用します。
「MergeAreaメソッド」は指定したセルの結合されている範囲を返します。
返された値はコレクションとなり、Itemでコレクションの中の値を取得する事が可能です。
次の様に記述します。
注意点としては指定するRangeに複数のセルを指定するとエラーになります。
Range.MergeArea(1).Value
Range.MergeArea.Item(1).Value
上記の方法でも取得出来ますが次のよう列を指定して記述する事もできます。
Range.MergeArea(1, 1).Value
Range.MergeArea.Item(1, 1).Value
サンプルコード
上記のデータを使い、各年と月を結合するコードです。
先ほどの上記のデータを2~25行までループして、各年と各月を結合して表示します。
「mArea = Cells(i, 2).MergeArea.Item(1).Value」でループしているセルの結合範囲を取得し、取得した1つ目のItemを変数に格納しています。
これで、一番左上のセル以外をループしても常に1つ目の値を取得出来ます。
「d = d & mArea & Cells(i, 3) & vbCrLf」で変数に格納した年と右のセルの月を結合しています。
Sub Sample2()
Dim mArea As Variant
Dim i As Long
Dim d As String
For i = 2 To 25
mArea = Cells(i, 2).MergeArea.Item(1).Value
d = d & mArea & Cells(i, 3) & vbCrLf
Next i
MsgBox d
End Sub
各月に正常に年が取得出来ました。