指定値セル番地検索 

指定した値がどのセルにあるかを探し、そのセル番地を返すマクロ version1.0

とある値をもつセルの番地を調べることができる。
想定では複数シートに同じ処理をしたいときに使用する。
先頭の定数に検索範囲と検索文字を指定することができる。
対象文字が複数セルにある場合、最初に見つかった番地を返す。

Const SEARCH_END_ROW = 100
Const SEARCH_END_COLUMN = 100
Const FIND_VALUE = "★"

'使用例
Sub callMethod()
    Dim findedCellAddress As String: findedCellAddress = findCellInCheckValue(FIND_VALUE)
    Dim targetRow As Integer: targetRow = Range(findedCellAddress).ROW
    Dim targetColumn As Integer: targetColumn = Range(findedCellAddress).COLUMN
    MsgBox Cells(targetRow, targetColumn)
End Sub

'引数は汎用性を考えた結果。定数の直接参照でも問題はない。
Function findCellInCheckValue(findValue As String)
    Dim findedAdress As String
    For i = 1 To SEARCH_END_ROW
        For j = 1 To SEARCH_END_COLUMN
            If Cells(i, j) = findValue Then
                findedAdress = Cells(i, j).Address
                '見つかったのでbreak処理
                i = SEARCH_END_ROW
                j = SEARCH_END_COLUMN
            End If
        Next
    Next
    findCellInCheckValue = findedAdress
End Function
'以下はおまけ。列はわかっているが、行だけ不明なケースで使用できる
Sub findRowInColumn()
'エラー検知を無視するコード(見つからなかった場合発生してしまうため)
On Error Resume Next
    '第二引数は列で指定しないと動かない。要注意
    Dim b As Variant: b = WorksheetFunction.Match(FIND_VALUE, Range("A:A"), 0)
    MsgBox b
    'エラー無視を解除する
On Error GoTo 0
End Sub

追記:2022/11/21
ActiveSheet.UsedRange.Addressを使って調査範囲を指定できると複数セルを相手にする場合、その差異も吸収できそう。
つまり、↓こういうことになる。「UsedRange」の前には必ずシートのオブジェクトが必要。

'使用範囲の最終セルを取得
Sub findUsedRangeLastCell()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Debug.Print ws.UsedRange.Address
    Debug.Print ws.UsedRange(ws.UsedRange.Count).Address
    Debug.Print Range(ws.UsedRange(ws.UsedRange.Count).Address).ROW
    Debug.Print Range(ws.UsedRange(ws.UsedRange.Count).Address).COLUMN
End Sub
関連記事:最終行、最終列、最終セルの取得



コメント