Rangeオブジェクトが矩形かどうかを判定する(Excel)

Rangeオブジェクトが矩形かどうかを判定する

Rangeオブジェクトに入っているセル範囲は、必ずしも連続した矩形領域であるとは限らない。

[Ctrl]を押しながら選択すれば、飛び地状態で選択できるし、飛び地状態で一つのRange型変数にぶちこむことだってできる。

連続した矩形領域でないRangeオブジェクトのAddressプロパティ

連続した矩形状態ではないRangeオブジェクトのAddressプロパティがどのような値を返すものなのか、調べてみた。

f:id:akashi_keirin:20190702075443j:plain

まずはこの状態。飛び地状態である。

イミディエイト・ウインドウに

?Selection.Address

と打ち込んで[Enter]してみると、

f:id:akashi_keirin:20190702075446j:plain

このとおり、二つの領域が「,」(カンマ)でつながれている。

f:id:akashi_keirin:20190702075449j:plain

今度はこの状態。連続してはいるものの、矩形領域ではない。

f:id:akashi_keirin:20190702075451j:plain

今度もこのとおり。やはり二つの矩形に分割して、それぞれのアドレスが「,」でつながれている。

つまり、

単一の矩形領域ならば、Addressプロパティの返り値に「,」がない

ということではないか!

コーディング

以上の考察をもとに、Function化する。

リスト1
Private Function isSingleRectangle( _
  ByVal targetRange As Range) As Boolean
  isSingleRectangle = False
  Dim tmp As String
  tmp = targetRange.Address
  If InStr(1, tmp, ",") > 0 Then Exit Function
  isSingleRectangle = True
End Function
追記

メソッド名を変えました。このメソッドで判定可能な矩形は、あくまでも単一の矩形領域なので。また、複数の領域が組み合わさってたまたま一つの矩形になっているように見える見かけ上の矩形領域を判定するような場面も思い浮かばないので、このようにしました。見かけ上の矩形領域も含めて矩形判定するメソッドも、いづれ頭の体操としてやってみたくはありますが……。

追記ここまで。

実に簡単。

引数で受け取ったRangeオブジェクトのAddressプロパティをInStr関数で調べ、「,」が含まれていたらFalseを返す。

それだけ。

実験

次のコードで実験。

スト2
Private Sub testIsRectangle()
  Dim rng As Range
  Set rng = Selection
  Dim msg As String
  If isSingleRectangle(rng) Then _
    msg = "矩形やんけwww" Else msg = "矩形ちゃうやんけwww"
  Call XlsCommon.makeUserSick("選択範囲は" & msg)
End Sub

選択範囲について矩形判定をして、結果に応じたメッセージを表示する。

メッセージを表示するためのXlsCommon.makeUserSickメソッドについては、

akashi-keirin.hatenablog.com

コチラをどうぞ。

シート上のコマンドボタンにリスト2のマクロを登録して実行する。

f:id:akashi_keirin:20190702080015g:plain

バッチリ。

おわりに

今回は、ExcelVBAの機能に丸ごと乗っかっただけなので、あまりプログラミング的な解決ではない。

一度頭の体操に、もっと原始的な矩形判定プログラムをつくってみたい。