• ベストアンサー

エクセル マクロ 日付の検索

エクセル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

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 '---------------------

mnhc33
質問者

お礼

とても詳しい回答をありがとうございました。 Sub Test4()でできました。 一つずつゆっくり、VBA参考書と照らし合わせながら 勉強していきたいと思います。

その他の回答 (1)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

理由は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に戻してやってみてください。

mnhc33
質問者

お礼

できました!Stringとか位置指定が変だったのですね。 大変助かりました。 ありがとうございました。

関連するQ&A