📈

VBA Format関数の使い方【日付や曜日を扱う方法】

2023/06/21に公開

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