こんにちは!ぐーです。
毎週金曜日の夕方に「週報」を作成している方は多いのではないでしょうか?
その際に意外とストレスを感じるのが、「今週が第何週目なのか」を確認する作業です。
「1日が水曜日だから、今週は第2週かな? それとも第3週?」と迷い、わざわざカレンダーを確認するのは手間がかかります。
その確認時間は、VBA(マクロ)を活用すれば「0秒」にできます。
今回は、日付から週番号を一瞬で算出するDatePart関数と、実務で役立つ一括処理マクロをご紹介します。
1. カレンダー不要! DatePart関数とは?
DatePart関数は、その名の通り「Date(日付)」の「Part(一部)」を取り出すための命令です。
「年」や「月」だけでなく、「年間の通算週(第何週)」を一発で計算できるのが最大の特徴です。
書き方はとてもシンプルです。
DatePart(“ww”, 日付)
“ww”は週(Week)を指す引数です。 これだけで、パソコンが正確な週番号を教えてくれます。
2. 【基本】今日が第何週かを知るコード
まずは、「今日が第何週か」をポップアップで教えてくれるシンプルなコードです。
Sub CheckThisWeek()
' 今日の日付をもとに、第何週かを表示する
Dim weekNum As Integer
' Dateは「今日」を表します
weekNum = DatePart("ww", Date)
MsgBox "今日は、今年の第 " & weekNum & " 週目です!"
End Sub
これを実行するだけで、今日の日付に応じた週番号が表示されます。もうカレンダーを数える必要はなくなります。
3. 【応用】データリストに一括で「第◯週」を振るコード
実務においては、1件だけでなく、表にある大量の日付に対して一括で週番号を振りたい場面がほとんどかと思います。手入力なら10分かかる作業も、このコードなら1秒です。
想定するシートの状態:
- A列: 日付が入っている(2行目からデータ開始)
- B列: 空欄(ここに週番号を出力します)
コピペ用:リスト一括処理コード
Sub AddWeekNumbersToList()
Dim i As Long
Dim lastRow As Long
' 画面の更新を一時停止(処理速度アップのため)
Application.ScreenUpdating = False
' A列(1列目)のデータが入っている最後の行数を自動で探す
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' 2行目からデータがある最後の行まで繰り返す
For i = 2 To lastRow
' もしA列のセルが「日付」だったら処理する
If IsDate(Cells(i, 1).Value) Then
' B列(2列目)に週番号を書き込む
' vbSunday:日曜始まり / vbFirstJan1:1月1日を第1週とする
Cells(i, 2).Value = DatePart("ww", Cells(i, 1).Value, vbSunday, vbFirstJan1)
Else
' 日付じゃない場合は空白にしておく
Cells(i, 2).Value = ""
End If
Next i
' 画面の更新を再開
Application.ScreenUpdating = True
MsgBox "完了!すべての行に週番号を振りました。", vbInformation
End Sub
ポイント:定義のズレを防ぐ
上記のコードには、vbFirstJan1という設定を入れています。
実は「第1週」の定義には、「1月1日を含む週」や「最初の完全な7日間」など、複数のルールが存在します。
ここを正しく設定しないと、社内の基準と1週間ズレてしまう可能性があります。
日本の多くの企業では「1月1日を含む週を第1週」とすることが多いため、この設定を明記することでミスを防いでいます。
まとめ
たかが「週番号」、されど「週番号」。
毎回カレンダーを見て数える「30秒」や、入力ミスの不安を「ゼロ」にすることは、立派なITスキルです。
まずは上記のコードをコピペして、自分のパソコンで動かしてみてください。
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント