• 締切済み

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