- ベストアンサー
EXCELマクロでの検索方法を教えてください
- EXCELマクロにおいて、指定した範囲内で特定の値を検索する方法を教えてください。
- 具体的には、×が存在する場合は良いのですが、存在しない場合にエラーが発生します。この場合、どのように対応すれば良いでしょうか?
- エラーメッセージ「オブジェクト変数またはWithブロック変数が設定されていません」と表示されます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! すでに的確な回答は出ていますが・・・ 仮に最初に見つかったセルをアクティブにする場合は Sub Sample1() Dim c As Range Set c = Range("K12:K70").Find(what:="×", LookIn:=xlValues, lookat:=xlPart) If c Is Nothing Then MsgBox "該当データなし" Else c.Select End If End Sub 該当セルが複数あり、すべてを選択する場合は Sub Sample2() Dim c As Range, myRange As Range Set myRange = Range("K12:K70").Find(what:="×", LookIn:=xlValues, lookat:=xlPart) If Not myRange Is Nothing Then For Each c In Range("K12:K70") If InStr(c, "×") > 0 Then Set myRange = Union(myRange, c) End If Next c myRange.Select Else MsgBox "該当データなし" End If End Sub こんな感じではどうでしょうか?m(_ _)m
その他の回答 (2)
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。 On Error Resume Next を使って、見つからなければメッセージを表示するようにします。 3種類挙げておきます。 Findメソッドについては、VBAのヘルプで(使用例を含めて)確認しておいてください。 ' ' /// Sub Re8506777a() ' ご提示のコードと同じ挙動+notfoundメッセージ Dim rtn ' ' K12:K70 を選択 Range("K12:K70").Select On Error Resume Next ' ' K12:K70 の中で 【K12よりも下で最初に見つかる】"×"値のセルをアクティブにする。 ' ' 「K12が"×"値」の場合でも、「K12の次」に見つかる"×"値のセル、、 ' ' "×"値がK12にしか無ければ、K12、をアクティブにします。 rtn = Selection.Find(What:="×", After:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate On Error GoTo 0 If rtn <> True Then MsgBox "Find(""×""):notfound" End Sub ' ' /// Sub Re8506777b() ' 先頭から探す版 Dim rtn With Range("K12:K70") ' ' K12:K70 を選択 .Select On Error Resume Next ' ' K12:K70 の中で 【先頭から探して最初に見つかる】"×"値のセルをアクティブにする。 rtn = .Find(What:="×", After:=.Cells(.Cells.Count), LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate On Error GoTo 0 End With If rtn <> True Then MsgBox "Find(""×""):notfound" End Sub ' ' /// Sub Re8506777c() ' 先頭から探す+Range型オブジェクト変数版 Dim myRange As Range With Range("K12:K70") ' ' K12:K70 を選択 .Select On Error Resume Next ' ' K12:K70 の中で 【先頭から探して最初に見つかる】"×"値のセルをmyRangeに格納する。 Set myRange = .Find(What:="×", After:=.Cells(.Cells.Count), LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False) On Error GoTo 0 End With If myRange Is Nothing Then MsgBox "Find(""×""):notfound" Else ' ' 見つかったセルをアクティブにする。 myRange.Activate End If End Sub ' ' ///
お礼
cj_mover 様 早速の回答ありがとうございす 大変勉強になりました。
一例です。ご参考まで。 Sub test() Dim Obj As Object Dim S_word As String S_word = "×" Set Obj = Range("K12:K70").Find(S_word, , LookAt:=xlPart) If Obj Is Nothing Then MsgBox S_word & "は見つかりませんでした。" Else Obj.Activate End If End Sub 見つからなっか場合は、メッセージを出すようにしました。又検索文字列をS-wordで検索するように記載しましたが、不用であれば削除下さい。
お礼
pidum 様 早速の回答ありがとうございす 大変勉強になりました。
お礼
tom04 様 早速の回答ありがとうございす 大変勉強になりました。 Sample1 を使わせていただきたいと思っています テストさせていただいたところ希望どうりの作業ができるように なりました大変助かりました。 もちろん他のかたのもきちんと動作しましたが今回tom04 様 を使わせていただくこととしました。 ありがとうございました。