Excelでは日々のカロリー計算記録や請求書作成といった作業で、日付や時刻を取得したり表示することが頻繁に行われます。
こうしたことから日付や時刻あるいは曜日などの取得方法や表示方法について、種々の関数が用意されています。
これらをVBAでどのように使っていくのか、使用頻度が多いだけにしっかり学ぶ必要があります。
ここではこれらについて解説をしてまいります。
現在の日付・時刻の基本となる関数
- 現在の日時の取得は「Now関数」
- 現在の日付の取得には「Date関数」
- 現在時刻の取得には「Time関数」
現在の日付および時刻の取得には以上3つの関数が基本になります。
これらの関数は取得のみしか出来ません。
関数の実行結果はDate型の値で返されます。
Sub 日付時刻1()
Dim Ima As Date
Dim Kyo As Date
Dim Jikoku As Date
Ima = Now()
Kyo = Date()
Jikoku = Time()
Range(“A1”) = Ima
Range(“A2”) = Kyo
Range(“A3”) = Jikoku
End Sub

引数はありませんので、それぞれの()は省略してかまいません。
つまり「Ima=Now」でOKです。
これらの関数からさらに個別に取得できる関数があります。
(1) Year ➡ 日付から「年」を取得します。
(2) Month ➡ 日付から「月」を取得します。
(3) Day ➡ 日付から「日」を取得します。
(4) Hour ➡ 時刻の「時」を取得します。
(5) Minute ➡ 時刻の「分」を取得します。
(6) Second ➡ 時刻の「秒」を取得します。
(7) DatePart ➡ 日時から、指定した単位の数値を取り出します。
「Now()」関数が「2020/12/6 11:19:44AM」の場合
(1) Year(Now) 「2020」を返します
(2) Month(Now) 「12」を返します
(3) Day(Now) 「6」を返します
(4) Hour(Now) 「11」を返します
(5) Minute(Now) 「19」を返します
(6) Second(Now) 「44」を返します
(7) DatePart(Now) 少し複雑なので別で解説します。
日付や時刻の表示方法も
「2020/6/1」・「2020/06/01」・「2020年6月1日」
「11:15:10」・「11時15分10秒」などいろいろあります。
たとえば
「2020/12/6 11:19:44AM」を Now としてA4に「年月日・時分秒」を使って表したい場合は
Range(“A4”) = Format(Now, “yyyy年mm月dd日 hh時mm分ss秒”)
というふうに「Format」を使って表示方法を指定することができます。
曜日を取得し表示する
指定した月日の曜日を取得するには「Weekday」関数を使用します。
Weekday(日付)
引数に「曜日を調べたい日付を表す数式または文字列式、関数」を指定します。
※指定した値が日付と認識されない場合はエラーになります。
この関数から返されるのは曜日を表す整数です。
1 = 日曜日
2 = 月曜日
3 = 火曜日
4 = 水曜日
5 = 木曜日
6 = 金曜日
7 = 土曜日
別途、月曜日から始まって日曜日を最終とする方法もありますが、今はこの方法でやられて問題ないと思います。
曜日はこの整数ではなく具体的な「日~土曜日」で表したいですよね。
そのためには WeekdayName を使います。
今日の曜日を表す場合は
Sub 曜日表示()
MsgBox “本日の曜日は” & WeekdayName(Weekday(Now)) & “です!”
End Sub
実はこの関数は
WeekdayName(日付,Abbreviate)
この赤太文字が省略されています(コンマを含む)。
実際に曜日を表示する場合、「日曜日」ではなく「日」と曜日を表示させない場合がありますよね。
そのためにはこの赤太文字の部分を「,True」にします(太赤文字にする必要はありません)。
つまり
Sub 曜日表示()
MsgBox “本日の曜日は” & WeekdayName(Weekday(Now),True) & “です!”
End Sub
True と書き足すことにより「曜日」が省略されます。
本来は WeekdayName(日付,False)となっており、この「,False」が省略されているのです。
「Abbreviate」とは「省略する」という意味で、本来はFalseなので「曜日を省略しない」ということを意味しています。
だから曜日を省略したい場合は、ここに「True」つまり「省略します」ということを書く必要があるわけです。
なにかナゾナゾみたいですが、混乱しないでください。
「月末」の日にちを取得する
月末は月によって31日もあれば30日もあり、2月は28日もあれば29日もあります。
ところが「ある月の月末が何日であるか」を取得する関数はありません。
それでも「月末締めの請求書」を作成するとか、「月末の支払い」の手続きをするとか、月末が何日であるかを知ることは非常に重要なことになります。
そのためには DateSerial 関数を使用します。
DateSerial関数は本来、年、月、日の数値から日付を作成して返す関数になります。
指定した年、月、日をそのまま日付にできないときは、相対的に計算した日付が返ります。
何となくわかりにくいですよね。
例を出して説明します。
DateSrial(年, 月, 日)のように引数は3つの数値(整数)が入ります。
例 | 戻り値 | 戻り値の意味 |
DateSerial(2020 , 1 , 15) | 2020/1/15 | そのままの年月日 |
DateSerial(2020 , 13 , 10) | 2021/1/10 | 13月=翌年1月とみなす |
DateSerila(2020 , 2 , 0) | 2020/1/31 | 2月0日として前月1月末日を表す |
DateSerila(2020 , 2 , -2) | 2020/1/29 | 前月月末からさらに2日前を表す |
DateSerial(2020 , 10 ) | エラー | 引数が3つ揃わなければエラー |
上記3例目のように「月末日」を求めたければ、求めたい翌年月の0日 とすることにより取得することができます。
ここで 左の表をみてください。
年月を入れてその月の予定表カレンダーを作成することをやってみましょう。
まずCells(2,2) に2020
Cells(2,4)に 2
と入力します。
つまり 2020年2月の予定表を作ると仮定します。
Sub 予定表()
Dim YR As Integer ‘年
Dim MT As Integer ‘月
Dim ED As Integer ‘月末
Dim DD As Date ‘カレンダー各日
Dim I As Integer ‘日の変数
YR = Cells(2, 2).Value ‘①
MT = Cells(2, 4).Value ‘②
ED = Day(DateSerial(YR, MT + 1, 0)) ‘③
For I = 1 To ED
Cells(I + 3, 2) = I ‘④
DD = YR & “/” & MT & “/” & I ‘⑤
Cells(I + 3, 3) = WeekdayName(Weekday(DD), True) ‘⑥
If Weekday(DD) = 7 Then ‘⑦
Range(Cells(I + 3, 2), Cells(I + 3, 5)).Interior.ColorIndex = 34
ElseIf Weekday(DD) = 1 Then ‘⑧
Range(Cells(I + 3, 2), Cells(I + 3, 5)).Interior.ColorIndex = 7
End If
Next I
End Sub
①②今月の年月の変数を設定
③今月の月末年月日の変数を設定
④日にち欄に1日から月末までを記入(I+3は日を書き込む行数を意味します)
⑤毎日の年月日をDD(変数)に入れる
⑥毎日の曜日を曜日欄に記入(”曜日”の文字は省略)
⑦曜日が「土」ならセル背景色をブルーにする
⑧曜日が「日」ならセル背景色を赤にする

記述のやり方はこの他にもいろいろ考えられます。
For ~ Next 文を使用した例文としてここに記載しました。
ちょっと見たところ難しそうに見えますが、そうでもありません。一文一文を確実に理解しながら読み進めてください。