Rangeオブジェクトが矩形かどうかを判定する(Excel)
Rangeオブジェクトが矩形かどうかを判定する
Range
オブジェクトに入っているセル範囲は、必ずしも連続した矩形領域であるとは限らない。
[Ctrl]を押しながら選択すれば、飛び地状態で選択できるし、飛び地状態で一つのRange
型変数にぶちこむことだってできる。
連続した矩形領域でないRangeオブジェクトのAddressプロパティ
連続した矩形状態ではないRange
オブジェクトのAddress
プロパティがどのような値を返すものなのか、調べてみた。
まずはこの状態。飛び地状態である。
イミディエイト・ウインドウに
?Selection.Address
と打ち込んで[Enter]してみると、
このとおり、二つの領域が「,
」(カンマ)でつながれている。
今度はこの状態。連続してはいるものの、矩形領域ではない。
今度もこのとおり。やはり二つの矩形に分割して、それぞれのアドレスが「,
」でつながれている。
つまり、
単一の矩形領域ならば、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
メソッドについては、
コチラをどうぞ。
シート上のコマンドボタンにリスト2のマクロを登録して実行する。
バッチリ。
おわりに
今回は、ExcelVBAの機能に丸ごと乗っかっただけなので、あまりプログラミング的な解決ではない。
一度頭の体操に、もっと原始的な矩形判定プログラムをつくってみたい。