VBA Format関数の使い方【日付や曜日を扱う方法】
Format関数は引数に指定した数値や日付などを、書式を適用した結果として返却します。
Format(元の値, 書式)
Format関数と日付
特によく使われるのが日付を扱う場合です。
Sub sample()
MsgBox Format(Now, "書式記号")
End Sub
上記を例に、日付に関する書式記号の代表例を記載します。
※)本記事を書いている日付が2023/06/21になるので、それに基づくデータが出力される点に注意して下さい。
書式記号 | 表示形式 | 出力結果 |
---|---|---|
yy | 西暦年の下2桁 | 23 |
yyyy | 4桁の西暦年 | 2023 |
m | 月の数値 | 6 |
mm | 月の数値 (1桁の場合は0が付く) |
06 |
d | 日の数値 | 21 |
dd | 日の数値 (1桁の場合は0が付く) |
21 |
aaa | 曜日の先頭1文字 | 水 |
aaaa | 曜日を3文字で表す | 水曜日 |
日付や曜日に基づく使い方
この仕組みを使えば日付や曜日を元にデータを扱うことが可能となります。
例えばA列の日付が「2月」だった場合、結果欄に「〇」を記載するマクロは下記のようになります。
Sub 月を検索()
Dim i As Long
For i = 2 To 11
If Format(Cells(i, 1), "m") = "2" Then
Cells(i, 2).Value = "〇"
End If
Next i
End Sub
他にもA列の日付が「金曜」だった場合、結果欄に「〇〇」を記載する..みたいなことも可能となります。
Sub 曜日を検索()
Dim i As Long
For i = 2 To 11
If Format(Cells(i, 1), "aaa") = "金" Then
Cells(i, 2).Value = "〇〇"
End If
Next i
End Sub
また西暦と月を組み合わせてブック名を作ることも可能です。
Dim ブック名 As String
ブック名 = Format(Now, "yyyymmdd") & ".xlsx"
MsgBox ブック名
上記を実行すると 20230621.xlsx
が出力されます。
シリアル値の仕組み
Excelは日付をシリアル値で管理しています。シリアル値とは1900年1月1日を1として、それ以降1日経過するごとに1ずつ増加する連続した値です。シリアル値自体は単なる数値ですが、それを調べることで、その日付の年月日や曜日を取得できる仕組みとなっています。Format関数は表示形式を加工するための仕組みとなっています。
文字列を返却する
Format関数は「文字列」を返却する点に注意が必要です。下記のコードを実行した場合、返却されるのは2019
という数値ではなく、"2019"
という文字列が返却されます。
Format(Now, "yyyy")
Format関数で年月日を判定する際は"2022"のように""(ダブルコーテーション)で囲むのがセオリーです。
If Format(Cells(i, 1), "m") = "2" Then
Cells(i, 2).Value = "〇"
End If
ちなみにYear関数、Month関数、Day関数は数値を返却します。例えば下記のコードを実行するとYear関数の場合、2019
という数値を返却します。
MsgBox Year(Now)
ただし下記2つのコードは正常に動作します。
If Format(Cells(i, 1), "yyyy") = 2023 Then
' あるいは
If Year(Cells(i, 1)) = "2023" Then
これはVBAが文字列と数値を(内部で)自動的に変換してくれているからです。こうした「自動的に型が変換される」ことを「自動型キャスト」と呼ぶこともあります。
Discussion