• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:日付の検索後、処理を分岐したい)

日付の検索後、処理を分岐したい

このQ&Aのポイント
  • 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

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.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 ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー '#本当は日付値かどうかを確認する条件分岐が必要ですが、省略形で提示しました。

aitaine
質問者

お礼

ありがとうございます。 ' / ひとつ見つかれば、その他を探す必要がない場合--このコードでやりたいことがすぐ出来ました。こんな初心者の私に、懇切丁寧に教えていただき、感謝感激です。貴方様のご多幸を祈ります。

その他の回答 (4)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 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)
回答No.3

#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/標準 ' ' ーーーーーーーーーーーーーーー 実は関係ないシートを参照している場合 、、、等が考えられます。 そちらでイミディエイトウィンドウを表示された実行結果と 見比べて貰えば、何が違うのか、お解りになると思います。 以上です。

aitaine
質問者

補足

お手数かけてすいません。以下のように表示されました。 コードの変更が必要でしょうか? ◆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)
回答No.2

こんにちは。お邪魔します。 まず、直接の答えとして。 ' ' ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 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

aitaine
質問者

補足

大変詳しくご回答くださりありがとうございます。今Sub Re8317255()実行しましたが、何をやっても、NotFoundとなってしまいます。私は何か根本的な間違いを犯しているのでしょうか。Range("BR30:BR90") の最終セルに10月20日と入っているのに検索できないのです。    

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

こんにちは、参考に 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

aitaine
質問者

補足

ご回答ありがとございます。今、ご教示のコードを実行しましたが、セルBR90に2013/10/20と入力されているの〈表示は10月20日となってます)に、「見つかりません」というメッセージが出てしまいます。今良く調べましたらセルU2には、=表!$A$2が入力されており、表示は「10月度」となっていました。これが原因でしょうか?

関連するQ&A