和風スパゲティのレシピ

日本語でコーディングするExcelVBA

WeekDay(VBA)とWEEKDAY(シート関数)の違い

VBAの組込関数「WeekDay関数」と、
ワークシート関数「WEEKDAY関数」の違いを解説します。

同じところ

どちらも日付を受け取って曜日を「数字」で返す関数です。

以下のコードは同じ「3(水曜日)」を返します。

曜日No = WeekDay(#2025/4/1#)
曜日No = WorksheetFunction.WeekDay(#2025/4/1#)

曜日を日曜1~土曜7のような数値で受け取ることで、
カレンダーの作成などに使用する関数です。

違うところ

両関数とも第2引数で「何曜日を1とするか」を設定できるのですが、
この第2引数の設定値が異なります。


まずVBAのWeekDay関数ですがこちらは単純で、
2を渡すと月曜日、3を渡すと火曜日、…を1として動くようになります。

第二引数 曜日との対応
1 日曜1~土曜7
2 月曜1~日曜7
3 火曜1~月曜7
4 水曜1~火曜7
5 木曜1~水曜7
6 金曜1~木曜7
7 土曜1~金曜7

こちらは直観的にわかりやすいですね。


続いてシート関数のWEEKDAY関数ですが、
こちらは数値に規則性はなく、少々ややこしい挙動になります。

第二引数 曜日との対応
1 日曜1~土曜7
2 月曜1~日曜7
3 日曜0~土曜6
11 月曜1~日曜7
12 火曜1~月曜7
13 水曜1~火曜7
14 木曜1~水曜7
15 金曜1~木曜7
16 土曜1~金曜7
17 日曜1~土曜7

よく使うもの3選を1~3に配置し、
11~17に残りを規則的に配置していますね。

よく見ると1と17が同じ挙動、2と11も同じ挙動です。

使い分け

VBAのWeekDay関数の方が直観的にわかりやすいため、
通常はこちらを使用しておけばよいと思います。

第2引数に渡す値と返り値が一致していますからね。
どちらも「1」が日曜日を指すため仕様を理解しやすいです。


対してシート関数のWEEKDAYが優れているのが、
「0始まりの設定ができる」という点になります。


カレンダーのOffsetを計算したりするときは、
曜日が1~7でなく0~6だとありがたい場面は結構あると思います。


その時は、WorksheetFunction.WeekDayを使用し、
第2引数に「3」を渡して0始まりの設定で使ってみてください。