- ベストアンサー
エクセル マクロ 日付の検索
エクセル2000にて検索のマクロを作っています。 オブジェクト変数またはwithブロック変数が設定されていません。とエラーがでます。 どなたか助けていただけませんか? ”メニュー”シートのAボタンを押すと”スケジュール”というシートの今日の日付のセルにカーソルが飛ぶようにしたいと思っています。 ”スケジュール”シートのR2セルに=today() 関数が入っています。 A列に日付が入っています。 Sub Macro3() Dim r2 As String Application.ScreenUpdating = False Sheets("スケジュール").Select r2 = Range("R2").Value Selection.Find(What:=r2, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Activate End Sub
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 私は、長い間、検索できないのは、バグだと思い込んでいました。 これに似た問題の中に、オートフィルタの検索があります。 簡単だと思う人もいるかもしれませんが、これは、ちゃんと教えてもらわないと、自力では、なかなか分からないです。 検索値と被検索値には、その組み合わせがあります。 (1)文字列で検索 元の質問では、検索値のRange("R2").Value の左辺の変数 'r2' は、String 型になっています。 しかし、Range("R2").Value では、正確な文字型のデータが取れません。 Dim r2 As String r2 = Range("R2").Text このようにしてあげます。 LookIn:=xlValues, _ 被検索値は、「値」になります。 ただし、検索値と被検索値の書式は合わせなくてはなりません。[Macro3a] 検索値 7月28日 → × 2008/07/28 被検索値 7月28日 (2)日付型で検索(#1さんの方法) Dim r2 As Date r2 = Range("R2").Value r2 の中身は、日付型(As Date)に入っています。 被検索値は、このようになります。 LookIn:=xlFormulas, _ なお、(1),(2)とも、非検索値は、基本的に、部分検索はありませんから、「完全に同一のセルだけを検索する」に換えておきます。 LookAt:=xlWhole, _ (3)関数検索 Application.Match (Excel 97書式)で、検索値は、Range("R2").Value2 で、Long型で検索してしまう方法があります。(Macro4) '--------------------------------- Sub Macro3a() Dim r2 As String Dim r As Range Sheets("スケジュール").Select r2 = Range("R2").Text '←被検索値とR2は、書式を併せる Set r = Range("A:A").Find(What:=r2, _ After:=ActiveCell, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) If Not r Is Nothing Then r.Activate End If End Sub '-------------------------- なお、 「オブジェクト変数またはWithブロック変数が設定されていません。」(実行時エラー '91') の原因は、Find() とくくっているので、見つからなかったときに、そのオブジェクトが、 Nothing(空) なのに、その空のオブジェクトに対して、Activate とするので、エラーが発生します。 '--------------------- Sub Test4() Dim i As Variant 'iは、基本的には、Long型ですが、Variant 型で指定しないといけません。 'エラー値の受け入れを、変数 i でしてあげる必要があるからです。 Worksheets("スケジュール").Select i = Application.Match(Range("R2").Value2, Columns(1), 0) If Not IsError(i) Then Cells(i, 1).Select End If End Sub '---------------------
その他の回答 (1)
- merlionXX
- ベストアンサー率48% (1930/4007)
理由は2つ考えられます。 1.Dim r2 As Stringと文字列型を宣言していますが、A列内の日付は文字列でないのでは?→Dim r2 As Dateと日付型にしました。 2.Selection.Findとなってますが、日付のあるA列を選択してないのでは? →A列を検索するようにしてみました。 Sub TEST03() Dim r2 As Date Application.ScreenUpdating = False Sheets("スケジュール").Select r2 = Range("R2").Value Range("A:A").Find(What:=r2, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Activate End Sub これでも同じエラーがでたらDim r2 As Stringに戻してやってみてください。
お礼
できました!Stringとか位置指定が変だったのですね。 大変助かりました。 ありがとうございました。
お礼
とても詳しい回答をありがとうございました。 Sub Test4()でできました。 一つずつゆっくり、VBA参考書と照らし合わせながら 勉強していきたいと思います。