システム的な側面から考えると使わないでいてくれるほうが嬉しいけれど、現実的にはよく使われているExcelの機能があります。
代表例がセルの結合です。
結合されているセルが存在していると、VBA(Visual Basic for Applications)などから処理しようとしたときに手間が増えますから、マクロを組んだりするような方ほどセル結合は使わない傾向があると思っています。
ですが、結合されたセルの含まれるExcelファイルは現実的にはかなり存在しているわけで、そのようなファイルをVBAで処理しようとしたときに、結合セルが存在するのかどうかの判定・チェックが必要になることがあります。
このサイト・インストラクターのネタ帳のアクセスログを見ていても、
「エクセル | vba | 結合セルの判定」
「excel vba 結合セル 判定」
「結合セルの判定マクロ」
といった検索キーワードが時折見られます。
そんな、結合されたセルが存在するかどうかを判定して、存在していれば結合セルのアドレスを教えてくれるマクロを作ってみました。
結合セルの判定とアドレスの取得を行うサンプルマクロ
以下のマクロを実行して、アクティブシートに結合されたセルが存在しなければ、
「結合セルはありません。」
というメッセージが、結合セルが含まれている場合は、
「以下のセルが結合されています。」
という文言の下に結合セルのアドレスが列挙されたメッセージボックスが、表示されます。
Dim rng As Range
Dim msg As String
msg = ""
For Each rng In ActiveSheet.UsedRange
If rng.MergeCells Then
msg = msg & rng.Address(False, False) & vbCrLf
End If
Next rng
MsgBox "結合セルはありません。"
Else
MsgBox "以下のセルが結合されています。" & vbCrLf & msg
End If
End Sub
アクティブシートの使用されているセルを対象にFor Each~Nextループを回して、
For Each rng In ActiveSheet.UsedRange
もし結合セルだったときは、
If rng.MergeCells Then
セルのアドレスを変数・msgに格納しています。
msg = msg & rng.Address(False, False) & vbCrLf
ループが終わってから、変数・msgの中身によって、表示するメッセージの内容を変更しています。
If msg = "" Then
MsgBox "結合セルはありません。"
Else
MsgBox "以下のセルが結合されています。" & vbCrLf & msg
セル結合の判定と起点セルのアドレス取得を行うサンプルマクロ
上記のマクロでは、例えばA1:A3セルが結合されていれば、A1・A2・A3と、結合されている個々のセルのアドレスがすべてメッセージボックスに表示されます。
この仕様が便利なケースもあるでしょうけれど、結合セルが大量に存在しているワークシートの場合、以下のマクロのほうが便利かもしれません。
Dim rng As Range
Dim msg As String
msg = ""
For Each rng In ActiveSheet.UsedRange
If rng.MergeCells Then
If rng.Address = rng.MergeArea(1, 1).Address Then
msg = msg & rng.Address(False, False) & vbCrLf
End If
End If
Next rng
MsgBox "結合セルはありません。"
Else
MsgBox "以下のセルが結合されています。" & vbCrLf & msg
End If
End Sub
このマクロの場合は、結合セルの一つ目のセルのアドレスだけがメッセージボックスに表示されます。
先のマクロと違うのは、結合セルかどうかを判定しているIf文の中に、
If rng.MergeCells Then
そのセルが結合セルの一つ目のセルかどうかを判定するIf文が入っているところです。
If rng.Address = rng.MergeArea(1, 1).Address Then
「Range.MergeArea(行番号, 列番号)」というオブジェクト式を使うと、結合されているセル範囲の中から行番号と列番号を指定して単一のRangeオブジェクトを取得できますから、ここでは「rng.MergeArea(1, 1)」と指定することで、結合範囲の1行目・1列目のセルを表す一つ目のRangeオブジェクトを取得しています。
- Newer:最終行を取得するGASスクリプト
- Older:8/2(日)Excelマクロ入門講座を開催しました(女性4 男性1)
Home » Excel VBA Rangeオブジェクト » 結合セル » 結合セルの判定とアドレスの取得を行うExcelマクロ