日付の扱い方

日付

日付の扱い方

 ExcelVBAでの日付の扱いは必須科目と言っていいでしょう。その割に少々癖がありますので注意が必要です。まず注意するべきはセルへの代入で書式設定が標準から日時に変わることです。そして思い通りの表示にするためには、セルの書式設定自体を変更しなければいけません。
 逆を言えば、あらかじめセルの書式設定を行っておけば、後は普通に日付型の値を入れておけばOKです。日付型はDate型を使います。

Date型(日付・時間の型)

 ExcelVBAで、日付や時間を扱うには Date型を使用します。実態は数値でシリアル値として日付や時間に値を割り当てています。具体的にはシリアル値1が、1日(24時間)に相当します。

Date型の宣言

 Date型の宣言は、##で囲んで宣言しますが、””で囲んで文字列で指定してもOKです。

Sub macro01()
    Dim d As Date
    Dim t As Date
    
    d = #12/1/2022#     '月/日/年
    t = #8:30:00 AM#    '時/分/秒
       
    Debug.Print d
    Debug.Print t
End Sub

 ##で囲む場合は、#2022/12/1# などと書いてもVBEが自動で書き換えを行ってくれます。時間の場合も、#8:30#と入力すれば #8:30:00 AM# と勝手に補完されます。

 ””を使って文字列で宣言する場合は、VBEの補完はありませんので、日付・時間として認識される文字列を宣言します。

Sub macro02()
    Dim d As Date
    Dim t As Date
    
    d = "2022/12/1"     '月/日/年
    t = "8:30"          '時/分/秒
       
    Debug.Print d
    Debug.Print t
End Sub

2つのサンプルではいずれも、
 2022/12/01
 8:30:00
と表示されます。

現在の日付や時刻を取得

 日付型では、宣言の際に現在の日付や時刻をセットすることが多くあります。
現在の日付をセットするにはDate関数。
現在の時刻をセットするにはTime関数を使用します。
日付と時刻の両方をセットする場合は、Now関数を使います。

Sub macro03()
    Dim d As Date
    Dim t As Date
    Dim dt As Date
    
    d = Date
    t = Time
    dt = Now
    
    Debug.Print d
    Debug.Print t
    Debug.Print dt
End Sub

結果は、以下のようになりました。その時の日時で変わります。
 2022/11/18
 8:56:33
 2022/11/18 8:56:33

 Date型とDate関数は、綴りが同じなので混乱するかもしれません。これらは使われる場所によって判断されています。

月・日などの個別の情報を取得したい場合

 セットした日付から、年、月、日などの個別の情報を得たい場合は、各要素別の関数を使います。

Sub macro04()
    Dim dt As Date
    
    dt = Now
       
    Debug.Print Year(dt)    '年
    Debug.Print Month(dt)   '月
    Debug.Print Day(dt)     '日
    Debug.Print Weekday(dt) '曜日(日曜が1でスタートする数値)
    
    Debug.Print Hour(dt)    '時間
    Debug.Print Minute(dt)     '分
    Debug.Print Second(dt)     '秒
    
End Sub

 曜日のWeekday関数に関しては、日曜日を1としてスタートする数値が得られます。
土曜日が7となります。
 宣言で日付し時間をセットしていない場合、時間、分、秒はそれぞれ0を返します。

日付型を個別の値でセット

 DateSerial関数を使えば、年、月、日を個別にセットして日付型を取得できます。同じようにTimeSerial関数を使えば、時、分、秒を個別にセットして日付型を取得できます。

DateSerial関数

 DateSerial(2022,11,15) とすれば、2022/11/15 を取得できます。
数値の部分は変数を用いて計算式で与える事もできます。

TimeSerial関数

 TimeSerial (22,10,30) とすれば、22:10:30 を取得できます。
使い方は、DateSerialと殆ど同じです。

 

日時の比較・計算

 Date型は比較・計算が可能です。
比較演算子の<>=などで他の日時と比較したり、+ーで日付の加算や減算ができます。

 日付の加算(減算)については、DateAdd関数が用意されていて、これを使用すると、うるう年などカレンダー特有の計算が簡単にできます。

 また、日付同士の間隔については、DateDiff関数が用意されており、日数だけでなく週や年数などの計算も簡単にできるようになっています。

詳細は各ページを参照してみてください。
DateAdd関数
DateDiff関数

ここでは簡単なサンプルのみ提示します。

Sub testDateAdd()
    Debug.Print DateAdd("d", 10, #1/24/2022#)
    '2022/01/24 の10日後で、2022/02/03 と表示されます。
End Sub
Sub test_DateDiff()
    Dim sDay As Date, eDay As Date
    sDay = DateSerial(Year(Date), 1, 1)
    eDay = DateSerial(Year(Date) + 1, 1, 1)
    MsgBox "今年は、" & DateDiff("d", sDay, eDay) & "日。"
End Sub

一年の日数を表示させます。1/1~翌年の1/1でセットしないと正しい値となりません。

日時の書式を設定する

 日付型の値を利用して、様々な書式に変えるにはFormat関数を使用します。
Format関数は、日時の他に数値の桁区切りを表現するのにも使えます。
 詳しくは、Format関数のページを参照してください。ここでは簡単なサンプルを示します。

Sub testFormat()
    Dim myBirthday As Date
    myBirthday = #11/28/2008#
    MsgBox "私の誕生日は、" & _
      Format(myBirthday, "ggge年m月d日。aaa曜日でした。")
End Sub

 結果は以下のようになります。

Format関数での注意事項

 Format関数でセルに値を入れる時には、セルの書式設定に注意してください。思い通りの表示にならない場合は、書式設定を変更する必要があります。

タイトルとURLをコピーしました