仕事関連のお手伝いで,使うエクセルVBAをいじってます。久しぶりに,ドツボにはまりました。ある方のHP
を参考にした(丸ぱくり)サーチのプロシャージャでのことです。
Public Function Search(ByVal Rng As Range, ByVal keyWord As Variant, ByVal Whole As Boolean) As Range
' 引数:
' Rng:検索範囲 (例) ActiveSheet.Range ("A1:Z500")
' KeyWord:検索する値 (例) "リンゴ",10,7.85
' Whole:完全一致→True 部分一致→False (例)True
' 戻り値
' Rangeオブジェクト 見つからなかった場合は「Nothing」
' 検索範囲内の「KeyWord」を検索する関数です。
' 検索範囲を一つずつ判定し、最初に一致したセル範囲を返します。
' 完全一致と部分一致対応できます。
' 非表示のセルも検索かけます
' 検索結果はセル範囲一つだけです。複数の場合が良ければ「search_List」関数を使ってください
' https://www.hokkyokun.com/vba-search-vs-findmethod/
Dim r As Range
'完全一致
If Whole Then
For Each r In Rng
If r.Value = keyWord Then
Set Search = r
Exit Function
End If
Next
'部分一致
Else
For Each r In Rng
If InStr(r.Value, keyWord) > 0 Then
Set Search = r
Exit Function
End If
Next
End If
'見つからなかった時の処理
'適宜変更してもらって構いません
Set Search = Range("XFD1048576") 'Range(1048576,16384)を返す--最終セル
End Function
この関数を呼び出すのに,次のようなサブルーチンを使いました。
Private Sub CommandButton7_Click()
Dim Hani, kensakukekka As Range
Set Hani = Range(Worksheets("マスター").Cells(2, 5), Worksheets("マスター").Cells(96, 5))
MsgBox Worksheets("マスター").Cells(2, 5) & Worksheets("マスター").Cells(96, 5)
kensakukekka = Search(Hani, "リンゴ", True)
MsgBox kensakukekka
End Sub
このサブルーチンはうまくいきました。しかし,
MsgBox kensakukekka
の部分を,
MsgBox kensakukekka & kensakukekka.Row
にするとエラーになるのです。考えられる,修正を加えましたが,エラーは,直りませんでした。
下記加えた,kensakukekka.Row は,検索結果の入っている,行番号を返すはずなのですが,エラーになり
ます。訳が分かりませんでしたので,お助け掲示板かなと思っていたのですが,ふと気がつきました。
気がつくまで,半日無駄にしました。原因は,分かってみると,簡単なのですが,呼び出しのサブルーチン
に使っていた,
kensakukekka = Search(Hani, "リンゴ", True)
が違っていたのです。Range の設定には, Set をつけてやる必要があったのです。
Set kensakukekka = Search(Hani, "リンゴ", True)
のように,Set を入れると無事思った動作になりました。 Range を扱う時は,Set を入れることを失念
したための大ポカでした。
半分?動いたので,大丈夫と思っていたのが大間違いでしたが,たちが悪いですね。エラーなら全部エラー
になればいいのになんて思いました。