- ベストアンサー
Excel2010 マクロ Findで日付の検索
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 これなら結果はどうなりますか? Option Explicit Sub test() Dim 検索日付 As Double Dim 日付検索列 As Long Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("ハンマリング履歴") '検索日付 = CDate(ws1.Cells(4, 1)) '日付検索列 = ws1.Rows(2).Find(what:=検索日付, LookIn:=xlValues, LookAt:=xlWhole, _ ' searchorder:=xlByColumns, SearchDirection:=xlPrevious).Column 検索日付 = CDbl(ws1.Cells(4, 1)) 日付検索列 = WorksheetFunction.Match(検索日付, ws1.Rows(2), 0) MsgBox 日付検索列 End Sub
その他の回答 (14)
- HohoPapa
- ベストアンサー率65% (455/693)
- kkkkkm
- ベストアンサー率66% (1719/2589)
No12の訂正です。ごたごたしてすみません。 For Each mRange In ws1.Range(Cells(2, "F"), Cells(2, Columns.Count).End(xlToLeft)) ↓ For Each mRange In ws1.Range(ws1.Cells(2, "F"), ws1.Cells(2, Columns.Count).End(xlToLeft)) また、余計なお世話だと思いますがFindで見つからなかった時の処理(エラーを出さないように)とかあった方がいいのではと思います。 Sub Test2() Dim 日付検索列 As Long Dim Fr As Range Dim 検索日付 As Date Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("ハンマリング履歴") 検索日付 = CDate(ws1.Cells(4, 1).Value) With ws1 Set Fr = .Range(.Cells(2, 6), .Cells(2, Columns.Count).End(xlToLeft)). _ Find(What:=DateValue(検索日付), LookIn:=xlValues, lookat:=xlWhole, _ SearchOrder:=xlByColumns, SearchDirection:=xlPrevious) If Not Fr Is Nothing Then 日付検索列 = Fr.Column Debug.Print 日付検索列 Else Debug.Print "見つかりません" End If End With End Sub
お礼
今回の質問内容はworksheetfunctionのMatchを使用する事で上手くいきました。 大切な時間を割いて、色々考えてくれてありがとうございました。
- SI299792
- ベストアンサー率47% (774/1619)
いろいろやってみましたが、日付で数式だと、Findは使えないみたいです。 (手作業で検索したらできたのですが、それをマクロの記録をして行い、実行したらエラーになりました) Match を使ったらできました。 Option Explicit ' Sub Macro1() Dim 日付検索列 As Integer ' On Error Resume Next 日付検索列 = WorksheetFunction.Match([A4], [ハンマリング履歴!2:2], 0) On Error GoTo 0 Debug.Print 日付検索列 End Sub
お礼
記述していたコードで上手くいきました。大切な時間を割いて、色々考えてくださり、ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 数式を使わず表を作成してみようと思います。 そうですか。試しにFindを使わないで以下のコードで見つかるかどうかを、気が向いたらやってみてください。 Sub Test() Dim 日付検索列 As Long Dim 検索日付 As Date Dim ws1 As Worksheet Dim mRange As Range Set ws1 = ThisWorkbook.Worksheets("ハンマリング履歴") 検索日付 = CDate(ws1.Cells(4, 1).Value) For Each mRange In ws1.Range(Cells(2, "F"), Cells(2, Columns.Count).End(xlToLeft)) If DateValue(mRange.Value) = DateValue(検索日付) Then 日付検索列 = mRange.Column Exit For End If Next Debug.Print 日付検索列 End Sub
お礼
返事が遅れて申し訳ありません。 試してみたのですが、 If DateValue(mRange.Value) = DateValue(検索日付) Then の個所で、『実行時エラー13 型が一致しません』が発生しました。 今回の質問内容はworksheetfunctionのMatchを使用する事で上手くいきました。 大切な時間を割いて、色々考えてくれてありがとうございました。
- m_and_dmp
- ベストアンサー率54% (987/1817)
NO.5 です。 Excel のバージョン違いによるものかもしれません。 記録マクロを実行し、Find のところがどのようなコードになるか確認してください。
お礼
もう少し考えてみます。ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> (例えばG2セルに =F2+1)を入れて日付を表示させているセル はい、その状態でちゃんと見つけてくれます。先ほどは型が違いますのエラーだと記載してましたが、型が違いますのエラーではないのですか? ws1.Rows(2).をws1.Range(Cells(2, 6), Cells(2, 20))あたりで試してみるとか。 日付は微妙な差でFINDで見つからないことがあるのである程度やってだめならForNextで探すようにした方が早いかもしれません。
お礼
数式を使わず表を作成してみようと思います。色々考えてくれてありがとうございました。
- m_and_dmp
- ベストアンサー率54% (987/1817)
NO.5 です。 Set ws1 = ThisWorkbook.Worksheets("Sheet1") の ("Sheet1") は、実際のシート名になおして実行しましたか? エラーがどのコードで出るか、VBA を開き、デバッグモードで実行してみてください。VBA のツールボタンにデバッグボタンが表示されていないときは、ツールバーの適当な場所をマウス右クリックし、「ユーザー設定」からボタンを追加します。
お礼
色々考えてくれてありがとうございます。 シート名は、こちらのシートに合わせて変更しています。又、デバックについても、以前同様の御指摘を受けてからは、コードを記述したら、F8キーで1つ1つ確認するようにしています。毎回Findの記述でエラーがかかります。Findの記述が間違っているのだろうなと思いますが、さっぱりわからないです。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No6です まさかとは思いますが、データのあるシートがハンマリング履歴ではない (たとえばSheet2とか)ということではないですよね。
お礼
コードのシート名は、対応したシート名に変更しています。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No2です > 型が一致しませんのエラーが発生しました。 変なエラーですね。以下のコードでちゃんと結果が出るのですが…。DateValue(検索日付)にしなくても検索日付でも出ます。 一度データを入力し直してみてはいかがでしょう。 Dim 日付検索列 As Long Dim 検索日付 As Date Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("ハンマリング履歴") 検索日付 = CDate(ws1.Cells(4, 1).Value) 日付検索列 = ws1.Rows(2).Find(What:=DateValue(検索日付), LookIn:=xlValues, lookat:=xlWhole, _ SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Debug.Print 日付検索列
お礼
色々考えてくれてありがとうございます。 セルに日付をダイレクトで入れた場合は、教えて下さった記述でいけましたが、セルに数式(例えばG2セルに =F2+1)を入れて日付を表示させているセルは、Findの記述で実行時エラー91が発生します。日付を数式ではなく、日付そのもので入れなおすと、Findの記述でエラーがかかることなく最後まで行きます。
- m_and_dmp
- ベストアンサー率54% (987/1817)
試行錯誤の末、 --------------------------------------------------------------- Sub Macro1() Set ws1 = ThisWorkbook.Worksheets("Sheet1") What = ws1.Range("A4") ws1.Rows("2:2").Select Selection.Find(What:=What, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate End Sub --------------------------------------------------------------- で、動きました。 A4 の内容を直接検索文字列に設定すると良いと思います。CDate() 関数で変換する必要はないと思います。 検索範囲をws1.Rows("2:2") とするのではなく、 ws1.Rows("2:2").secelt Selection.Find ... とするのが良いと思います。
お礼
回答して頂きありがとうございました。教えて下さった記述を自分のエクセルの表合うように、修正して試したのですが、エラーが出て駄目でした。
- 1
- 2
お礼
返事が遅れて申し訳ありません。 色々考えてくれてありがとうございました。諦めていたのですが、上手くいきました。 数式が入っている日付の検索にFindは使えないんですね。