
日付のセルを検索するために、以下のような処理をさせていますが、日付だけのセルが検索できません。
【例】(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件)
- 最新から表示
- 回答順に表示
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
ご回答いただきまして、ありがとうございます。
UsedRange、For Each~Next、Like、を使うことで非常にシンプル
で分かり易いコードになるんですね。
是非、使わせて頂きます。
はじめて、「教えて!goo」に質問させて頂きましたが、大変、
参考になりました。ありがとうございます。
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
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に該当します
セルの表示形式と検索範囲のシリアル値両方に該当するセルを検索結果として表示する形にすれば目的は達成できるかとも思われます。
詳しくご回答いただきまして、本当にありがとうございます。
上記のご回答の方法が最適だと思い、数値セルだけを検索する方法
を調べていたところ、以下の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
何度もご親切にご回答いただいたお陰で、今までよりかなり高速な
方法を見つけることができました。
本当にありがとうござました。
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
No.3
- 回答日時:
シート内の日付を文字列に変換してみては?
=CONCATENATE(YEAR(A1),"/",MONTH(A1),"/",DAY(A1))
ご親切に再度ご回答いただきまして、誠にありがとうございます。
検索するシートは何千行もあり、そのようなシートを何十も検索しなけ
ればなりませんので、セルを一つひとつ確認する方法は取りたくないと
思っています。
「2010/03/05」や「2010/2/7」など日付だけのセルをすべて検索できる
方法があれば、そのセルだけをご回答頂いた方法で文字列に変換し、そ
の後で再度、"20??/*/"で検索すれば、「日付だけのセル」も「日付と
文字列のセル」も両方を検索することができると思うのですが、「日付
だけのセル」をすべて検索することは可能でしょうか。
ご存知でしたら、よろしくお願い致します。
No.2
- 回答日時:
(1) 2010/03/05が誕生日 は文字列
(2) 2010/03/05は、日付(シリアル値)
"20??/*/" は文字列にしか適用できないから検索不可なのだと思います。
2010/03/05 で検索すれば両方ともヒットすると思いますよ。
ご回答いただきまして、ありがとうございます。
検索する日付は、特定の日付ではなく、日付の入力されているセルを
全て検索したいのですが、「文字列の日付」も、「シリアル値の日付」
もどちらも検索できる方法をご存知でしたら、教えて頂けないでしょうか。
よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Excel(エクセル) エクセルマクロで教えてください 2 2022/05/04 09:07
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) ワークブック内すべて検索 2 2022/12/20 20:13
- Excel(エクセル) マクロで特定日より1日前の日を求めたい 6 2022/05/08 09:23
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) Excle VBA Findメソッドについて 3 2022/07/15 13:56
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】A列にある、日付(本...
-
Excelに入力した個々の日付の数...
-
日付だけを変更して印刷(Excel)
-
エクセルでENTERを押すと数式が...
-
入力後に日付順になるように自...
-
エクセルで数字列の間に『/』を...
-
Excelで半年後の日付を計算したい
-
31:30:00が1900/1/1 7:30:0
-
◆ EXCEL自動入力日付を自動で...
-
日付を入力したセルをファイル...
-
Excelで8/26等の日付を全てその...
-
エクセルで1年後の月末を表示さ...
-
EXCELで直近の日付を抽出する関数
-
エクセル 当番表の作り方 エク...
-
エクセル セルに109と入力する...
-
エクセルで日付入力欄を作成し...
-
日付の照合でFALSEになります。
-
エクセルのセルにたとえば「756...
-
word、日付選択コンテンツの隣...
-
エクセルで日付をtoday()で自動...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelに入力した個々の日付の数...
-
日付だけを変更して印刷(Excel)
-
Excelで半年後の日付を計算したい
-
31:30:00が1900/1/1 7:30:0
-
入力後に日付順になるように自...
-
エクセルでENTERを押すと数式が...
-
Excelで8/26等の日付を全てその...
-
エクセルで数字列の間に『/』を...
-
エクセル 当番表の作り方 エク...
-
エクセル関数で日付かどうかの...
-
エクセルで日付入力欄を作成し...
-
エクセルで1年後の月末を表示さ...
-
EXCELで直近の日付を抽出する関数
-
ファイルのオープン時に今日の...
-
日付の照合でFALSEになります。
-
ワード差込について
-
excelで月末日を判定したい
-
VBAでセルに入っている日付をシ...
-
☆Excelエクセルで入力した日の...
-
エクセル グラフ 軸の日付表記...
おすすめ情報