■1-8 日付・時刻関連コマンドを使いこなすための便利資料
Excelの日付や時刻は、小数を含む数字で管理されます。秒単位の操作・処理ができきめ細かなマクロを
作成することができます。
なお、日付関連をマクロで処理することは多いが、表示されている形式が異なり検索でヒットしない場合も
あり悩むこともあります。本項目で紹介の日付・時刻関連のマクロ処理を理解すれば日付関連で悩むこと
が無くなります。




(1)主な日付・時刻関数18件の使用例一覧表
ExcelVBAには多数の日付・時刻に関する関数がありますが、主な関数18件を一覧表にして(表18参照)掲載
しました。またその関数の使用方法についてはマクロサンプルを見てください。マクロの実行結果については
画面50で見えます。日付・時刻に関するマクロ作成に活用できます。
【表18 主な日付・時刻関連の関数】
  関数 処理内容
1 Date 現在のシステムの日付を返す
2 DateAdd 日付に指定した時間間隔を加算し返す
3 DateDiff 指定して2つの日付の間隔を計算して返す
4 DatePart 日付を評価し、特定の時間間隔部を取得する
5 DateSerial 引数に指定した年・月・日に対応する日付を返す
6 DateValue 日付を返す
7 Day 月の何日かを表す1〜31の範囲の整数を返す
8 Hour 時間を整数で返す
9 Minute 分を整数で返す
10 Month 1〜12の整数で何月になるかを返す
11 Now 現在の日付・時間をシステムの設定形式で返す
12 Second 秒を整数で返す
13 Time  現在のシステムの時刻を返す
14 Timer 午前0時からの経過秒数を表示
15 TimeSerial 引数に指定した時・分・秒に対応する時刻を返す
16 TimeValue 指定した文字形式で表される時刻を返す
17 Weekday 曜日を整数で返す(1:日曜日〜7:土曜日)
18 Year 年を表す整数を返す
以下は表18に示す、日付・時刻関数マクロ例です
Sub 日付1_1()
    Cells(1, 1) = Date                             '結果例:2011/12/12
    Cells(2, 1) = DateAdd("m", 1, "2011/12/31") '結果例:2012/1/31
    Cells(3, 1) = DateDiff("yyyy", "1944/4/23", "2011/12/31") '結果例:67
    Cells(4, 1) = DatePart("m", Date)             '結果例:12
    Cells(5, 1) = DateSerial(2011, 12, 12)        '結果例:2011/12/12
    Cells(6, 1) = DateValue("2011, 12, 12")     '結果例:2011/12/12
    Cells(7, 1) = Day(Date)                         '結果例:12
    Cells(8, 1) = Hour(Now)                         '結果例:12
    Cells(9, 1) = Minute(Now)                     '結果例:20
    Cells(10, 1) = Month(Date)                    '結果例:12
    Cells(11, 1) = Now                              '結果例:2011/12/13  8:46:29
    Cells(12, 1) = Second(Now)                    '結果例:52
    Cells(13, 1) = Time                            '結果例:9:05:00
    Cells(14, 1) = Timer                           '結果例:52949.109375
    Cells(15, 1) = TimeSerial(8, 30, 0)         '結果例:8:30:00
    Cells(16, 1) = TimeValue("12:0:10")           '結果例:12:00:10
    Cells(17, 1) = Weekday(Now)                   '結果例:2
    Cells(18, 1) = Year(Now)                     '結果例:22011
End Sub
【備考】 引数の内容は表19参照
 
【表19 インターバルの設定内容】






(2)Format関数で処理できる18件の日付関連書式記号一覧表
日付に関する書式記号は18種類あり、それを組み合わせて見やすく表示することができます。表20に18件
の日付関連書式指定記号を示します。
また、サンプルマクロの実行結果は、画面50 マクロ実行例(A列)に示します。
【表20 日付・時刻関連の書式指定文字】



以下は表20の「書式指定文字」使用のマクロ例です
Format関数の1番目の引数はシリアル値で、本例ではDate(現在の日付)を入力しています。
2番目の引数は書式指定文字(表20参照)です。
(実行例は 画面50B列参照)
Sub 日付1_2()
    Cells(1, 2) = Format(Date, "yyyy/mm/dd")  '結果例:2011/12/12
    Cells(2, 2) = Format(Date, "yyyy年mm月dd日")  '結果例:2011年12月13日
    Cells(3, 2) = Format(Date, "ggge/mm/dd")  '結果例:平成23/12/12
Cells(4, 2) = Format(Date, "yyyy/mmm/ddd(dddd)") '結果例:2011/Dec/Mon(Monday)
Cells(5, 2) = Format(Date, "ggge/mm/dd(aaaa)")    '結果例:平成23/12/12(月曜日)
End Sub

画面50 日付・時刻関連 マクロ実行例





(3)時間をシリアル値にして計算で秒単位の管理ができます
Excelは日付や時刻は、小数を含む数字で管理していますが、この数値を「シリアル値」といいます。シリアル
値は1900/1/1を1として1日に1加算され、整数部は日付で小数点以下は1日内の時刻を表します。


[1]通常の時刻を指定した時間の計算例
1日以内の小数部は、午前0時から秒単位で加算されます。1日のうち半分に当たる午後12時は「0.5」です。
本サンプルの"8:30:00"は「0.354166666667」となります。なお、シリアル値はセルに記入したりメッセージ
ボックスに表示すると変数のデータ型を日付に設定してあれば自動的に日付で表示されます。
シリアル値を見たい場合は「 CDbl関数」で倍精度浮動小数点数型に変換すれば見えます。
Sub 日付2_1()
Dim t1 As Date, t2 As Date
  t1 = TimeValue("8:30:00")
  t2 = TimeValue("15:15:00")
    Cells(1, 1).NumberFormatLocal = "h:mm"
    Cells(1, 1) = t2 - t1                               '結果例:6:45
End Sub


[2]シリアル値を使った時間計算例
前述の「日付2_1」の時刻の計算は、「t2 - t1」で日付型の変数で(中身はシリアル値)で計算していますが、
セルに記入した文字は日付表記でありシリアル値は見えない間にマクロは終了しました。
しかし、本格的な時間計算を行う場合はシリアル値で処理する方が簡単でありシリアル値で計算のサンプル
を紹介します。なお、本例では未使用ですがシリアル値1分は=1/24/60→0.000694444であり、このシリアル
値で1分単位の処理が出来ます。

例題の条件は、出社時間は自由のパート勤務ですが、終了時間は16:00時で全員終了です。
また昼休みは12:00〜13:00としました。本例は、このケースの勤務時間を出すサンプルマクロです。
Sub 日付2_2()
Dim t1 As Date, t2 As Date
Const zikan As Single = 0.041667
  t2 = TimeValue("16:00:00")
 
    msg$ = "出勤時間を入力して下さい" & Chr(10) _
        & "(例:9:15 又は、13:00 or PM1:00)"
    t1 = InputBox(msg$, "出勤時間")
        If t1 > 1 Then
            MsgBox msg$
            Exit 
Sub
        End If
昼休み時間
    If t1 < 0.5 Then
         hiru = zikan
    Else
        If (0.5 + zikan) > t1 Then t1 = TimeValue("13:00:00")
    End If
  MsgBox Format(t2 - t1 - hiru, "h:mm")
End Sub
 CDbl(t1)
MsgBox Format(t2 - t1 - 1, "h:mm") '1日はシリアル値1であり-1では結果は0


[3]シリアル値を計算して年齢算出例
生年月日を指定すると現在の年齢を算出するマクロ例です。
なお、前例は「TimeValue関数」で1日以内の1以下の小数点計算でしたがこちららのシリアル値は
「DateValue関数」で戻し、整数部は日付を表します。

画面51 年齢計算マクロ実行例


Sub 日付2_3()
Dim msg As String, ymd As Date, ymdin As String
   msg = "生年月日を入力して下さい" & Chr(10) _
        & "yyyy/mm/dd のように/で区切って入力して下さい"
    ymdin = InputBox(msg, "日付入力")
        If IsDate(ymdin) = False Then
            MsgBox "日付に変換できません"
                Exit 
Sub
        Else
            ymd = DateValue(ymdin)
        End If
   Call 日付2_3a(ymd)
End Sub
----------------------------------------------------------
Sub 日付2_3a(basday As Date)
Dim tosi As Integer
 
    tosi = Int((Date - basday + 1) / 365.25)
    MsgBox basday & "生まれの方の" & Chr(10) & _
    "今日現在の年齢は「" & tosi & "」歳です。"
End Sub


【参考181】うるう年の算出方法
上記日付2_3マクロで、1年の日数「365.25」の意味は、4年に一回うるう年があるので、1年365日に0.25追加
(4年に1回366日)してあります。
ただし、4 年に一回うるう年であるが、100年に1回はうるう年に当ってもうるう年にならない。またこの100
年周期のうち、400年に1回はうるう年になるので、単純に「0.25」追加は100年に1回であるが1日の計算が
狂うが、年齢値は問題ありません。

なお、この前述の条件でマクロを作ると下記になります。
Sub 日付うるう年()
Dim myy As Integer
    msg = "うるう年かチェックしたい年を歳暦で入力して下さい"
    myy = Val(InputBox(msg, "うるう年チェック"))
 
   If ((myy Mod 4) = 0 And (myy Mod 100) <> 0 Or (myy Mod 400) = 0) Then
        MsgBox myy & "年の2月はうるう年で29日です"
   Else
        MsgBox myy & "年の2月は28日です"
   End If
End Sub


[4]ワークシート関数使用の年齢算出例
ワークシート関数「DATEDIF」を使用した年齢算出例です。
なお「DATEDIF」はVBAで使用できるワークシート関数ではないので、シートのセルへ計算式を記入しての
算出します(画面52参照)。

画面52 ワークシート関数使用の年齢算出実行例


Sub 日付2_4()
  前例「日付5()」 のCall 日付2_3a(ymd) を Call 日付2_4a(ymd) に換える(他は同じ)
End Sub
------------------------------------
Sub 日付2_4a(basday As Date)
 
Cells(2, 1) = "生年月日「" & basday & "」の年齢 →"
Cells(2, 2).Formula = "=DATEDIF(" & Chr(34) & basday & Chr(34) & _
, & Chr(34) & Date & Chr(34) & ",""y"")"
 
End Sub
DATEDIF関数は、Lotus 1-2-3(表計算ソフト)の 関数と互換性を保つために作られたもので、Excel2000
まではヘルプに記載されていましたが、Excel2002以降では、ヘルプから消えています。Excel2010でも
使用できることを確認しましたが、将来的には使用不可になるかもしれない。


【参考182】年齢計算は期間を求める「DateDiff関数」でもできます
年齢計算としては期間を求める「DateDiff関数」でもできます。ただし、誕生日が過ぎると1歳多く返ってくる
ので、誕生日後は-1が必要です。下記にマクロを参考に掲載しますが、-1は入っていません。正しい
年齢算出は前2例のサンプルマクロを使用した方がよい。
Sub 日付2_41a(basday As Date)
    Cells(2, 1) = "生年月日「" & basday & "」の年齢 →"
    Cells(2, 2) = DateDiff("yyyy", basday, Date)
End Sub


[5]生年月日から60歳になる時期を算出例
これは「DateAdd関数」で指定した加算数の将来の日付を取得した例です。
(実行結果は画面53参照)

画面53 DateAdd関数使用した実行例


Sub 日付2_5()
  前例「日付5()」 のCall 日付5a(ymd) を Call 日付7a(ymd) に換える(他は同じ)
End Sub
------------------------------------------------------------
Sub 日付2_5a(basday As Date)
Dim ziki As Date
 
    ziki = DateAdd("yyyy", 60, basday)
    MsgBox "生年月日「" & basday & "」の方の" & Chr(10) & Chr(10) & _
      "60齢になる時期は「" & ziki & "」です。"
End Sub



【戻る】    【Top画面】   【HPへ】