- ベストアンサー
日付の検索後、処理を分岐したい
- Excel2007でマクロ作成中の初心者です。不特定範囲の中で日付検索し、日付の有無で処理を分岐したいです。
- セルRange("$U$2")に入力された日付と不特定範囲のセルRange("BR30:BR90")に入力された日付を比較し、同じ日付があれば処理1に、なければ処理2に分岐したいです。
- Sub 日付検索後の処理() Dim FC As Range Set FC = Range("BR30:BR90").Find(What:=DateValue("2013/10/20"), LookIn:=xlFormulas) ’ここに処理を追加したい End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#2、3、4、cjです。#4に追加レスです。 自分ならこういう場合.Findメソッドを使わずに こんな感じにすると思います。 ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' / 検索にヒットしたセルすべてに処理を施す場合 Sub Re8317255C() Dim FC As Range Dim flg As Boolean For Each FC In Range("BR30:BR90") If FC.Value = DateValue("2013/10/20") Then MsgBox "Found" & vbLf & FC.Address(0, 0) & vbLf & FC.Value flg = True ' ' ここに処理を追加したい Exit For End If Next If Not flg Then MsgBox "NotFound" Exit Sub End If ' ' その他見つかった場合の処理 End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー '場合によっては、以下。 ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ' ' / ひとつ見つかれば、その他を探す必要がない場合 Sub Re8317255J() Dim FC As Range For Each FC In Range("BR30:BR90") If FC.Value = DateValue("2013/10/20") Then Exit For End If Next If FC Is Nothing Then MsgBox "NotFound" Exit Sub End If MsgBox "Found" & vbLf & FC.Address(0, 0) & vbLf & FC.Value ' ' ここに処理を追加したい Set FC = Nothing End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー '#本当は日付値かどうかを確認する条件分岐が必要ですが、省略形で提示しました。
その他の回答 (4)
- cj_mover
- ベストアンサー率76% (292/381)
' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub Re8317255b() Dim FC As Range Set FC = Range("BR30:BR90").Find(What:=Format(DateValue("2013/10/20"), "m""月""d""日"""), _ LookIn:=xlValues, LookAt:=xlWhole) If FC Is Nothing Then MsgBox "NotFound" Exit Sub End If MsgBox "Found" & vbLf & FC.Address(0, 0) & vbLf & FC.Value ' ' ここに処理を追加したい End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー これでどうでしょう?
- cj_mover
- ベストアンサー率76% (292/381)
#2、cjです。 見通しとしては、ご本人も気が付いていない処で 前提条件に誤りがある、ということになるかと思われます。 ひとまず、セルのプロパティを確認してみてください。 Visual Basic Editor (ふつーにVBAの編集画面)を起動し 標準モジュールに下記の2つのプロシージャを貼付けます。 ※タイトルバーに、 Microsoft Visual Basic for Applications - ... ブック名 - [Module1)コード)] のように表示されていれば、それが標準モジュールです。要確認。 続けて、Ctrl + G キー、にて、イミディエイトウィンドウを表示させておいて、 Sub RunChk() を実行して、イミディエイトウィンドウを確認してください。 実行結果を見ても尚、解決策が見出せない場合は、 イミディエイトウィンドウに出力された実行結果を、 丸ごと補足欄に貼り付けてご相談ください。 ' ' 標準モジュール ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub RunChk() ChkCell Range("BR90") End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub ChkCell(ByVal Target As Range) With Target Debug.Print "◆"; .Worksheet.Name, .Address(0, 0); "◆" Debug.Print ".Value", .Value, TypeName(.Value) Debug.Print ".Value2", .Value2 Debug.Print ".Formula", .Formula Debug.Print ".Text", .Text Debug.Print ".NumForm", .NumberFormat Debug.Print ".NumFormLocal", .NumberFormatLocal End With End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ご質問の前提が正しければ、実行結果は、 ' ' ーーーーーーーーーーーーーーー ◆Sheet1 BR90◆ .Value 2013/10/20 Date .Value2 41567 .Formula 41567 .Text 2013 / 10 / 20 .NumForm m / d / yyyy .NumFormLocal yyyy / m / d ' ' ーーーーーーーーーーーーーーー のようになります。 仮に時刻を含む日付値ならば、 ' ' ーーーーーーーーーーーーーーー ◆Sheet1 BR90◆ .Value 2013/10/20 20:21:00 Date .Value2 41567.8479166667 .Formula 41567.8479166667 .Text 2013 / 10 / 20 .NumForm m / d / yyyy .NumFormLocal yyyy / m / d ' ' ーーーーーーーーーーーーーーー のように。 以上のような結果であれば、Sub Re8317255()は正しく機能します。 問題があるとすれば、 ' ' ーーーーーーーーーーーーーーー ◆Sheet1 BR90◆ .Value 10月20日 String .Value2 10月20日 .Formula 10月20日 .Text 10月20日 .NumForm @ .NumFormLocal @ ' ' ーーーーーーーーーーーーーーー のように、実は文字列だった、という場合や、 ' ' ーーーーーーーーーーーーーーー ◆Sheet3 BR90◆ .Value Empty .Value2 .Formula .Text .NumForm General .NumFormLocal G/標準 ' ' ーーーーーーーーーーーーーーー 実は関係ないシートを参照している場合 、、、等が考えられます。 そちらでイミディエイトウィンドウを表示された実行結果と 見比べて貰えば、何が違うのか、お解りになると思います。 以上です。
補足
お手数かけてすいません。以下のように表示されました。 コードの変更が必要でしょうか? ◆sheet名 BR90◆ .Value 2013/10/20 Date .Value2 41567 .Formula 41567 .Text 10月20日 .NumForm m"月"d"日";@ .NumFormLocal m"月"d"日";@
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。お邪魔します。 まず、直接の答えとして。 ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub Re8317255() Dim FC As Range Set FC = Range("BR30:BR90").Find(What:=DateValue("2013/10/20"), _ LookIn:=xlValues, LookAt:=xlPart) If FC Is Nothing Then MsgBox "NotFound" Exit Sub End If MsgBox "Found" & vbLf & FC.Address(0, 0) & vbLf & FC.Value ' ' ここに処理を追加したい End Sub ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 念の為。 以上は、標準モジュール、または、対象セルが属するシートのシートモジュール の記述として有効です。 他のシートモジュールに記載する場合は、 Rangeオブジェクトの親オブジェクトとしてのワークシートを指定する必要があります。 以下、参考まで。 日付値の実態については、ご存じでしょうか。 DateValue("2013/10/20") = 41567 とか TimeValue("16:00") = 0.6666.... とか CDate("2013/10/20 16:00") = 41567.6666.... とか 日付に該当する整数と、時刻に該当する整数とを 組合わせたり、単独で用いたり、それもこれも皆、 一様に扱っているのが日付型(Date型)の値です。 例えば、表示形式に"yyyy/m/d"と指定してあれば、 セルの表示は"2013/10/20"に見えても、 セルの値は 2013/10/20 16;00 かも知れません。 なので、Findメソッドを使う場合は、(名前付き引数Whatに指定する値は、特に) この点に注意した方が良いかも、です。 以下、本題からは逸れますが、確認用、お浚い用のマクロです。 Sub CheckDateV() Dim dt検索値 As Date Dim dt検索対象 As Date Dim sMsg As String dt検索値 = DateValue("2013/10/20") ' = Range("U2").Value If dt検索値 = Int(dt検索値) Then sMsg = "検索値:U2は、時刻を含まない日付値です。" _ & vbLf & Format(dt検索値, "yyyy/m/d") & vbLf & vbLf Else sMsg = "検索値:U2は、時刻を含む日付値です。" _ & vbLf & Format(dt検索値, "yyyy/m/d h:mm:ss") & vbLf & vbLf End If dt検索対象 = Range("BR90").Value If dt検索対象 = Int(dt検索対象) Then sMsg = sMsg & "検索対象:BR90は、時刻を含まない日付値です。" _ & vbLf & Format(dt検索対象, "yyyy/m/d") & vbLf & vbLf Else sMsg = sMsg & "検索対象:BR90は、時刻を含む日付値です。" _ & vbLf & Format(dt検索対象, "yyyy/m/d h:mm:ss") & vbLf & vbLf End If If dt検索対象 = dt検索値 Then sMsg = sMsg & "検索値 と検索対象の日付型の値は、一致しています。" Else sMsg = sMsg & "検索値 と検索対象の日付型の値は、一致しません。" End If MsgBox sMsg End Sub
補足
大変詳しくご回答くださりありがとうございます。今Sub Re8317255()実行しましたが、何をやっても、NotFoundとなってしまいます。私は何か根本的な間違いを犯しているのでしょうか。Range("BR30:BR90") の最終セルに10月20日と入っているのに検索できないのです。
- watabe007
- ベストアンサー率62% (476/760)
こんにちは、参考に Dim FC As Range With Range("BR30", Cells(Rows.Count, "BR").End(xlUp)) Set FC = .Find(Range("U2").Value, LookIn:=xlFormulas, LookAt:=xlWhole) End With If FC Is Nothing Then MsgBox Range("U2").Value & "は、見つかりません" Else MsgBox FC.Address(0, 0) & "にミッケ!" End If
補足
ご回答ありがとございます。今、ご教示のコードを実行しましたが、セルBR90に2013/10/20と入力されているの〈表示は10月20日となってます)に、「見つかりません」というメッセージが出てしまいます。今良く調べましたらセルU2には、=表!$A$2が入力されており、表示は「10月度」となっていました。これが原因でしょうか?
お礼
ありがとうございます。 ' / ひとつ見つかれば、その他を探す必要がない場合--このコードでやりたいことがすぐ出来ました。こんな初心者の私に、懇切丁寧に教えていただき、感謝感激です。貴方様のご多幸を祈ります。