4/28/2020

Excel。Excel VBAでDATE関数を使うと、TODAY関数になっちゃう!【TODAY】

Excel。Excel VBAでDATE関数を使うと、TODAY関数になっちゃう!

<Excel VBA>

ExcelとExcel VBAというのは、似ているけど似ていないものが結構あって、ビックリすることがあります。

次のデータは、CSVファイルなどのデータをExcelにインポートした状態だとします。

A~C列は今のままだと、ただの数値にすぎませんが、本来は、日付だったので、D列にA~C列のデータをつかって日付を算出したいとします。

Excelならば、DATE関数を使えば、いたって簡単に算出することができます。

D2の数式は、
=DATE(A2,B2,C2)
と設定すればいいわけですね。引数は、年月日の順に設定します。

これを、CSVをインポートしたあとに自動的に日付を算出したい場合、マクロを作るわけですが、Excel VBAでDATE関数を使うとちょっとおかしなことが発生しますので、確認してみましょう。

Sub 自動日付()
    Dim i As Integer
    For i = 2 To 6
        Cells(i, "d") = Date(Cells(i, "a"), Cells(i, "b"), Cells(i, "c"))
    Next
End Sub

上記のような簡単なExcel VBAのプログラム文を作ればいいかと考えますが、コンパイルエラーが発生します。

Cells(i, "d") = Date(Cells(i, "a"), Cells(i, "b"), Cells(i, "c"))
Date関数の引数がおかしいようなので、次のようにしてみたら、コンパイルエラーが出ませんでした。

Sub 自動日付()
    Dim i As Integer
    For i = 2 To 6
       Cells(i, "d") = Date
    Next
End Sub

とりあえず、実行してみると、ビックリします。

なんと、TODAY関数のように、今日の日付が入力されてしまいました。

では、逆にExcel VBAで今日の日付を入力するにはTODAY関数を使えばいいのでしょうか?
Sub 自動日付()
    Dim i As Integer
    For i = 2 To 6
       Cells(i, "d") = Today()
    Next
End Sub

Today関数を使うとエラーが表示されて実行できません。
Excel VBA関数には、Today関数はないためにエラーが発生します。

まず、押さえておきたいのは、Exce VBAで今日の日付を入力したいのならば、TODAY関数ではなくて、Date関数をつかうというわけです。

では、本題である、DATE関数をExcel VBAでは、どのようにしたらいいのでしょうか?

ExcelのDATE関数(ワークシート関数)をExcel VBAの関数では、DateSerial関数を使うことで、同じように年月日のデータから日付を作ることができます。

次のようにDateSerial関数をつかって、修正します。

Sub 自動日付()
    Dim i As Integer
    For i = 2 To 6
        Cells(i, "d) = DateSerial(Cells(i, "a"), Cells(i, "b"), Cells(i, "c"))
    Next
End Sub

では実行してみましょう。

ご覧のように、DATE関数と同じように日付を算出することができました。

ExcelのDATE関数は、Excel VBAでは、DateSerial関数をつかい、
ExcelのTODAY関数は、Excel VBAでは、Date関数をつかうというように、Excelのワークシート関数とExcel VBAの関数では、「似て非なる」というか、同じように処理されないものが結構ありますので、使い分けるようにしないといけないので、注意が必要になります。