「vba 前月 1日 取得」
という検索キーワードに気づきました。
VBAに限らない、日付計算の定番的な疑問です。
前月の1日を取得するサンプルマクロ
以下のSubプロシージャを実行すると、前月1日の日付が、メッセージボックスに表示されます。MsgBox _
DateSerial(Year(Now), Month(Now) - 1, 1)
End Sub
年・月・日をバラバラにして計算して再度日付データにする
こういった日付計算は、年・月・日をバラバラにしてから計算を行い、再度日付データにするのが基本です。
Excelのワークシート上で、前月の1日の日付データが必要な場合、
=DATE(YEAR(TODAY()), MONTH(TODAY())-1, 1)
といった数式をセルに入力します。
VBAでの考え方も同じです。
VBAの関数と、ワークシート関数とで別の関数が使われていますが、考え方はまったく同じです。
年・月・日を表す数値から日付データを取得する、ワークシート関数のDATE関数に似ているのが、
VBA関数のDateSerial関数です。
なお、Year関数やMonth関数は、たまたまVBA関数とワークシート関数とが、同じ綴りで、同じように日付データから年・月を表す数値を返しますが、もちろん別モノです。
ワークシート上で使われるYEAR・MONTHはワークシート関数で、VBAのYear・MonthはあくまでもVBAの関数です。
DateSerial関数より単なる引き算
前月を求めるために月を「- 1」している部分は、
DateSerial(Year(Now), Month(Now) - 1, 1)
VBAのDateAdd関数を使った例も見かけますが、DateAdd関数が頻出するようなモジュールなどでなければ、上記プロシージャのように演算子で引き算するほうが、可読性が高いと感じます。
Date関数よりNow関数
Year関数・Month関数の引数には、Now関数ではなく、VBAで今日の日付を返すDate関数を使って、
DateSerial(Year(Date), Month(Date) - 1, 1)
としてもOKですけれど、Now関数のほうが意味がよりわかりやすく、可読性が高いと感じます。
- Newer:1つ下のセルを選択する-.Offset(1, 0).Select
- Older:ウォッチ式に変数でないものを
Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » VBAで前月の1日を取得する