日付

VBAには日付型という、日付を表わすための特殊な変数型があります。
日付型におけるシリアル値というのは、日付を数字に変換したもの。
整数部分が日付で、少数以下が時間を表わしています。
日付については1900年1月1日を数値の1として、そのからの日数のようです。ただし、これは内部コードというようなもので、これに依存するプログラムを書くべきではない、と考えるべきでしょう。

ここで紹介するのは日付型Dateを扱う関数です。
日付型に変換したり年月日を取り出したりします。

まずは日付に関する特殊変数(組み込み変数)です。
現在の日付・時刻を得る
str Time現在の時刻を文字列で返す
num Timer午前0時からの経過秒数を返す
str Now現在の日付と時刻を返す

Date TimeSerial(hour as num,minute as num,second as num)
3つともnumです。
時分秒を指定してシリアル値を得る。

Date TimeValue(str)
時刻表記の文字列をシリアル値にする

Date DateSerial(num1,num2,num3)
num1は年、num2は月、num3は日を設定します。
三つの数値から日付型の値を作成します。

Date DateValue(str)
文字列から日付値を作成します。
どのような文字列を受け付けて解釈するかはExcelの設定に依存します。

Date CVDate(str or num)
日付文字列やシリアル値を日付型に変換
num DatePart(interval,Date[,firstdayofweek[,firstweekofyear]])
引数の意味についてはDateAddと同じ。
Dateからintervalで意味する情報を取り出す。

日付のうち一部を数値として取り出します。
num Month(as Date)日付の月部分
num Day (as Date)日付の日部分
num Hour(as Date) 時刻の時部分
num Minute(as Date) 時刻の分部分
num Second(as Date) 時刻の秒部分

num WeekDay(Date[,num])
日付が何曜日であるかを得られます。
第二引数は firstdayofweekとあり、週の第一日目の曜日を指定する、らしいですがなんの意味があるのか不明です。
何曜日かを示す整数を返しますが、以下のExcelの組み込み定数と比較すべきです。
定数内容
vbSunday日曜1
vbMonday月曜2
vbTuesday火曜3
vbWednesday水曜4
vbThursday木曜5
vbFriday金曜6
vbSaturday土曜7

Date DateAdd(interval as str,num,Date)
ある間隔後の日付時刻を求める。
Dateの時からintervalの単位でnumだけ加算したDateが得られます。
intervalが面倒で文字列で与えますが、以下の表です。
interval意味
yyyy
q四半期
m
y年間通算日
d
w週日
ww
h
n
s

num DateDiff(interval,date1,date2[,firstdayofweek[,firsweekofyear]])
二つの日付時刻の間隔を求める。
firstdayofweekは省略するとvbSundayになります。
firstdayofweek
定数内容
vbUseSystemAPI既定値0
vbSunday日曜1
vbMonday月曜2
vbTuesday火曜3
vbWednesday水曜4
vbThursday木曜5
vbFriday金曜6
vbSaturday土曜7
firstweekofyearは省略するとvbFirstJan1になります。
firstweekofyear
定数内容
vbUseSystemAPI既定値0
vbFirstJan1一月一日を含む週が年度の第一週1
vbFirstFourDays7日のうち少なくとも4日が新年度に含まれる週2
vbFirstFullWeek一週間全体が新年度に含まれる最初の週3
大概のサイトが定義表の提供だけでスルーしているが、意味が分かるだろうか。

ちょっと調べてみると欧州では日本の一般常識と「週」の定義がちょっと異なり「週の4日以上が新年に含まれる週を最初の週とみなす」のだそうだ。
そういう場合はvbFirstFourDaysを指定すれば“正しい”答えが得られるということなのだろう。

vbFirstFullWeekというのは、新年のある週は必ずしも第一週ではなくて、7日全部があって初めてそれが第一週となる、ということになる。
これもどこかの地域の慣習か何かなのだろうか。

str WeekdayName(num)
曜日を表す数値から文字列を返す。
どんな文字列となるかはExcelの設定(国設定等)で変わります。

str MonthName(num[,Bool])
月を表す文字列を返します。
第二引数はTrueかFalseで、省略するとFalseになります。
Trueで月名を省略します。

num Year(Date)
日付の西暦年を4桁で返す。
2013とかになります。
-

日付(2)

DateSerial(year,month,day)
数字指定から日付型に変換。
引数に指定された年、月、日に対応する日付をVariant (Date)型 の値で返します。
Dim Date1
Date1 = DateSerial(1970,1,1)
DateValuse(str)
文字列から日付型に変換。
文字列で指定された日付(時刻も)をVariant (Date)型 の値で返します。
結構色々な書式でも変換できます。
Dim Date1
Date1 = DateValue("September 11,1963")
Date1 = DateValue("1986/12/10")
DateAdd(interval,num,date)
日付に対して加算する
何時間後とか、何日後とかを計算できる
interval:間隔が年か月か等の指定
num:間隔を指定
interval = "d"
numbers = 3
date0 = DateValue("1986/2/27")
date0 = DateAdd(interval, numbers, date0)
intervalの定義
yyyy
q四半期
m
y年間通算日
d
w週日
ww
h
n
s
「年間通算日」と「日」と「週日」の違い。
「週日」はWeekday(ウィークデイ)といったほうが通りが良い気がする。
休みである日曜日を除いた日にちのことだが、実際にテストプログラムで確認するとそういう計算はしてくれないので、これが仕様だとすれば仕様を満たしていないというバグ。
Microsoftは週日という言葉を知らないのか、Microsoftでは日曜日も休みでは無いというブラックジョークなのかも知れない(笑)
ともあれ、どれも同じ答えを返すので"d"だけ使っていれば良いだろう。

DateDiff(interval,date1,date2)
日付の差を計算する date2-date1を返す感じ。intervalについてはDateAddと同じだが、dとyと時間以外は普通に期待するような結果は返ってこないので注意。
その辺の定義は面倒で何に使うんだ的な感じなので省略する。

Year(date)
Month(date)
Day(date)
Weekday(date)
Hour(date)
Minute(date)
Second(date)
日付型変数から特定の要素を取り出します。
Weekday関数は曜日判定に使えて便利だと思います。
次の値を返します。
vbSunday1日曜
vbMonday2月曜
vbTuesday3火曜
vbWednesday4水曜
vbThursday5木曜
vbFriday6金曜
vbSaturday7土曜
-