色々な日付の表記

面白いテーマがあったので、挑戦してみた。

今回は、ユーザー定義関数を作成した。

Function 月末日付(日付文字 As String) As String
    Dim 日付 As Date
        ' IsDate関数で日付判別。
        If IsDate(日付文字) Then
            日付 = 日付文字
        Else
            月末日付 = vbNullString
            Exit Function
        End If
        
    Dim 仮置き As Date
        
        ' 引数月の翌月1日が求まれば、その前日が引数月の月末日となる。
        仮置き = CDate(Format(WorksheetFunction.EDate(日付, 1), "yyyy/m/1")) - 1
        
        月末日付 = Format(仮置き, "mmdd")
End Function

すると、ほとんどの書き方について、Excelが日付と認識していることが分かった。
f:id:Infoment:20201025225939p:plain

今回NGだったのは、「yyyy.mm.dd」のように「.」でつなぐ表記のみ。
しかしこれ、社内でよく見かける表記だったりする。

そこで課題からさらに一歩踏み込んで(蛇足)、この場合も月末日付を求められるようにしてみた。

Function 月末日付(日付文字 As String) As String
    Dim 日付 As Date
        ' IsDate関数で日付判別。
        If IsDate(日付文字) Then
            日付 = 日付文字
        Else
            ' 正規表現によるパターンマッチング。
            Dim myReg As Object
            Set myReg = CreateObject("VBScript.RegExp")
                ' パターン定義。
                myReg.Pattern = "\d{4}\.\d{1,2}\.\d{1,2}"
                
                ' パターンと一致するなら、「.」を「/」に
                ' 置き換えて日付化。
                If myReg.Test(日付文字) Then
                    日付 = Replace(日付文字, ".", "/")
                Else
                    月末日付 = vbNullString
                    Exit Function
                End If
        End If
        
    Dim 仮置き As Date
        ' 引数月の翌月1日が求まれば、その前日が引数月の月末日となる。
        仮置き = CDate(Format(WorksheetFunction.EDate(日付, 1), "yyyy/m/1")) - 1
        
        月末日付 = Format(仮置き, "mmdd")
End Function

結果、全員拾い上げることが出来た。
f:id:Infoment:20201025231105p:plain

参考まで。