VBAで年月日を合成する方法!4つの日付形式に対応可能!

エクセルで日付を扱いたいこと、多いと思います。

例えば、年・月・日が別々のセルに入力されている場合、どうやって年月日の情報を得ればよいでしょうか?

この記事では、『VBAで年・月・日のデータを合成する方法』について解説します。

ちなみに、VBAで年月日を取得する方法についても解説した記事がありますので、そちらも合わせてチェックしていただけるとうれしいです。

1.年月日の表示形式について

こんにちは。エクセルマン・ブリーダーのしもむぎ(@re_znd13)です。

エクセル上であってもそうでなくても、年月日をどう書くかっていろんな形式がありますよね。

今回はDATESERIAL関数とDATEVALUE関数を使った2つの方法を紹介するのですが、もともとの年月日のデータがどのような表示形式になっているかで使い方が少し違ってきます。

そこで、以下の形式で記入されたセルを仮定して、VBAで組んでみることにします。

  1. 数値のみ(2020、1、8など)
  2. 数値(半角数字)+年などの単位(2020年、1月、8日など)
  3. 全角数字+年などの単位(2020年、1月、8日など)
  4. 和暦+全角数字+年などの単位(令和2年、1月、8日など)

2.DATESERIAL関数で合成する場合

まずはDATESERIAL関数を使って年月日を合成する方法を考えます。

この関数はケース1:数値のみ(2020、1、8など)の表示形式に特に適しています。

この関数の構文は以下の通り。year、month、dayは数値や数式です。

DateSerial(year, month, day)

VBAコードの例としては以下になります。

A列に年、B列に月、C列に日のデータが入っているとして、DATESERIAL関数で合成したものをE列に入れています。

Sub 年月日合成1a()
Dim i As Long

For i = 1 To 5
    Cells(i, 5) = DateSerial(Cells(i, 1), Cells(i, 2), Cells(i, 3))
Next i

End Sub

3.DATEVALUE関数で合成する場合

次にDATEVALUE関数を使って年月日を合成する場合を考えます。

この関数の構文は以下の通り。dateは日付を表す文字列になります。

DateValue(date)

実はこの関数は上記ケース1から4まで、すべてのケースに対応可能です。

ケース1とケース2~4とで少し差異がありますので、それぞれで見ていきましょう。

3.1 ケース1に対応する場合

ケース1は数値のみ(2020、1、8など)の形式でしたね。

DATEVALUE関数でこのデータを用いる場合、2020や1や8というのを”&”でくっつけて文字列形式にして いれるのですが、ここで気をつけないといけないのが、年・月・日のそれぞれの単位や区切りです。

例えば、2020年1月8日という形式や2020/1/8や2020-1-8といった文字列にしてあげる必要があるのです。

VBAコードの例としては以下になります。

A列に年、B列に月、C列に日のデータが入っているとして、DATEVALUE関数で合成したものをF列に入れています。

ここでの例は年・月・日をそれぞれに付けて文字列化しています。E列は前章のDATESERIAL関数での結果ですので、同じ結果が得られていることがわかるかと思います。

Sub 年月日合成1b()
Dim i As Long

For i = 1 To 5
    Cells(i, 6) = DateValue(Cells(i, 1) & "年" & Cells(i, 2) & "月" & Cells(i, 3) & "日")
Next i

End Sub

3.2 ケース2~4に対応する場合

ケース2は数値(半角数字)+年などの単位(2020年、1月、8日など)。

ケース3は全角数字+年などの単位(2020年、1月、8日など)。

ケース4は和暦+全角数字+年などの単位(令和2年、1月、8日など) という形式でした。

これらのケースでは、年月日のそれぞれに単位がついていますので、そのまま”&”でくっつければ日付を表す文字列になります。

気になるのは全角数字や和暦の部分でしょうか。

VBAコードの例としては以下になります。

上からケース2、3、4となっていて、いずれもA列に年、B列に月、C列に日のデータが入っているとして、DATEVALUE関数で合成したものをF列に入れています。

Sub 年月日合成2()
Dim i As Long

For i = 11 To 15
    Cells(i, 6) = DateValue(Cells(i, 1) & Cells(i, 2) & Cells(i, 3))
Next i

End Sub
Sub 年月日合成3()
Dim i As Long

For i = 21 To 25
    Cells(i, 6) = DateValue(Cells(i, 1) & Cells(i, 2) & Cells(i, 3))
Next i

End Sub
Sub 年月日合成4()
Dim i As Long

For i = 31 To 35
    Cells(i, 6) = DateValue(Cells(i, 1) & Cells(i, 2) & Cells(i, 3))
Next i

End Sub

全角数字や和暦も問題なく合成してくれていることがわかりますね。

4.まとめ

この記事では、『VBAで年・月・日のデータを合成する方法』として、2つの関数で4つのケースに対応する方法を解説しましたが、いかがでしたか?

ある程度セルへの入力形式は統一するのが理想ですが、場合によってDATESERIAL関数、DATEVALUE関数を使い分けたいですね。