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の関数では、「似て非なる」というか、同じように処理されないものが結構ありますので、使い分けるようにしないといけないので、注意が必要になります。