はじめに:なぜExcelで曜日を扱う必要があるのか?
Excelを日常的に利用する上で、日付データは非常に頻繁に登場します。そして、その日付が「何曜日」なのかを知りたい、あるいは曜日に応じて処理を分けたいというニーズは、多くの場面で発生します。例えば、
* **レポート作成:** 月次レポートで、曜日ごとの売上集計や傾向分析を行いたい。
* **スケジュール管理:** 特定の曜日にのみ実施するタスクを自動で抽出したい。
* **データ分析:** 週末と平日で異なる分析を行い、より深い洞察を得たい。
* **条件付き書式:** 特定の曜日にセルの色を変え、視覚的に分かりやすくしたい。
このような時に役立つのが、Excelの「WEEKDAY関数」です。この関数を理解し、使いこなすことで、日付データから曜日情報を効率的に取得し、様々な業務に活用できるようになります。
本記事では、Excel VBAの講師として長年の経験を持つ私が、WEEKDAY関数の基本的な使い方から、VBAでの応用、さらには実務で役立つアドバイスまで、網羅的に解説します。初心者の方でも安心して学べるように、具体的なコード例を豊富に交えながら、分かりやすく説明していきますので、ぜひ最後までお付き合いください。
WEEKDAY関数とは? 基本的な使い方を理解しよう
WEEKDAY関数は、指定した日付が「その週の何番目の曜日」であるかを数値で返してくれる関数です。
#### 関数構文
WEEKDAY(シリアル値, [種類])
* **シリアル値:** 曜日を求めたい日付を入力します。Excelは日付をシリアル値(1900年1月1日を1とする通し番号)で管理しているため、日付が入力されたセル参照を指定するか、直接日付を入力します。
* **種類 (省略可):** 曜日の数え方を指定します。この引数を省略した場合、または「1」を指定した場合は、日曜日が「1」、月曜日が「2」…土曜日が「7」となります。
#### 「種類」引数の詳細
「種類」引数は、WEEKDAY関数の挙動を決定する重要な要素です。以下に、主な種類とその返り値を示します。
| 種類 | 日曜日 | 月曜日 | 火曜日 | 水曜日 | 木曜日 | 金曜日 | 土曜日 |
|—|—|—|—|—|—|—|—|—|
| 省略または1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 2 | 2 | 3 | 4 | 5 | 6 | 7 | 1 |
| 3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| 11 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | (※注意: 実際には数値で返ります) |
| 12 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | (※注意: 実際には数値で返ります) |
| 13 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | (※注意: 実際には数値で返ります) |
| 14 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | (※注意: 実際には数値で返ります) |
| 15 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | (※注意: 実際には数値で返ります) |
| 16 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | (※注意: 実際には数値で返ります) |
| 17 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | (※注意: 実際には数値で返ります) |
※上記表の「種類」11~17は、月曜日を1、日曜日を7とするなど、様々な開始曜日を指定できますが、一般的には「1」または「2」が最もよく使われます。ここでは、概念を理解するために「月~日」と表記しましたが、実際には数値で返されることを覚えておいてください。
#### 具体的な使用例
例えば、A1セルに「2023/10/26」と入力されているとします。
* **=WEEKDAY(A1, 1)** と入力すると、「5」が返されます(日曜日を1とする場合、木曜日は5番目)。
* **=WEEKDAY(A1, 2)** と入力すると、「4」が返されます(月曜日を1とする場合、木曜日は4番目)。
* **=WEEKDAY(A1, 3)** と入力すると、「3」が返されます(月曜日を0とする場合、木曜日は3番目)。
このように、どの曜日を「1」とするかで返り値が変わります。業務でよく使う曜日の数え方(例えば「月曜日を1」としたい場合など)を事前に決めておくと、後々の処理がスムーズになります。
### WEEKDAY関数とVBA:より高度な曜日処理を実現する
Excelのワークシート関数であるWEEKDAY関数は、VBA(Visual Basic for Applications)からも呼び出して利用することができます。これにより、より複雑で自動化された曜日処理が可能になります。
#### VBAでWEEKDAY関数を呼び出す方法
VBAからExcel関数を呼び出すには、`Application.WorksheetFunction` オブジェクトを使用します。
Sub GetWeekdayFromVBA()
Dim targetDate As Date
Dim weekdayNumber As Integer
‘ 例として、今日の日付を取得
targetDate = Date
‘ WEEKDAY関数を呼び出し (種類1: 日曜日=1)
weekdayNumber = Application.WorksheetFunction.Weekday(targetDate, vbSunday) ‘ vbSundayは定数で1を表します
‘ 結果をメッセージボックスに表示
MsgBox “今日 (” & Format(targetDate, “yyyy/mm/dd”) & “) は週の ” & weekdayNumber & ” 番目の曜日です。”
End Sub
このコードでは、`Application.WorksheetFunction.Weekday` を使ってWEEKDAY関数を呼び出しています。`vbSunday` は、VBAで定義されている定数で、WEEKDAY関数の「種類」引数に「1」(日曜日を1とする)を指定するのと同義です。
#### VBAで曜日名を直接取得する方法
WEEKDAY関数は数値で曜日を返しますが、多くの場合は「月曜日」「火曜日」といった文字列で表示したい場面が多いでしょう。VBAでは、`Weekday` 関数(`Application.` を付けない)を使うことで、数値だけでなく、直接曜日名を取得することも可能です。
Sub GetWeekdayNameFromVBA()
Dim targetDate As Date
Dim weekdayName As String
‘ 例として、特定の日付を設定
targetDate = #2023/10/27# ‘ 2023年10月27日は金曜日
‘ VBAのWeekday関数を使用 (デフォルトは日曜日=1)
‘ 返り値はvbSunday, vbMonday, vbTuesday… vbSaturday のいずれか
‘ これをFormat関数で曜日名に変換する
weekdayName = Format(targetDate, “aaaa”) ‘ “aaaa” は曜日名を表示する書式
‘ 結果をメッセージボックスに表示
MsgBox Format(targetDate, “yyyy/mm/dd”) & ” は ” & weekdayName & ” です。”
End Sub
この例では、`Format` 関数に `”aaaa”` という書式を指定することで、日付から直接曜日名を取得しています。`Format` 関数は日付の表示形式を自由に変更できる強力な関数であり、曜日名を取得する際にも非常に便利です。
#### 曜日ごとの処理をVBAで分岐させる
WEEKDAY関数(またはVBAの`Weekday`関数)で取得した数値を利用して、曜日ごとに異なる処理を実行するコードを作成できます。
Sub ProcessByWeekday()
Dim targetDate As Date
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim cell As Range
‘ 処理対象のシートを設定 (例: “Sheet1”)
Set ws = ThisWorkbook.Sheets(“Sheet1”)
‘ データのある最終行を取得
lastRow = ws.Cells(Rows.Count, “A”).End(xlUp).Row
‘ A列の日付データを1行ずつ処理
For i = 1 To lastRow
Set cell = ws.Cells(i, “A”)
‘ セルが日付として認識できるかチェック
If IsDate(cell.Value) Then
targetDate = CDate(cell.Value)
‘ 曜日を取得 (種類2: 月曜日=1)
Select Case Application.WorksheetFunction.Weekday(targetDate, vbMonday)
Case 1 ‘ 月曜日
cell.Offset(0, 1).Value = “週の始まり”
cell.Offset(0, 1).Font.Color = RGB(0, 0, 255) ‘ 青色にする
Case 6 ‘ 土曜日
cell.Offset(0, 1).Value = “週末”
cell.Offset(0, 1).Font.Color = RGB(255, 0, 0) ‘ 赤色にする
Case 7 ‘ 日曜日
cell.Offset(0, 1).Value = “休日”
cell.Offset(0, 1).Font.Color = RGB(255, 0, 0) ‘ 赤色にする
Case Else ‘ その他の曜日 (火~金)
cell.Offset(0, 1).Value = “平日”
cell.Offset(0, 1).Font.Color = RGB(0, 0, 0) ‘ 黒色にする
End Select
Else
‘ 日付でない場合はスキップまたはエラー処理
cell.Offset(0, 1).Value = “無効な日付”
End If
Next i
MsgBox “曜日による処理が完了しました。”
End Sub
このコードは、A列に入力されている日付に対して、曜日ごとにB列にコメントを挿入し、文字色を変更する例です。`Select Case` 文を使うことで、WEEKDAY関数の返り値(曜日番号)に応じて処理を分岐させています。
* `vbMonday` を使用して、月曜日を「1」としています。
* `cell.Offset(0, 1)` は、処理対象のセル(A列)の右隣(B列)を指します。
* `RGB()` 関数で、文字色を赤、青、黒に設定しています。
このように、VBAとWEEKDAY関数を組み合わせることで、データ分析や業務自動化の幅が大きく広がります。
実務で役立つ! WEEKDAY関数活用のヒントと注意点
WEEKDAY関数を実務で効果的に活用するためには、いくつか押さえておきたいポイントがあります。
1. 「種類」引数の統一
前述の通り、WEEKDAY関数には「種類」引数があり、曜日の数え方が変わります。チームでExcelファイルを共有する場合や、複数のVBAコードが混在するような環境では、どの「種類」を使っているのかを明確にし、統一することが重要です。一般的には「1」(日曜日=1)または「2」(月曜日=1)がよく使われます。どちらを使うかは、プロジェクトやチームの慣習に合わせましょう。
#### 2. 曜日名への変換処理
WEEKDAY関数は数値を返しますが、ユーザーフレンドリーな表示のためには曜日名に変換する必要があります。
* **ワークシート関数:** `CHOOSE` 関数とWEEKDAY関数を組み合わせることで、曜日名を表示できます。
=CHOOSE(WEEKDAY(A1,2),”月”,”火”,”水”,”木”,”金”,”土”,”日”)
この例では、WEEKDAY関数で月曜日を1として取得し、CHOOSE関数で対応する曜日名を返しています。
* **VBA:** VBAでは、前述の `Format(targetDate, “aaaa”)` が最も手軽で推奨される方法です。
#### 3. 日付データの正確性
WEEKDAY関数は、正確な日付データが入力されていることを前提としています。もし、セルに「2023/13/40」のような無効な日付が入力されている場合、WEEKDAY関数はエラーを返したり、意図しない結果を生成したりする可能性があります。VBAで処理を行う際には、`IsDate()` 関数などを用いて、入力値が有効な日付であるかを確認する処理を入れることが重要です。
#### 4. 条件付き書式との連携
Excelの「条件付き書式」機能とWEEKDAY関数を組み合わせることで、特定の曜日にセルの書式(色、フォントなど)を自動で変更できます。例えば、「土曜日と日曜日のセルに色を付ける」といった設定が可能です。
* **設定方法:**
1. 書式を設定したいセル範囲を選択します。
2. 「ホーム」タブ → 「条件付き書式」 → 「新しいルール」を選択します。
3. 「数式を使用して、書式設定するセルを決定」を選択します。
4. 数式欄に `=OR(WEEKDAY(A1,1)=7,WEEKDAY(A1,1)=1)` のように入力します。(A1は条件付き書式を適用する範囲の左上のセルを指定します。この数式は、土曜日(7)または日曜日(1)の場合にTRUEを返します。)
5. 「書式」ボタンをクリックし、適用したい書式(塗りつぶしの色など)を設定します。
6. 「OK」をクリックして設定を完了します。
#### 5. VBAでのエラーハンドリング
VBAコードでWEEKDAY関数を呼び出す際に、予期せぬエラーが発生する可能性があります。例えば、対象セルが空欄だったり、日付として解釈できない文字列だったりする場合です。`On Error Resume Next` や `On Error GoTo` といったエラーハンドリングの仕組みを適切に導入することで、コードの堅牢性を高めることができます。
Sub SafeProcessByWeekday()
Dim targetDate As Variant ‘ Variant型で受け取ることで、日付以外も格納可能
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim cell As Range
Set ws = ThisWorkbook.Sheets(“Sheet1”)
lastRow = ws.Cells(Rows.Count, “A”).End(xlUp).Row
For i = 1 To lastRow
Set cell = ws.Cells(i, “A”)
targetDate = cell.Value ‘ まずはVariant型で値を取得
‘ IsDate関数で日付かどうかを判定
If IsDate(targetDate) Then
‘ 安全に日付に変換してWEEKDAY関数を呼び出す
Select Case Application.WorksheetFunction.Weekday(CDate(targetDate), vbMonday)
Case 1 ‘ 月曜日
cell.Offset(0, 1).Value = “週の始まり”
Case 6 ‘ 土曜日
cell.Offset(0, 1).Value = “週末”
Case 7 ‘ 日曜日
cell.Offset(0, 1).Value = “休日”
Case Else
cell.Offset(0, 1).Value = “平日”
End Select
Else
‘ 日付でない場合の処理
cell.Offset(0, 1).Value = “無効な日付”
End If
Next i
MsgBox “曜日による処理が完了しました。”
End Sub
このコードでは、`IsDate` 関数で事前にチェックすることで、`CDate` 関数による日付への変換や `Weekday` 関数の呼び出しが安全に行われるようにしています。
まとめ:WEEKDAY関数でExcel作業を効率化しよう
本記事では、ExcelのWEEKDAY関数について、その基本的な使い方からVBAでの応用、そして実務で役立つヒントまでを詳しく解説しました。
* **WEEKDAY関数** は、日付から曜日情報を数値で取得できる便利な関数です。
* **「種類」引数** を理解することで、曜日の数え方を柔軟に指定できます。
* **VBA** と組み合わせることで、曜日ごとの自動処理や、より高度なデータ操作が可能になります。
* **`Format` 関数** を使うと、VBAで直接曜日名を取得できます。
* 実務では、**「種類」の統一、正確な日付データの利用、エラーハンドリング** に注意することが重要です。
* **条件付き書式** と連携させることで、視覚的な分かりやすさを向上させられます。
WEEKDAY関数は、一見地味に思えるかもしれませんが、その汎用性の高さから、あらゆるExcel業務の効率化に貢献します。今回学んだ知識を活かして、ぜひ日々の業務で活用してみてください。
もし、さらに具体的な応用例や、特定の状況での使い方が知りたい場合は、お気軽にご質問ください。Excel VBA講師として、皆様のスキルアップを全力でサポートさせていただきます。
