dポイントプレゼントキャンペーン実施中!

日付のセルを検索するために、以下のような処理をさせていますが、日付だけのセルが検索できません。
 【例】(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を使用しています。

A 回答 (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
    • good
    • 0
この回答へのお礼

ご回答いただきまして、ありがとうございます。

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

お礼日時:2010/03/28 02:34

#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
    • good
    • 0

シート構成がどのような形式かが分かりませんので参考になるかどうかは微妙なのですが



前回も申し上げたとおりエクセル内での日付はシリアル値で収納されていますので文字列として "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に該当します

セルの表示形式と検索範囲のシリアル値両方に該当するセルを検索結果として表示する形にすれば目的は達成できるかとも思われます。
    • good
    • 0
この回答へのお礼

詳しくご回答いただきまして、本当にありがとうございます。

上記のご回答の方法が最適だと思い、数値セルだけを検索する方法
を調べていたところ、以下の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

何度もご親切にご回答いただいたお陰で、今までよりかなり高速な
方法を見つけることができました。
本当にありがとうござました。

お礼日時:2010/03/27 17:36

別案です。



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
    • good
    • 0

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

    • good
    • 0

他に方法が無かったら



検索対象のシートをすべて、他のシートに値のみで貼り付けて
そのシートで検索する。

そして、そのアドレスを使って処理する。
    • good
    • 0

シート内の日付を文字列に変換してみては?


=CONCATENATE(YEAR(A1),"/",MONTH(A1),"/",DAY(A1))
    • good
    • 0
この回答へのお礼

ご親切に再度ご回答いただきまして、誠にありがとうございます。

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

お礼日時:2010/03/26 18:56

(1) 2010/03/05が誕生日 は文字列


(2) 2010/03/05は、日付(シリアル値)
"20??/*/" は文字列にしか適用できないから検索不可なのだと思います。

2010/03/05 で検索すれば両方ともヒットすると思いますよ。
    • good
    • 1
この回答へのお礼

ご回答いただきまして、ありがとうございます。

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

お礼日時:2010/03/26 16:30

日付セルは文字列扱いで入力されていますか?



エクセルのデフォルトでは日付はシリアル値で扱われているので
"20??/*/"
上記条件で検索しても引っかかりませんよ
    • good
    • 0
この回答へのお礼

ご回答いただきまして、ありがとうございます。

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

お礼日時:2010/03/26 16:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!