即効テクニック

日付・時刻関連のテクニック

曜日を判定する

(Excel 97/2000/2002/2003/2007)
曜日を判定するとき、よく使われるのがWeekday関数です。
たとえば次のコードは、セル範囲A1:A20に入力された日付が「木曜日」だったとき、隣のB列を合計するマクロです。
A列にはシリアル値、B列には数値が入力されているものとします。

Sub Sample1()
  Dim i As Long, buf As Long
  For i = 1 To 20
    If Weekday(Cells(i, 1)) = 5 Then
      buf = buf + Cells(i, 2)
    End If
  Next i
  MsgBox buf
End Sub   
マクロに間違いはありませんが、可読性に優れたコードは言えません。 後日、このマクロを修正するとき「Weekday(Cells(i, 1)) = 5」が何曜日を判定しているのかが分かりにくいからです。 Weekday関数は、曜日を表す数値を返しますが、何番が何曜日かがわかりにくいです。 もちろん「Weekday(Cells(i, 1)) = vbThursday」のように定数を使う手もありますが、Weekday関数にこだわらなくても、他にも曜日を調べる方法があります。 たとえばWeekdayName関数は、Weekday関数の結果から日本語の曜日を返します。
Sub Sample2()
  Dim i As Long, buf As Long
  For i = 1 To 20
    If WeekdayName(Weekday(Cells(i, 1))) = "木曜日" Then
      buf = buf + Cells(i, 2)
    End If
  Next i
  MsgBox buf
End Sub   
これなら、間違いなく「木曜日」を判定しているとわかりますね。 もう一つ、覚えておきたいのはFormat関数を使った判定です。 Format関数は、セルに表示形式を設定したのと同じ結果を返す関数です。 次のコードは「\1,234」を返します。
Sub Sample3()
  MsgBox Format(1234, "\\#,###")
End Sub   
Format関数の第2引数には[セルの書式設定]ダイアログボックスの「ユーザー定義」で設定するのと同じ書式記号を指定できます。 セルにシリアル値が入力されていた場合「aaa」や「aaaa」で曜日を取得することができます。
Sub Sample4()
  Dim i As Long, buf As Long
  For i = 1 To 20
    If Format(Cells(i, 1), "aaa") = "木" Then
      buf = buf + Cells(i, 2)
    End If
  Next i
  MsgBox buf
End Sub   
Format関数は、日付を判定するときに便利です。 たとえば、A列の日付が「2008年」の「11月」で、かつ「木曜日」かどうかを判定するときも、
Sub Sample5()
  Dim i As Long, buf As Long
  For i = 1 To 20
      If Year(Cells(i, 1)) = 2008 And Month(Cells(i, 1)) = 11 _
      And Weekday(Cells(i, 1)) = 5 Then
      buf = buf + Cells(i, 2)
    End If
  Next i
  MsgBox buf
End Sub   
と3つの関数を使わなくても
Sub Sample6()
  Dim i As Long, buf As Long
  For i = 1 To 20
    If Format(Cells(i, 1), "yyyymmaaa") = "200811木" Then
      buf = buf + Cells(i, 2)
    End If
  Next i
  MsgBox buf
End Sub   
とシンプルに判定することができます。