「Excelマクロで結合されているセルの値を取得するにはどうしたらいいのでしょうか?」
「セルが結合されていたときに、結合セルにはすべて先頭のセルの値が入っているように扱うには、どうしたらいいのでしょうか?」
といった趣旨のご質問をいただくことがあります。
結合セルに対するループ処理のサンプル
例えば、下図のようなExcelシートがあったときに、
以下のようなマクロを実行すると、
Sub 結合セルのテスト() Dim i As Long Dim val As Variant For i = 1 To 6 val = Cells(i, 1).Value MsgBox val Next End Sub
まず「2013」というメッセージボックスが表示されたあと、何も表示されていないメッセージボックスが2回表示され、「2014」というメッセージが表示されたあとに、何も表示されていないメッセージボックスが2回表示されます。
A1:A3セルが結合されているため、A1セルには「2013」という値が入力されているけれど、A2セル・A3セルは空っぽ、つづいて、A4:A6セルが結合されているため、A4セルには「2014」という値が入力されているけれど、A5セル・A6セルは空っぽという状態になっているためです。
そのため、ループ処理の中で、A1セル・A4セルの値を取得したときだけ「2013」「2014」がメッセージボックスに表示され、あとは空白のメッセージボックスが表示されるわけです。
これを、「2013」というメッセージボックスが3回表示されたあと、「2014」というメッセージボックスを3回表示されるようにするにはどうしたらいいのか、というのが先のご質問の趣旨です。
結合セルの値を取得するサンプルマクロ
実は、先のコードをほんの少しだけ修正すれば、結合セルがあったときに、結合セルの先頭の値が、他の結合されているセルにも入っているかのように扱えます。
Dim i As Long
Dim val As Variant
For i = 1 To 6
val = Cells(i, 1).MergeArea(1, 1).Value
MsgBox val
Next
RangeオブジェクトのMergeAreaプロパティを使うと、結合されているセル範囲のRangeオブジェクトを取得することができるのです。
例えば、A1:A3セルが結合されているときは、「Range("A1").MergeArea」というオブジェクト式で、A1:A3セルが取得できます。
で、上記のマクロの、
val = Cells(i, 1).MergeArea(1, 1).Value
で使われている「MergeArea(1, 1).Value」というオブジェクト式は、結合されているセル範囲の、1行目1列目の値を取得していることになります。
ですからA1:A3セル・A4:A6セルがそれぞれ結合されている場合に、
For i = 1 To 6 val = Cells(i, 1).MergeArea(1, 1).Value
というコードを実行すると、ループの3回目まではA1セルの値が変数・valに格納されるので、「2013」というメッセージが3回表示され、ループの4回目から6回目はA4セルの値が変数・valに格納されるので、「2014」というメッセージが3回表示さることになります。
ちなみに、セル結合されていないときにMergeAreaプロパティを使った場合、「.MergeArea」の前で指定されているRangeオブジェクトが返され、エラーになったりはしません。ですから、エラー処理を入れたりする必要もなく、とても扱いやすいプロパティだと思います。
- Newer:テキストボックスの余白を設定するPowerPointマクロ
- Older:Excel 2013で集計機能はどこに?
Home » Excel VBA Rangeオブジェクト » 結合セル » 結合セルの値を取得する-Range.MergeArea