WeekdayName関数の概要と重要性
Excel VBAにおける日付処理は、業務自動化の現場で最も頻繁に遭遇するタスクの一つです。特に「特定の日付が何曜日であるか」を判定し、それを日本語の文字列として出力するニーズは非常に高いものです。ここで登場するのが「WeekdayName関数」です。
WeekdayName関数は、VBAの標準ライブラリであるVBA.DateTimeモジュールに含まれる関数であり、数値(1から7)を対応する曜日名に変換するために設計されています。多くの初心者は、Select Case文やIf文を駆使して「1なら日曜日、2なら月曜日…」といった条件分岐を記述しがちですが、これは保守性と可読性の観点から好ましくありません。
本稿では、WeekdayName関数の引数の詳細から、ロケール設定による挙動の違い、さらには実務で避けては通れない「週の始まり」の定義まで、ベテランエンジニアの視点で深く掘り下げて解説します。
WeekdayName関数の詳細解説
WeekdayName関数の構文は以下の通りです。
WeekdayName(Weekday, [Abbreviate], [FirstDayOfWeek])
この3つの引数を正しく理解することが、この関数を使いこなす鍵となります。
1. Weekday (必須)
曜日を示す整数を指定します。通常はWeekday関数で得られた戻り値(1~7)を渡します。
2. Abbreviate (省略可能)
曜日名を短縮形で取得するかどうかをブール値(True/False)で指定します。Trueを指定すると「日曜日」が「日」のように短縮されます。既定値はFalseです。
3. FirstDayOfWeek (省略可能)
「週の始まり」を何曜日にするかを指定します。これこそが、多くのエンジニアが混乱するポイントです。VbDayOfWeek列挙体を使用して指定します。例えば、vbSunday(日曜日)を週の始まりとするか、vbMonday(月曜日)とするかによって、数値1が指し示す曜日が変わります。
この関数の最大の特徴は、システム設定(ロケール)に依存して自動的に言語が選択される点です。日本語環境のWindowsであれば、当然ながら「日曜日」「月曜日」といった日本語で返されます。これにより、多言語対応が必要なシステムでない限り、文字列変換のロジックを自前で書く必要がなくなるのです。
実務に直結するサンプルコード
以下に、実務で頻出する「日付から曜日を取得する」ための堅牢な実装例を示します。
Option Explicit
' 指定した日付の曜日を日本語で取得する関数
Public Function GetJapaneseWeekday(ByVal targetDate As Date) As String
Dim dayNumber As Integer
' Weekday関数で曜日番号を取得(vbSundayを週の開始とする)
dayNumber = Weekday(targetDate, vbSunday)
' WeekdayName関数で曜日名に変換
' Falseは短縮しない(例:月曜日)、vbSundayは日曜日から始まる定義
GetJapaneseWeekday = WeekdayName(dayNumber, False, vbSunday)
End Function
' 実行用プロシージャ
Sub TestWeekdayName()
Dim testDate As Date
testDate = Date
' 今日の曜日を表示
Debug.Print "本日は " & GetJapaneseWeekday(testDate) & " です。"
' 過去の日付でテスト
Debug.Print "2024年1月1日は " & GetJapaneseWeekday(#1/1/2024#) & " でした。"
End Sub
このコードのポイントは、Weekday関数とWeekdayName関数の引数「FirstDayOfWeek」を明示的に揃えている点です。もしここを省略してしまうと、環境設定(VBAのグローバル設定やOSの地域設定)に依存し、予期せぬ曜日が返ってくるリスクがあります。プロフェッショナルな開発においては、常に「動作環境に依存しない明示的な指定」を行うことが鉄則です。
実務アドバイス:なぜSelect Caseを使ってはいけないのか
新人エンジニアのコードレビューをしていると、以下のようなコードを頻繁に目にします。
' 避けるべき実装例
Select Case Weekday(targetDate)
Case 1: strDay = "日曜日"
Case 2: strDay = "月曜日"
' ...以下略
End Select
この実装がなぜ非推奨なのか、理由は3つあります。
第一に「保守コストの増大」です。曜日の名称を定数としてハードコーディングすることは、将来的な仕様変更(例えば短縮表記に切り替えたい、あるいは別の言語に対応したいなど)に対して極めて脆弱です。
第二に「バグの温床」です。Weekday関数の戻り値は、引数の設定次第で1が月曜日になることもあれば日曜日になることもあります。Select Caseで分岐を書くと、この「週の始まり」の定義がコードのあちこちに散らばり、整合性を取るのが困難になります。
第三に「可読性の欠如」です。WeekdayName関数を使用すれば、コードはわずか1行で済みます。可読性の高いコードは、それだけでバグの発生確率を下げます。VBA標準の関数で解決できる問題に対して、わざわざ独自ロジックを構築するのは技術的な負債を増やす行為に他なりません。
また、実務では「祝日の判定」とセットで曜日を扱うことが多いでしょう。WeekdayName関数で曜日を特定し、別の祝日リスト(配列やCollection)と照合して「平日か休日か」を判定するロジックを組むのが、自動化ツールの王道パターンです。
パフォーマンスと注意点
WeekdayName関数は高速に動作しますが、ループ処理の中で数万回呼び出す場合は注意が必要です。VBAの関数呼び出し自体は低コストですが、文字列結合やオブジェクトアクセスが絡むとパフォーマンスが低下します。
例えば、数万行のカレンダーデータを作成するような場面では、WeekdayName関数の戻り値を一度配列に格納するか、あるいはExcelシート上のTEXT関数(=TEXT(A1, “dddd”))を活用した方が、トータルの処理時間は短縮される場合があります。適材適所の判断が、ベテランエンジニアとしての腕の見せ所です。
また、日付型(Date)の変数が空(Empty)である場合にWeekdayName関数に渡すと、VBAはこれを「1899年12月30日」として解釈し、結果として「土曜日」を返します。このような「意図しない日付入力」を防ぐために、関数に渡す前には必ずIsDate関数で型チェックを行うか、エラーハンドリングを設ける実装を心がけてください。
まとめ
WeekdayName関数は、VBAにおける日付処理の基本でありながら、その奥深さは侮れません。単に曜日名を取得するツールとしてだけでなく、ロケールへの配慮、週の定義の明示、そして可読性を重視した設計思想を体現する関数と言えます。
プロフェッショナルなエンジニアは、車輪の再発明を嫌います。言語仕様として提供されている機能を最大限に活用し、シンプルかつ堅牢なコードを書くことが、中長期的なメンテナンス性を担保する唯一の道です。
本稿で解説したWeekdayName関数の振る舞いと、FirstDayOfWeek引数の重要性を深く理解し、あなたのVBAプロジェクトがより洗練されたものになることを願っています。日付を扱う処理は、一度組んでしまえば数年単位で稼働し続ける基幹部分になることも少なくありません。今一度、あなたの既存コードを見直し、Select Case文が並んでいないか確認してみてください。もしあれば、それはWeekdayName関数に置き換える絶好のチャンスです。
