日付を検索する


関数を使えばいいじゃないか

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関数が返すシリアル値と、標準の表示形式は、相性が良いのでしょうかね。

まとめると、次のようになります。

この結果を見てわかるように、日付を検索するときには、

  • セルに入力されているのはシリアル値か数式か
  • セルにどんな表示形式が設定されているか
  • 検索語が文字列形式かDateValueなどの関数か
  • Findメソッドの引数に何を指定しているか

によって、成功するか失敗するかが決まるということです。

日付の検索を一言で表すと「いろいろあって難しい」ってことですね。そのことだけ、忘れないようにしましょう。