t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA クラスモジュールで今月末・来月初などの日付計算を楽に扱う

今日はVBAで日付を扱う案件があった。
とりいそぎ、日付関連の関数で済ませたけれど、オブジェクトがあると楽だなと思ったのでクラスモジュールを作ってみた。

作り方

まずはクラスモジュールを挿入し、プロパティウインドウから名前をDateObjectに変えておく。
f:id:t-hom:20171130221453p:plain

DateObjectモジュール内に以下のコードを張り付ける。

Public Value As Date
Private Sub Class_Initialize()
    Value = Date
End Sub

Public Function SetDateByYYYYMMDD(yyyymmdd As String)
    Value = DateSerial(Left(yyyymmdd, 4), Mid(yyyymmdd, 5, 2), Right(yyyymmdd, 2))
End Function

Public Property Get ToString(string_format As String) As String
    ToString = format(Value, string_format)
End Property

Public Property Get Self() As DateObject
    Set Self = Me
End Property

Public Property Get FirstOfMonth() As DateObject
    With New DateObject
        .Value = DateValue(Me.ToString("yyyy/mm/01"))
        Set FirstOfMonth = .Self
    End With
End Property

Public Property Get MoveMonth(n As Long) As DateObject
    With New DateObject
        .Value = DateAdd("m", n, Me.Value)
        Set MoveMonth = .Self
    End With
End Property

Public Property Get LastMonth() As DateObject
    Set LastMonth = Me.MoveMonth(-1)
End Property

Public Property Get NextMonth() As DateObject
    Set NextMonth = Me.MoveMonth(1)
End Property

Public Property Get EndOfMonth() As DateObject
    With New DateObject
        .Value = Me.FirstOfMonth.NextMonth.Value - 1
        Set EndOfMonth = .Self
    End With
End Property

以上で準備は完了。

使い方

※適当にサンプルを用意してみたので、標準モジュールに貼り付けて実行してみてください。

Sub hoge()
    Dim d As DateObject: Set d = New DateObject
    
    'オブジェクト作成直後は、当日の日付が入る。
    Debug.Print d.Value
    
    '日付をyyyymmdd形式で設定できる。
    d.SetDateByYYYYMMDD "20171130"
    
    '普通に日付の代入もできる。
    d.Value = Date 'Date関数で今日の日付を作って代入
    
    'ToStringでフォーマット整形できる。
    Debug.Print d.ToString("yyyymmdd")
    
    '月初の日付を取得する
    Debug.Print d.FirstOfMonth.Value
    
    '月末の日付をフォーマット指定で出力
    Debug.Print d.EndOfMonth.ToString("ge年mm月dd日")
    
    '再来月末の日付をフォーマット指定で出力
    Debug.Print d.NextMonth.NextMonth.EndOfMonth.ToString("yyyy-mm-dd")
End Sub

結果は次のように出力される。

2017/11/30 
20171130
2017/11/01 
H29年11月30日
2018-01-31

このマクロを改造するのに必要な知識

例えばNextWeek命令が欲しいなど、改造したくなることがあるかもしれない。
その場合、まずはクラスモジュールの知識が必要になる。

以下に入門記事を書いているのでどうぞ。
thom.hateblo.jp

また、以下の記事のテクニックも使用しているのでご参考までに。
thom.hateblo.jp
thom.hateblo.jp

以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。