即効テクニック

関数関連のテクニック

日付を関数で操作する

(Excel 97/2000/2002/2003/2007)
Excelは日付や時間をシリアル値という連続した数値で管理しています。
VBAで使われているシリアル値は、1899年12月30日を0とし、以降1日経過するごとに1ずつ増加します。
このように、VBAでは日付を数値として管理しているためか、日付に関する関数が豊富に用意されています。

たとえば、日付から年・月・日を抜き出すために、それぞれYear関数・Month関数・Day関数が用意されています。
なお、Now関数は現在の日時を返す関数です。

Sub Sample1()
    Dim msg As String
    msg = msg & Year(Now) & vbCrLf
    msg = msg & Month(Now) & vbCrLf
    msg = msg & Day(Now) & vbCrLf
    MsgBox msg
End Sub
年月日を表す3つの数値からシリアル値に変換するには、DateSerial関数を使います。
Sub Sample2()
    MsgBox DateSerial(2008, 8, 27)
End Sub
DateSerial関数はシリアル値を返しますので、次のようにさまざまな変換が可能です。 次のマクロは「平成20年8月27日水曜日」を返します。
Sub Sample3()
    MsgBox Format(DateSerial(2008, 8, 27), "ggge年m月d日aaaa")
End Sub
日付形式の文字列からシリアル値に変換するのが、DateValue関数です。
Sub Sample4()
    MsgBox DateValue("平成20年8月27日")
End Sub
VBAは、日付と認識できる文字列を、自動的にシリアル値へと変換してくれるなど便利な配慮も備わっていますので、シリアル値を意識する機会は少ないかもしれません。 しかし、たとえば次のようなケースでは注意が必要です。 ここでは、アクティブシートのA列にランダムな日付が入力されているとします。 このA列にオートフィルタを設定して、任意の日付で絞り込んでみましょう。 この操作をマクロ記録すると次のようなコードが記録されます。
Sub Macro1()
    Selection.AutoFilter Field:=1, Criteria1:="2008/8/27"
End Sub
しかし、この記録されたマクロをそのまま実行しても、A列の日付を絞り込むことはできません。 実際には、A列にシリアル値(数値)が入力されているのであって、"2008/8/27"という文字列は入力されていないからです。 こんなときは、先に紹介したDateValue関数を使います。
Sub Macro1()
    Selection.AutoFilter Field:=1, Criteria1:=DateValue("2008/8/27")
End Sub
あるいは、ダブルコーテーション("")で囲んだ文字列として指定するのではなく次のように日付リテラルで指定するとうまくいきます。
Sub Macro1()
    Selection.AutoFilter Field:=1, Criteria1:=#8/27/2008#
End Sub