DateValue関数は、引数に指定した文字列から、該当するシリアル値を返す関数です。たとえば、次のように使います。
Sub Sample6() MsgBox Format(DateValue("2010/1/24"), "ggge年") End Sub
日付と認識できる文字列は、日本語でもかまいません。
Sub Sample6() MsgBox Format(DateValue("平成22年1月24日"), "aaaa") End Sub
さて、このDateValue関数を使って、日付を検索してみましょう。ですが、その前に、今まで検証した結果をまとめておきます。
検索語に"2010/1/24"のような文字列を指定するとき、セルに検索語と同じ形式の表示形式が設定されていて、かつ、引数LookInにxlValuesを指定した場合のみ、正しく検索されました。
まず、セルにシリアル値が入力されている場合です。
A列の日付には「*2001/3/14」という標準の表示形式を設定しています。D列は「2001/3/14」、G列は「3月14日」です。最初は、LookIn:=xlFormulas で検索してみます。
Sub Sample7() Dim FoundCell As Range, msg As String msg = msg & "【A列】" & vbCrLf Set FoundCell = Range("A:A").Find(What:=DateValue("2010/1/24"), LookIn:=xlFormulas) If FoundCell Is Nothing Then msg = msg & "見つかりません" & vbCrLf Else msg = msg & FoundCell.Offset(0, 1) & vbCrLf End If msg = msg & "【D列】" & vbCrLf Set FoundCell = Range("D:D").Find(What:=DateValue("2010/1/24"), LookIn:=xlFormulas) If FoundCell Is Nothing Then msg = msg & "見つかりません" & vbCrLf Else msg = msg & FoundCell.Offset(0, 1) & vbCrLf End If msg = msg & "【G列】" & vbCrLf Set FoundCell = Range("G:G").Find(What:=DateValue("2010/1/24"), LookIn:=xlFormulas) If FoundCell Is Nothing Then msg = msg & "見つかりません" & vbCrLf Else msg = msg & FoundCell.Offset(0, 1) & vbCrLf End If MsgBox msg End Sub
おお、素晴らしい。検索語にDateValue関数を使い、引数LookInにxlFormulasを指定すると、セルの表示形式にかかわらず、ちゃんと検索できました。今度は、同じデータに対して、引数LookInにxlValuesを指定した検索を実行してみます。上のコードで、引数が違うだけですから、コードは省略します。
むむぅ・・・これは、ちょっと予想外でした。Windowsのコントロールパネルに依存する、標準の表示形式を設定しているときだけ、検索に成功しました。もちろん、DateValue("平成22年1月24日")のようにしても同じです。
今度は、セルにシリアル値ではなく、数式が入力されているケースです。前々ページでやったように、各列の2行目にだけシリアル値を入力し、3行目以降は「上のセル+1」という数式を入力します。検索したい「1月24日」は数式の計算結果になります。こちらも最初は、引数LookInにxlFormualsを指定します。
全滅です...orz
セルに設定された表示形式にかかわらず、DateValue関数の返すシリアル値がセルに入力されていないと、検索にはヒットしません。
最後に、同じように数式で作成した日付をDateValue関数で検索します。ただし、今度は引数LookInにxlValuesを指定します。
こちらも、標準の表示形式が設定されている場合のみ、検索に成功しました。DateValue関数が返すシリアル値と、標準の表示形式は、相性が良いのでしょうかね。
まとめると、次のようになります。
この結果を見てわかるように、日付を検索するときには、
によって、成功するか失敗するかが決まるということです。
日付の検索を一言で表すと「いろいろあって難しい」ってことですね。そのことだけ、忘れないようにしましょう。