はじめに

今回は日付に注目して説明を行います。日付を取得・設定する関数(Date,Time,Now)、「三日後は何日か」などを計算するための関数(DateAdd、DateDiff、DatePart)、「今年は何年か」などを取り出す関数(Year、Month、Day、Weekday、WeekdayName、Hour、Minute、Second)について説明して行きたいと思います。

パソコンは日付と時刻を取り出すために、機械的に日付用IC(集積回路:Integrated Circuit)を内蔵しています。電源を入れているときに日付用ICの電源は充電され、電源を外しても1週間くらいは正しく動いています。パソコンは時間を見て動く処理が多いので、日付用ICを組み込んだ作りになっているのです。プログラムを組む場合も日付用関数は良く使用されます。

ゼロからはじめるVBA - 基本編
ゼロからはじめるVBA - VBA事始め編
ゼロからはじめるVBA - セル操作編
ゼロからはじめるVBA - 条件による分岐編
ゼロからはじめるVBA - 繰り返し処理編
ゼロからはじめるVBA - ユーザーフォーム編
ゼロからはじめるVBA - マクロの記録を使った例題編
ゼロからはじめるVBA - 数値関数編
ゼロからはじめるVBA- 文字列関数編(1)
ゼロからはじめるVBA - 文字列関数編(2)

日付を取得・設定する関数

現在の日付を取り出したい時に使用します。日付の処理を行うときは、まず今日の日付を取得して、今日を中心に処理を行うことが多いと思います。

以下説明するリストはsample.lzhの中に収録しています。サンプルとしてご活用ください。

Date関数

日付を取得します。Date関数を変数に入れて、表示してみましょう。

[リスト1]Rei_Date(日付関係.xlsm)

Sub Rei_Date()
    a = Date
    MsgBox (a)          '(1)結果:2010/01/01(今日の日付が2010年1月1日の時)
End Sub

(1)のように今日の日付(パソコンに設定してあるシステム日付)の内容が表示されます。「システム日付」と書いたのは、初めてパソコンに電源が入ったとき、日付用ICは今日が何日か知りません。初期の設定で教えてあげなくてはいけないのです。現在はインターネットという便利なものがあって、オペレーションシステムは正確な日付をインターネットからもらってきて、セットすることができます。インターネットが一般的でない時代は、普通の時計と同じく、人が設定してやらなければいけませんでした。

Date関数は日付を設定することもできます。Date関数で設定するとシステム日付も変わります(*)。普通はあまり使用しないかもしれませんが、プログラムを作成して、デバッグするときとても便利な命令です。たとえば、一週間少しずつ違う作業をさせるプログラムの時、デバッグする日が月曜だとします。火曜から日曜までの処理のテストをする時、Date関数を使ってシステムの日付を変更し、動作のテストを行います。作業の最後に今日の日付に戻すのを忘れないようにしてください。以下例題を示します。

*)xxx関数と名前の付くものは、IT用語辞典では、「引数と呼ばれるデータを受け取り、定められた通りの処理を実行して、結果を返す一覧の命令群」と書いてあります。関数でデータ設定ができるのはおかしいという意見もあります。Excelでは日付を取り込むものをDate関数、日付を設定するものをDateステートメントと呼んでいます。

Sub Rei_DateSet()
    Date = #1/2/2010#       '2010/01/02
    MsgBox (Date)
End Sub

システム日付を2010/01/02に変更します。日付の書き方には決まりがあり、日付の前後に「#」をつけて表します。「日付リテラル」と呼ばれ、日付・時刻を指定するときに使用されます。日付と時刻はつながっているので、次に説明するTime関数でも使用します。指定データに時刻が省略されると、午前12時0分0秒、日付が省略されると、西暦1年1月1日が設定されます。書き方を表にしてみました。

設定値 内容
#1/2/2010# 2010/01/02 12:00:00 AM
#1/2/2010 6:15:30 AM# 2010/01/02 6:15:30 AM
#6:15:30 AM# 1/1/1 6:15:30 AM
#6:15:30# 1/1/1 6:15:30 AM
#13:20:35# 1/1/1 1:20:30 PM
#1:20:30 PM# 1/1/1 1:20:30 PM

日付の書き方

日付の設定はWindows Vistaの場合、ユーザアカウント制御が標準で設定されているため、日付の書き込みを実行するとエラーになります。実行する場合はユーザアカウント制御を無効にして行ってください。作業終了後は忘れずにユーザアカウント制御を有効にしたほうがよいと思います。ユーザアカウント制御は[コントロールパネル]-[ユーザアカウント]-[ユーザアカウント制御の有効化または無効化]-[ユーザアカウント制御(UAC)を使ってコンピュータの保護に役立たせる]のチェックの設定、で行えます。

Time関数

現在の時刻を取り出したい時に使用します。プログラムでは、取り出した時刻をもとに、「何分後に処理を開始する」などのプログラムを作成するのに使用します。以下表示の例題です。

[リスト3]Rei_Time(日付関係.xlsm)

Sub Rei_Time()
    a = Time        '結果:9:56:26(現在9時56分26秒の時)
    MsgBox (a)
End Sub

変数aに現在の時刻が入ります。時刻をセットすることもできます。

[リスト4]Rei_TimeSet(日付関係.xlsm)

Sub Rei_TimeSet()
    Time = #1:12:11 PM#     '13時12分11秒に設定
    MsgBox (Time)
End Sub

Date関数と同様に、Vistaの場合、ユーザアカウント制御の無効化を行ってテストしてください。Date関数と同じくデバッグなどに良く使用されます。時刻を取得するものをTime関数、時刻を設定するものをTimeステートメントと呼んでいます。

Now関数

現在の日付と時刻が入ります。Date関数とTime関数を一緒にしたようなものです。

[リスト5]Rei_Now(日付関係.xlsm)

Sub Rei_Now()
    a = Now     '結果:2010/1/2 10:13:14(2010年1月2日10時13分14秒の時)
    MsgBox (a)
End Sub

現在の日付と時刻を変数に設定します。Now関数で取り込んで、日付のみ使用するプログラムや時刻のみ使用するプログラムも作成することができます。Now関数は、DateステートメントやTimeステートメントのように、日付や時刻を設定することはできません。現在の日付・時刻の取り込みのみになります。

日付の計算

日付、時刻を変数に入れて、「一週間後は何日か」などの計算に便利な関数について、説明していきたいと思います。今回は日付の加減算を行うDateAdd関数、指定した二つの日付の時間間隔を教えてくれるDateDiff関数、年間通算日など指定した時間表示に従って時間の単位を教えてくれるDatePart関数について説明します。

DateAdd関数

日付の加減算を行うDateAdd関数について説明します。まず構文を見てみましょう。

[構文]DataAdd関数

DateAdd(interval,number,date)
    interval:追加する時間間隔を表す文字列式で指定
    number:追加する時間間隔の数を数式で指定
    date:追加する、元の日付

引数3個とも必ず指定してください。以下、intervalの設定値を表で表しています。

設定値 内容
yyyy
q 四半期(3か月1単位)
m
y 年間通算日(1日1単位)
d
w 週日(1日1単位)
ww 週(7日1単位)
h
n
s

DateAdd関数の引数intervalの設定値

例題を作成して実行してみましょう。

[リスト6]Rei_DateAdd(日付関係.xlsm)

Sub Rei_DateAdd()
    d = #1/31/2010#
    a = DateAdd("yyyy", 1, d)   '(1)結果:2011/01/31
    MsgBox (a)
    a = DateAdd("q", 1, d)  '(2)結果:2010/04/30
    MsgBox (a)
    a = DateAdd("y", 1, d)  '(3)結果:2010/02/01
    MsgBox (a)
    a = DateAdd("d", 1, d)  '(4)結果:2010/02/01
    MsgBox (a)
    a = DateAdd("w", 1, d)  '(5)結果:2010/02/01
    MsgBox (a)
    a = DateAdd("m", 1, d)  '(6)結果:2010/02/28
    MsgBox (a)

    a = DateAdd("yyyy", -1, d)   '(7)結果:2009/01/31
    MsgBox (a)
    a = DateAdd("q", -1, d)  '(8)結果:2009/10/31
    MsgBox (a)
    a = DateAdd("y", -1, d)  '(9)結果:2010/01/30
    MsgBox (a)
    a = DateAdd("d", -1, d)  '(10)結果:2010/01/30
    MsgBox (a)
    a = DateAdd("w", -1, d)  '(11)結果:2010/01/30
    MsgBox (a)
    a = DateAdd("m", -1, d)  '(12)結果:2009/12/31
    MsgBox (a)
End Sub

(1)は1年先の日付です。(2)は四半期(3か月単位)の計算です。(3)(4)(5)は日数を指定しての加算です。DateAdd関数の場合は同じ日数の指定です。(6)は月数の加算です。例題では1月31日を指定して一カ月後で計算してみました。ちゃんと2月の最終日28日になっています。(7)から(12)は減算をおこなっています。

日付の計算はうるう年があったり、各月の一カ月の日数が違ったりで、大変です。DateAdd関数は加減方法を指定して、ちゃんと日付計算をやってくれるので、とても便利な関数です。DateAdd関数は無効な日付を返すことはありません。もし、加減算の結果が西暦100年以前になる場合はエラーが発生します。