『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】WeekdayName、WeekDay関数で曜日を取得します

VBA で曜日を取得する WeekdayName 関数と WeekDay 関数 について解説します。

【VBA】WeekdayName関数

VBAWeekdayName

WeekdayName(数値, [,曜日名の省略, [開始曜日]])

の形式で記述して対応する曜日の文字列を得る関数です。[開始曜日] と [数値] には、VBA組込定数あるいはアラビア数字のどちらを入れてもかまいません(下の表を参照してください)。

組込定数 曜日
vbSunday 1 日曜日
vbMonday 2 月曜日
vbTuesday 3 火曜日
vbWednesday 4 水曜日
vbThursday 5 木曜日
vbFriday 6 金曜日
vbSaturday 7 土曜日

2 番目の引数 [曜日名の省略] というのは、たとえば「火曜日」の「曜日」という文字を省略するかどうかです。するなら True, しないなら False を入れます。この引数を省略すると False を指定したことになります。
 
3 番目の引数 [開始曜日] は基準となる曜日で、ここを 1 として各曜日に番号が振られます。この引数を省略するか 1 を入れると、 [数値] に対応する曜日はそれぞれ上の表にあるとおりになります。しかし [開始曜日] にたとえば vbTuesday または 3 を指定すると、
 
  1:火 2:水 3:木 4:金 5:土 6:日 7:月
 
というように、戻り値がずれます。何がなんだかわかんなくなってしまっても大丈夫。よほど変わったことをしないかぎり、3つめの引数を指定する機会はないと思います。こばとも使ったことないし。何のためにあるのかすらよくわからないし。まあともかく実例を見てみましょう。

Option Base 1

'[VBA] 曜日一覧を出力するプロシージャ
Sub Week_Day_List()
  Dim i As Integer
  Dim week_name(7) As String
  For i = 1 To 7
    week_name(i) = WeekdayName(i)
    Debug.Print week_name(i);
  Next i
End Sub

WeekdayName 関数の最初の引数に 1 ~ 7 の数字を順に入れて戻り値を調べています。Week_Day_List() を実行するとイミディエイトウィンドウに

  日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日

と表示されるはずです。

≫【VBA】日付型変数と日付シリアル値

【VBA】WeekDay関数

WeekdayName とよく似た関数に WeekDay があります(紛らわしいので要注意です)。WeekDay は「日付から曜日に対応する数値を取得する関数」です。戻り値は Variant 型 (内部処理形式は Integer) です。引数は [日付] と [開始曜日] の2つです。

WeekDay(日付, [開始曜日])

WeekdayName関数と同じく、2つめの引数で対応する曜日をずらしますけど、ほとんど使う機会はなさそうです。それでは簡単なマクロで動作を確認してみましょう。

'[VBA] 今日の曜日を数値で表示します
Sub Week_Date_Number()
  Dim week_number As Integer
  week_number = Weekday(Date)
  Debug.Print week_number
End Sub

Date 関数で今日の日付を得て、そこから曜日を取得しています。Week_Date_Number() を実行すると、そのときの日付に応じて 1 ~ 7 の数値が出力されます。マクロの内部で処理するだけなら、これでもかまいませんが、「今日は何曜日」てことを出力するには数字では愛想がなさすぎます。実際的には下の Week_Date_Name マクロのように WeekdayName 関数と組合わせて使用することが多くなると思います。

'[VBA] 今日の曜日名を表示します
Sub Week_Date_Name()
  Dim week_name As String
  week_name = WeekdayName(Weekday(Date))
  Debug.Print "今日は" & week_name & "です"
End Sub

Date 関数で得た日付から曜日を数値で取得し、そこから WeekdayName 関数で曜日名を得ています。Week_Date_Name() を実行すると、そのときの日付に応じて「日曜日」とか「金曜日」などが返ってくるはずです。次は明後日の曜日を返すマクロを作ってみましょう。

'[VBA] 明後日の曜日名を表示します
Sub Day_After_Tomorrow()
  Dim week_name As String
  week_name = WeekdayName(Weekday(Date + 2))
  Debug.Print "明後日は" & week_name & "です"
End Sub

Day_After_Tomorrow() では今日の日付 Date に 2 を加えて、明後日(2日後)の曜日を得ています。Day_After_Tomorrow() を実行すると、そのときの日付に応じて「明後日は金曜日です」のようなメッセージが返ります。

コメント

  1. あとりえこばと より:

    VBAのWeekDayNameとWeekDayについての激論

    執筆:ChatGPT
     
    【キャラクター】
     ジョン: 経験豊富なIT社員。VBAのWeekDayName関数の支持者。
     サラ: 新入社員のITエンジニア。WeekDay関数の支持者。
     
    【場面】会社の休憩室。ジョンとサラはランチ中にディスカッションをしています。
     
    ジョンとサラがテーブルの周りに座り、ランチを食べながら話しています
     
    ジョン: サラ、君はVBAでWeekDayName関数を使ったことはあるかい?これは非常に便利な関数だと思うんだよ。
     
    サラ: ええ、ジョンさん。私はVBAでWeekDay関数をよく使っていますが、WeekDayName関数はあまり使ったことがありません。どうしてそれほど重要だと思われるのですか?
     
    ジョン: WeekDayName関数は、数値で表される曜日の名前を返すんだ。例えば、1は日曜日、2は月曜日といった具合だ。これを使うと、数字だけではなく曜日の名前も表示できるんだ。
     
    サラ: それは確かに便利ですね。でも、WeekDay関数でも同じことができますよ。WeekDay関数は曜日の数値を返すけれど、その数値を配列にマッピングすれば、曜日の名前も取得できます。
     
    ジョン: そうだけど、それってちょっと手間じゃないかな?WeekDayName関数を使えば、もっと簡単に曜日の名前を取得できるんだよ。曜日を数値で取得する必要がないから、コードもスッキリするんだ。
     
    サラ: でも、WeekDay関数を使えば、数値だけでなく曜日に関する他の操作もできるんですよ。例えば、平日か週末かを判定するのに役立ったり、曜日ごとに処理を分岐させたりすることもできます。
     
    ジョン: それは確かにWeekDay関数の利点かもしれないけど、そういう場合でもWeekDayName関数を使えば、数値と名前の両方を扱えるし、柔軟性もあるんだよ。
     
    サラ: うーん、確かにWeekDayName関数は便利そうですが、WeekDay関数の方が汎用性が高いと感じます。どちらを使うべきかは、使い方や目的によるのかもしれませんね。
     
    ジョン: そうだね、確かに使い方や目的によるかもしれない。でも、WeekDayName関数の便利さは言えない事実じゃないさ。
     
    サラ: それは理解しました。次回、プロジェクトで曜日を扱う必要があったら、WeekDayName関数も試してみます。
     
    ジョン: いいね、それでいいと思うよ。相互に利点を理解しあって、ベストな選択をするんだ。