セル位置の比較
事務処理のようなマクロの場合にはあまり必要性は感じませんが、シート内にあるデータの検証のような機械的にシート内の入力セル範囲をループしたりする場合に、起点となるセルと現在ループ中のセルの位置はどちらが上下左右にあるか、ということを知りたい場合があります。
例えば、A1セルとD5セルでは、D5セルの方がより下側にある、とかを知りたい場合です。
2つのセルの比較方法
2つのセルの位置を比較するには、いくつかの方法があります。
Addressプロパティを使って、”A1″形式や”R1C1″形式でのセル座標を使う方法や、RowプロパティやColumnプロパティで行位置、列位置を使う方法が挙げられます。
ここでは上下左右の位置関係の比較になるため、Row、Columnプロパティを利用します。
2つのセルを比較するコード
以下の関数は引数で渡された2つのセルの座標を比較し、第一引数より第二引数の方がより右下にあれば1を返し、同じ位置であれば0を返し、より左上にあれば-1を返します。
戻り値が同じIf文は当然統合できるのですが、わかりやすさを優先してわざと分けてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Function CmpCellAddress(a_rFirst As Range, a_rSecond As Range) As Integer Dim iRet As Integer '// 行位置が1番目 < 2番目(2番目の方が下) If (a_rFirst.Row < a_rSecond.Row) Then iRet = 1 '// 行位置が同じで、列位置が1番目 < 2番目(2番目の方が右) ElseIf (a_rFirst.Row = a_rSecond.Row) And (a_rFirst.Column < a_rSecond.Column) Then iRet = 1 '// 行列位置が同じ ElseIf (a_rFirst.Row = a_rSecond.Row) And (a_rFirst.Column = a_rSecond.Column) Then iRet = 0 '// 行位置が同じで、列位置が1番目 > 2番目(1番目の方が右) ElseIf (a_rFirst.Row = a_rSecond.Row) And (a_rFirst.Column > a_rSecond.Column) Then iRet = -1 '// 行位置が1番目 > 2番目(1番目の方が下) ElseIf (a_rFirst.Row > a_rSecond.Row) Then iRet = -1 End If CmpCellAddress = iRet End Function |
使い方
B2セルを第一引数として、第二引数の位置を変えながら上の関数の結果を出力するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub CmpCellAddressTest() Dim i i = CmpCellAddress(Range("B2"), Range("B3")) '// B2セルよりB3セルの方が下=1 Debug.Print i i = CmpCellAddress(Range("B2"), Range("C2")) '// 同じ2行目だがC2セルの方が右=1 Debug.Print i i = CmpCellAddress(Range("B2"), Range("B2")) '// 同じ位置=0 Debug.Print i i = CmpCellAddress(Range("B2"), Range("A2")) '// 同じ2行目だがA2セルの方が左=-1 Debug.Print i i = CmpCellAddress(Range("B2"), Range("B1")) '// B2セルよりB1セルの方が上=-1 Debug.Print i End Sub |
実行結果
1
1
0
-1
-1