和風スパゲティのレシピ

日本語でコーディングするExcelVBA

結合セルの値を取得する - MargeArea/Value

結合セルの値を取得する方法を解説します。

結合セル.Valueの仕様

まずはじめに結合セルからValueプロパティを取得したときの仕様を解説します。

例えばA1:C3セルが結合されていたとしましょう。

A1:C3結合セルの値

この時、Valueプロパティは以下のような動きになります。

MsgBox Range("A1").Value ' 「テスト」が表示されます。
MsgBox Range("B1").Value ' 「」(空文字)が表示されます。
MsgBox Range("A1:C3").Value ' 型が一致しませんエラー

 
結合セルの値は「一番左上の先頭セル」に入力されており、
その他のB1~C3セルはすべてValueが空のセルとして扱われます。


Range("A1:C3").Valueがエラーなのは配列になっているためで、

Dim Arr
Arr = Range("A1:C3").Value

MsgBox Arr(1, 1) ' 「テスト」が表示されます。
MsgBox Arr(3, 3) ' 「」が表示されます。

このように配列として扱えることが確認できます。

これは普通のセル範囲と同じ動きですね。


よって、結合セルの値を取得したい場合は、
結合エリアの先頭のセル.Valueを取得する必要があります。

結合セルの値を扱う際は、まずはこの仕様を理解しておきましょう。

結合エリアから先頭セルの値を取得 - Cells(1)

結合エリアA1:C3をRangeオブジェクトとして持っているとき、
先頭A1セルの値を取得するにはCellsプロパティを使用します。

Dim 結合エリア As Range
Set 結合エリア = Range("A1:C3")

セル値 = 結合エリア.Cells(1).Value
' または
セル値 = 結合エリア.Cells(1, 1).Value

 

CellsプロパティはWorksheetオブジェクト.Cells(R, C)として使う以外に、
Rangeオブジェクト.Cells(R, C)として使うこともできます。

この時はRangeオブジェクトの先頭セルをA1セルと見立てたように動くため、
Cells(1)またはCells(1, 1)でエリアの先頭セルを取得できます。


結合エリアのセル値を取得したいときは、このコードを使用してください。

選択中の結合セル(Selection)の値を取得する

「結合エリアをRangeオブジェクトとして持っている」状況としては、
選択セルSelectionに対して処理をしたい場面が多いです。

結合セルを選択中はSelection.Valueがエラー(配列)になってしまい、
困って本記事にたどり着いた方もいらっしゃるかもしれません。


このときは、上記の通りSelection.Cells(1)で値を取得できます。

セル値 = Selection.Cells(1).Value

 
またもう一つの方法として、選択範囲全体(Selection)ではなく、
その中でアクティブになっているセルActiveCellを使用してもよいです。

セル値 = ActiveCell.Value

 

ActiveCellは必ず単独セルを取得してくれるプロパティなので、
結合セルに限らず、Valueを取得する場合はこちらの方が安定します。

このプロパティも覚えておいてください。

結合内部セルから結合セルの値を取得 - MergeArea

続いて結合内部のセルから結合セルの値を取得する方法です。

例えばこのデータをループするコードを書くとしましょう。

データ内に結合セルを持つ表


このコードを、

Dim R As Long
For R = 4 To 最終行
    Debug.Print Cells(R, 2).Value ' 品物名を取得
Next

こう書いてしまうと、前述の結合セルの仕様の通り、
5,6、8,9、11,12行目では品物名が空になってしまいます。


このようなデータにおいて結合内部セルでも先頭セルの値を取得する場合は、
セルから結合エリアを取得するMergeAreaプロパティを使用します。

Dim R As Long
For R = 4 To 最終行
    Debug.Print Cells(R, 2).MargeArea.Cells(1).Value ' 品物名を取得
Next

このコードを用いれば、4~6行目はみかん、7~9行目はりんごと、
それぞれ結合内部セルから先頭のセル値を取得することができます。


MergeAreaプロパティは指定セルを含むセル範囲全体を取得するプロパティで、
B4,B5,B6どのセルから実行してもB4:B6を取得することができます。

Dim R As Long
For R = 4 To 最終行
    Debug.Print Cells(R, 2).MargeArea.Address
    ' B4:B6 B4:B6 B4:B6 B7:B9 B7:B9 B7:B9 …
Next

データ内に結合セルを持つ表

あとは前述の通り、Cells(1)で先頭セルを取得してValueを参照すればOKです。


ちなみにMergeAreaプロパティは結合されていない単独セルでも実行可能で、
その場合は単独セルそのものを返してくれます。

よって上記のコードはB列に単独セルがあってもちゃんと動きます。
ありがたい仕様ですね。


結合セルの値を取得する場合は、
状況に応じて上記のコードを使い分けてください。