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

この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
回答を見る
  • ベストアンサー

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

Excel2007でマクロ作成中の初心者です。 不特定範囲の中で日付検索し、日付の有無で 処理を分岐したいです。でも、どうしても出来ません。 よろしくお願いします。 1)不特定範囲 Range("BR30:BR90")     行は毎月1回ごとに増加します。    ここのセルには、すべて2013/10/12 形式で日付けが入ってます。 2)見つける日付は、セルRange("$U$2")です。    2013/10/12 形式で日付けが入ってます。 3)分岐処理を追加したいです。    もし同じ日付が見つかった場合は、 処理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

  • 日付の検索

    OFFICE2016 マクロでの日付検索でエラーになってしまいます。 状態は次の通り MASTERシートで AK4セル =TODAY() 書式 分類:日付 種類:*2012/3/14 B16セル =AK2&"/"&AK3 (AK2には2019、AK3には9の数値が入っている) 書式 分類:日付 種類:*2012/3/14 D17セル =DATEVALUE(B16) 書式 分類:日付 種類:*2012/3/14 E17セル =D17+1 書式 分類:日付 種類:*2012/3/14 F17セル =E17+1 同様に左のセルに+1した式となっている。AH17セルまで。 動作させたマクロ Sub Macro6() Sheets("MASTER").Visible = True Sheets("MASTER").Select Dim fkey As String Dim frange As Range fkey = Worksheets("MASTER").Range("AK4") Set frange = Range("D17:AH17").Find(What:=DateValue(fkey), LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows) If (frange Is Nothing) Then MsgBox "error" Else Cells(frange.Row, frange.Column).Select End If End Sub 上記マクロの修正をお願いしたく。 webで色々調べたのですが、修正内容が分かりません。

  • 検索後のセルの選択を正しくしたい

    Excel2007でマクロ作成中の初心者です。 以下のコードの中で(1)のところがうまく作動できません。 ここの ActiveCell.Select を正常にするにはどうしたらよいかご教示をお願いします。 Sub 最終日の検索() Dim FC As Range Dim mydate As Date mydate = Range("BQ5").Value For Each FC In Range("BR30:BR300") If FC.Value = DateValue(mydate) Then Exit For End If Next If FC Is Nothing Then MsgBox "みつかりませんここでおわりです" Exit Sub End If MsgBox "見つかりました" & vbLf & FC.Address(0, 0) & vbLf & FC.Value ' ' ここに処理を追加したい ActiveCell.Select ’----------(1) Selection.Offset(0, 45).Select ActiveCell.Select 貼付けしてあるかどうか Set FC = Nothing End Sub ---------------------------------- Sub 貼付けしてあるかどうか() If ActiveCell.Value = "※※" Then MsgBox " 既に貼付けしてあります" Else MsgBox "貼付けしてないので処理します" End If End Sub

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

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

  • 日付の入ったセル範囲から、ある日付を選択したい(再

    今日、表題のとおりの質問に次のとおり教えていただきました。 自分としては、8月の21でなく、9月の21を選びたいです。 Sub 日付選択() Range("AL4:CU4").Select Selection.Name = "日付範囲" Range("日付範囲").Find(What:=Day(Range("AJ2")), LookIn:=xlValues).Select End Sub セルAJ2には、2015/9/21が入っています。 AL4からCU4には 8月18日から10月17日の間の、日にちだけが、はいっています。 上のコードを実行すると、8月21日を選択します。 これを9月21日のところを選択するようにしたいです。よろしくご教示お願いします。

  • 日付の入ったセル範囲から、ある日付を選択したい

    Windows7 EXCEL2007でマクロ作成中の初心者です。 (1)セルには式がはいってます。 'セルL4 に =VLOOKUP(J73,年月管理!F17:I39,4,FALSE) 'セルM4 に =L4+1 'セルN4 に =M4+1 'セルO4 に =N4+1 'セルP4 に =O4+1 (2)セルの表示は年月日のうち日のみ表示 'セルL4 に 18 (2015/8/18の日付のうち日のみ)が表示されてる 'セルM4 に 19 (日付のうち日のみ)以下同じ 'セルN4 に 20 (日付のうち日のみ) 'セルO4 に 21 (日付のうち日のみ) 'セルP4 に 22 (日付のうち日のみ) (3)検索したい年月日は次のとおりです 'セルK4 に 2015/8/21 次のようなコードでO4のセルを選択したいのですが、うまく行きません。 どうしたらよいか、教えて下さい。 Sub 日付選択() Range("L4:P4").Select Selection.Name = "日付範囲" Range("日付範囲").Find(Range("K4").Value).Select End Sub

  • VBAでの背景色分岐後の結合セルの処理について

    VBAで対象範囲の背景色が黒の部分のみ"-"をいれるという処理をしたいのですが、ループがうまく動いておらず最初のセルのみ"-"が入った状態です。 ※対象範囲のセルは3列ずつ結合されています コードは以下になります。VBA初心者のため、初歩的な質問かもしれませんがご回答よろしくお願いいたします。 Private Sub CommandButton1_Click() Dim C As Range Sheets("sheet1").Select T33:BA74 の範囲を1セルずつ繰り返す For Each C In Range("T33:BA74") セルが黒のとき If C.Interior.ColorIndex = 1 Then C.Value = "-" end If '次のセルへ Next End Sub

  • 検索方法について

    マクロの記述方法? Sub データの検索()        Dim myRange As Range Set myRange = Range("範囲").Find(what:=Range("セル").Value LookIn:=xlValues) これで(セル)と同じ値を持つセルを検索できるんですが、    If Not myRange Is Nothing Then ↑だった場合 見つかったセルの終端セルのひとつ右のセルを取得して ↑このマクロ記述がどうやってもできません・・・ どうすればよいのでしょうか? ちなみに違うシートから範囲を決めることって可能でしょうか? (シート1にユーザーフォームを起動させるボタンあり) (シート1のA1のセルと同じデータをシート2のデータから検索したい) ぐちゃぐちゃですがわかる方いますでしょうか・・・?

  • エクセルの条件分岐について教えて下さい。

    エクセルの条件分岐について教えて下さい。 現在、エクセル2003を使っています。 A1セルが「空白」「ON」というプルダウンリストになっていて、「ON」を選択するとB1セルに「はじまり」、C1セルに「おわり」という文字が表示されるようにしたいと考えています。 色々調べてみて参考になるものをようやく見つけて、自分でカスタマイズしてみました。 Sub 条件分岐 () if Range("A1").value = ON    Range("B1").value = "はじまり"    Range("C1").value = "おわり" End if End Sub これをシート部分を「右クリック→コードの表示」で書いてみたのですが動きませんでした。 どうすれば思うようにできるか分からずつまづいております。 お手数ですが、どなたかご教授頂けないでしょうか?

  • Excel2007VBA 日付の加算について

    ●質問の主旨 コピー元のシートの特定セル(A3セル)に入力されている日付に対して 加算を行い、その加算した日付をシート名とコピー先の シートの特定セルに入力するためにはどうすればよいでしょうか? 具体的には下記のコードをどのように書き換えればよいでしょうか? 「Worksheets(i + 1).Name = mydate」のところでエラーが出てしまいます。 ご存知の方、ご教示願います。 ●コード Sub 一週更新() Application.ScreenUpdating = False Dim i As Integer Dim mydate As Date '既存のシート数を取得 i = ThisWorkbook.Worksheets.Count '最終シートをコピーして後ろに挿入 Worksheets(i).Copy after:=Worksheets(i) 'mydateは最終シートのA3セルに入力されている日付の1週間後の日付とする mydate = DateAdd("ww", 1, Worksheets(i).Range("A3")) '追加したシートのシート名はmydate2の日付とする Worksheets(i + 1).Name = mydate '新しく作成したワークシートについて以下の処理を行う With ActiveSheet Range("A3") = mydate Range("A12").ClearContents Range("A19").ClearContents Range("A26").ClearContents Range("A32").ClearContents End With Application.ScreenUpdating = True End Sub ●補足 上記コードは週単位の報告書を作成するためのコードです。 コピー元のA3セルは表示上は9/16となっており、 「セルの書式設定上」は「日付」→「3/14」, ロケールは日本語です。 私はVBA初心者です。

  • 内部処理形式が日付型 (Date) の Variant

    文字変数として保存されている日付の演算を組込み関数で行おうと debug.print DateDiff("yyyy", DateValue("2001.1.1"), DateValue("2001.10.16")) debug.print DateDiff("yyyy", "2001.1.1", "2001.10.16") 等やってみたのですが、 実行時エラー13 型が一致しません となり実行できません。 DateDiff 関数の引数になる「内部処理形式が日付型のVariant」型変数への代入方法をお知らせください。 実行環境 Visual Basic 6.0 SP5 Windows 98 256MB + 32GB-HDD(空き10GB)

専門家に質問してみよう