• 締切済み

Excel VBA Findで日付だけのセルが検索できない

日付のセルを検索するために、以下のような処理をさせていますが、日付だけのセルが検索できません。  【例】(1)は検索できますが、(2)が検索されません。    (1) 2010/03/05が誕生日    (2) 2010/03/05    (※(1)、(2)共に検索できるようにしたいと思っています。) Dim FoundCell as Variant Dim search_words as String search_words = "20??/*/" Set FoundCell = Cells.Find(what:=search_words,After:=ActiveCell, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False) ※Excel2003を使用しています。

みんなの回答

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.9

#6です。 こんな記述もあるかも。 Sub test03()  Dim cv As Variant  Dim c As Variant  Dim maru As Long  Dim d As Long  Dim search_words As String  search_words = "20??/*/*"  cv = ActiveSheet.UsedRange  For Each c In cv   If IsEmpty(c) Then    '何もしない   ElseIf c = "○" Then    maru = maru + 1 '○セル発見   ElseIf c Like search_words Then    d = d + 1 '日付セル発見   End If  Next c  MsgBox maru & " : " & d End Sub

obaq0625
質問者

お礼

ご回答いただきまして、ありがとうございます。 UsedRange、For Each~Next、Like、を使うことで非常にシンプル で分かり易いコードになるんですね。 是非、使わせて頂きます。 はじめて、「教えて!goo」に質問させて頂きましたが、大変、 参考になりました。ありがとうございます。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.8

#6です。 配列に一旦収めて処理するようにしたのですね。 結局、しらみつぶしに比較するのであれば、 Like演算子でシンプルに比較してはどうでしょうか? Sub test02()  Dim i As Long  Dim j As Long  Dim cv As Variant  Dim end_row As Long  Dim end_col As Long  Dim maru As Long  Dim d As Long  Dim first_s As Long  Dim last_s As Long  Dim pos_20 As Long  Dim search_words As String  search_words = "20??/*/*"  end_row = Cells.SpecialCells(xlCellTypeLastCell).Row  end_col = Cells.SpecialCells(xlCellTypeLastCell).Column  cv = Range(Cells(1, 1), Cells(end_row, end_col))  maru = 0 '○のセルの数  d = 0 '日付セルの数  For i = 1 To end_row   For j = 1 To end_col    If IsEmpty(cv(i, j)) Then     '何もしない    ElseIf cv(i, j) = "○" Then     maru = maru + 1 '○セル発見    ElseIf cv(i, j) Like search_words Then     d = d + 1 '日付セル発見    End If   Next j  Next i  MsgBox maru & " : " & d End Sub

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.7

シート構成がどのような形式かが分かりませんので参考になるかどうかは微妙なのですが 前回も申し上げたとおりエクセル内での日付はシリアル値で収納されていますので文字列として "20??/*/"の検索をかけても引っかかりません シリアル値で入力された日付セルを検索する為には ・該当するデータを検索する "20??/*/"が2000/1/1~2099/12/31までとするとシリアル値は 36526~73050 の数値となりますのでこの範囲の数値データーを検索することで検索は可能 ただし日付以外の数値データーも該当してしまう為日付のみが入力されているセル範囲指定して検索する必要があります ・セルの表示形式が日付"年/月/日"の形式になっているセルを検索する NumberFormatでセルの表示形式を調べることが可能です 表示形式=m/d/yyyy または yyyy/m/d や yyyy/mm/dd といった形式のセルを検索、ご質問の2010/03/05はyyyy/mm/ddに該当します セルの表示形式と検索範囲のシリアル値両方に該当するセルを検索結果として表示する形にすれば目的は達成できるかとも思われます。

obaq0625
質問者

お礼

詳しくご回答いただきまして、本当にありがとうございます。 上記のご回答の方法が最適だと思い、数値セルだけを検索する方法 を調べていたところ、以下のHPにて、膨大なセルのデータを高速に 処理する方法が紹介されていました。 (例)10,000行×100列=1,000,000セルのセル情報を    高速に配列に格納 http://officetanaka.net/excel/vba/speed/s11.htm この方法では、シリアル値で入力されている日付データも書式どお りの値で配列に格納されます。「シリアル値の日付」も「文字列の 日付」も"20","/"などの文字列が含まれるかどうかを確認すること で、目的が達成できそうです。 ちなみに、以下の処理を5000行×256列で試したところ、1~2秒で 終了しました。 Sub New_Script()  Dim i As Long  Dim j As Long  Dim cv As Variant  end_row = Cells.SpecialCells(xlCellTypeLastCell).Row  end_col = Cells.SpecialCells(xlCellTypeLastCell).Column  cv = Range(Cells(1, 1), Cells(end_row, end_col))  maru = 0 '○のセルの数  d = 0 '日付セルの数  For i = 1 To end_row   For j = 1 To end_col    If IsEmpty(cv(i, j)) Then     '何もしない    ElseIf cv(i, j) = "○" Then     maru = maru + 1 '○セル発見    Else     first_s = InStr(1, cv(i, j), "/", vbTextCompare)     last_s = InStrRev(cv(i, j), "/", , vbTextCompare)     If first_s <> last_s Then      pos_20 = InStr(1, cv(i, j), "20", vbTextCompare)      If pos_20 > 0 And pos_20 < first_s Then       d = d + 1 '日付セル発見      End If     End If    End If   Next j  Next i  MsgBox maru & " : " & d  '実行結果は、maru = 56914 : d = 474 End Sub 何度もご親切にご回答いただいたお陰で、今までよりかなり高速な 方法を見つけることができました。 本当にありがとうござました。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.6

別案です。 Sub test01()   Dim c As Range   Dim search_words As String   search_words = "20??/*/*"      For Each c In ActiveSheet.UsedRange     If c.Value Like search_words Then       c.Select       MsgBox c.Address     End If   Next c End Sub

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.5

前の回答を取り消します。

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.4

他に方法が無かったら 検索対象のシートをすべて、他のシートに値のみで貼り付けて そのシートで検索する。 そして、そのアドレスを使って処理する。

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.3

シート内の日付を文字列に変換してみては? =CONCATENATE(YEAR(A1),"/",MONTH(A1),"/",DAY(A1))

obaq0625
質問者

お礼

ご親切に再度ご回答いただきまして、誠にありがとうございます。 検索するシートは何千行もあり、そのようなシートを何十も検索しなけ ればなりませんので、セルを一つひとつ確認する方法は取りたくないと 思っています。 「2010/03/05」や「2010/2/7」など日付だけのセルをすべて検索できる 方法があれば、そのセルだけをご回答頂いた方法で文字列に変換し、そ の後で再度、"20??/*/"で検索すれば、「日付だけのセル」も「日付と 文字列のセル」も両方を検索することができると思うのですが、「日付 だけのセル」をすべて検索することは可能でしょうか。 ご存知でしたら、よろしくお願い致します。

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

(1) 2010/03/05が誕生日 は文字列 (2) 2010/03/05は、日付(シリアル値) "20??/*/" は文字列にしか適用できないから検索不可なのだと思います。 2010/03/05 で検索すれば両方ともヒットすると思いますよ。

obaq0625
質問者

お礼

ご回答いただきまして、ありがとうございます。 検索する日付は、特定の日付ではなく、日付の入力されているセルを 全て検索したいのですが、「文字列の日付」も、「シリアル値の日付」 もどちらも検索できる方法をご存知でしたら、教えて頂けないでしょうか。 よろしくお願い致します。

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

日付セルは文字列扱いで入力されていますか? エクセルのデフォルトでは日付はシリアル値で扱われているので "20??/*/" 上記条件で検索しても引っかかりませんよ

obaq0625
質問者

お礼

ご回答いただきまして、ありがとうございます。 日付セルは文字列扱いでは入力されていないのですが、そのような場合に、 「日付だけ」のセルも、「日付と文字列」のセルもどちらも検索することは 可能でしょうか。 ご存知でしたら、よろしくお願い致します。

関連するQ&A

  • VBA★findを使って見つけたセルの値を取得

    AA="タナカ" Selection.Find(What:=AA, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate 自動マクロでコレをつくりました。 タナカを見つけてその隣の変数を取得するというものを作りたいと思っています。 関数で言うとVlookupでやるものをマクロ化しようとしています。 検索して見つかったセルの右隣のセルの値を取得するにはどうしたらいいですか?

  • EXCEL VBAでの 文字列検索

    セル内の文字列を部分一致で検索したいのですが、 下記の構文だと、検索対象シートを選択しなくてはならないため、 PGの動きが堅くなってしまいます。何かいい方法をご存知の方、 教えてください。 Selection.Find(What:=key, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False).Activate Cells.FindNext(After:=ActiveCell).Activate

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

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

  • EXCEL マクロでの検索をお教えください

     下記のようなマクロを使いたいのですがこの場合×があるときは良いのですが、  無いときエラーが出ます。どの様にすれば良いのかお教えください。  無いときエラーは オブジェクト変数または With ブロック変数が設定されていません。  となります。 Sub 検索()    Range("K12:K70").Select    Cells.Find(What:="×", After:=ActiveCell, LookIn:= _    xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _    xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate End Sub

  • エクセルのマクロについていくつか質問があります

    エクセルのマクロについていくつか質問があります 1 例えばA1セルが赤く塗りつぶされている場合隣のB1セルに赤と表示させたいのですが出来ますか 実際には色は何色かあります 2 セルの検索で検索であったセルを選択状態にするにはどうすればいいですか いちおう検索構文まではできてます Selection.Find(What:="6", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate 以上ですよろしくお願いします

  • [VBA]変数を利用して時間を検索する方法が・・・

    エクセルで表示形式が「hh:mm:ss」に設定されているセルの中から 指定のセルを検索するマクロを作ろうとしているのですが、 上手くいきません。 検索する数字を変数にして変えられるようにしたいです。 Sub Macro1() Dim temp As Double temp = Range("A1").Value 'A1には0:00:01を入れる Cells.Find(What:=temp, After:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate End Sub 上の記述だと、実行時エラー91「オブジェクト変数またはWithブロック・・・」が出ます。 > temp = "0:00:01" これに書き替えると「型が違います。」になり、「""」をはずすとコンパイルエラーになります。 「What:="0:00:01"」というように、直接入れると上手くいきます。 どなたか、お力をお貸しください。 よろしくお願いします。

  • エクセルVBAで検索

    エクセルのVBAで文字の検索をしたいと思います エクセルは2000です エクセルのマクロの記録機能を利用して 下記のようなマクロを作成しましたが これでは、別のシートの文字が検索できません 同一ブックの別のシートも検索できるようにするには どうしたら良いでしょうか、よろしくお願いします 以下同一シートしか検索しない例 Sub Macro1() Dim 検索文字 As String 検索文字 = InputBox("検索文字を入力してください") Cells.Find(What:=検索文字, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _ .Activate End Sub

  • VBAで、この場合のループ処理の終了条件の記述方法がわかりません。

    Excelのシート名『Pn』のなかから、変数iの文字列と一致するセルをアクティブにする というマクロを組んでみました。以下のマクロのループ処理の終了条件を、「変数iの文字列と一致するセルが見つかるまで」としたいのですが、ネットで調べても記述方法がわかりませんでした。 シート名の、nは枚数に応じて1から順に番号がつけられていて、場合によって何枚あるかは変わってきます。 『Pn』以外にもシートが色々とあるので、すべてのシートのなかからの検索は避けたいのです。 Dim i as string Dim n as integer dim FoundCell as Range i = TextBox1.Value n = 1 Do Until  終了条件  Sheets("P" & n).Activate Set FoundCell = Cells.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False) n = n + 1 Loop 終了条件をどのように記述したらよいのでしょうか? 当方のパソコンは WindowsXP、 Excel2003 です。 よろしくお願いいたします。

  • 検索した後の見つかった件数を取得したい

    画像のように手作業で検索した場合、下に検索結果の個数が表示されますが これをVBA内で取得することは可能でしょうか? マクロの記録だと Sub Macro() Cells.Find(What:="a", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False).Activate End Sub となるのですが、最後に全部の個数を取得したいです。

  • エクセル2007のマクロ不具合について、

    次のようなマクロを「CTRL+T」のショートカットキーで作成しましたが、2回続けて実行すると2回目が違う結果となってしまいます。 1回目はちゃんと 2010/1/2 のセルがアクティブセルとなるのですが、2回目は 2010/11/2 がアクティブセルとなってしまいます。  原因と対処法があればぜひ教えていただきたいと思います。よろしくお願いします。 Sub 本日() Cells.Find(What:=Date, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate End Sub

専門家に質問してみよう