Home » エクセルマクロ・Excel VBAの使い方 » セル結合 » 結合セルの判定とアドレスの取得を行うExcelマクロ

結合セルの判定とアドレスの取得を行うExcelマクロ

対象:Excel2007, Excel2010, Excel2013

結合セルの判定とアドレスの取得を行うExcelマクロ

システム的な側面から考えると使わないでいてくれるほうが嬉しいけれど、現実的にはよく使われているExcelの機能があります。

代表例がセルの結合です。

結合されているセルが存在していると、VBA(Visual Basic for Applications)などから処理しようとしたときに手間が増えますから、マクロを組んだりするような方ほどセル結合は使わない傾向があると思っています。

ですが、結合されたセルの含まれるExcelファイルは現実的にはかなり存在しているわけで、そのようなファイルをVBAで処理しようとしたときに、結合セルが存在するのかどうかの判定・チェックが必要になることがあります。

このサイト・インストラクターのネタ帳のアクセスログを見ていても、
「エクセル | vba | 結合セルの判定」
「excel vba 結合セル 判定」
「結合セルの判定マクロ」
といった検索キーワードが時折見られます。

そんな、結合されたセルが存在するかどうかを判定して、存在していれば結合セルのアドレスを教えてくれるマクロを作ってみました。

[スポンサードリンク]

結合セルの判定とアドレスの取得を行うサンプルマクロ

以下のマクロを実行して、アクティブシートに結合されたセルが存在しなければ、
「結合セルはありません。」
というメッセージが、結合セルが含まれている場合は、
「以下のセルが結合されています。」
という文言の下に結合セルのアドレスが列挙されたメッセージボックスが、表示されます。


Sub 結合セルの判定とアドレス取得()

 Dim rng As Range
 Dim msg As String

 msg = ""

 For Each rng In _
 Range("A1", Cells.SpecialCells(xlCellTypeLastCell))
  If rng.MergeCells Then
   msg = msg & rng.Address(False, False) & vbCrLf
  End If
 Next rng

 If msg = "" Then
  MsgBox "結合セルはありません。"
 Else
  MsgBox "以下のセルが結合されています。" & vbCrLf & msg
 End If
 
End Sub

A1セルから最終セルまでのセルを対象にFor Each~Nextループを回して、
 For Each rng In _
 Range("A1", Cells.SpecialCells(xlCellTypeLastCell))

もし結合セルだったときは、
  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と、結合されている個々のセルのアドレスがすべてメッセージボックスに表示されます。

この仕様が便利なケースもあるでしょうけれど、結合セルが大量に存在しているワークシートの場合、以下のマクロのほうが便利かもしれません。


Sub 結合セルの判定と起点セルアドレス取得()

 Dim rng As Range
 Dim msg As String

 msg = ""

 For Each rng In _
 Range("A1", Cells.SpecialCells(xlCellTypeLastCell))
  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

 If msg = "" Then
  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オブジェクトを取得しています。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » セル結合 » 結合セルの判定とアドレスの取得を行うExcelマクロ

TrackBack:0

TrackBack URL
[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » セル結合 » 結合セルの判定とアドレスの取得を行うExcelマクロ

Copyright © インストラクターのネタ帳 All Rights Reserved.

.