色々な日付の表記
面白いテーマがあったので、挑戦してみた。
#VBA100本ノック 7本目
— エクセルの神髄 (@yamaoka_ss) 2020年10月25日
A列は文字列データ(表示形式が文字列)で日付が入っています。
日付とみなされる場合はB列に月末日付をmmddの形式で出力してください。
日付け以外の場合は空欄にしてください。
例.B2は「0930」と出力する。
※何をもって日付とみなすかも含めて考えてください。 pic.twitter.com/Y9hNfWJe3N
今回は、ユーザー定義関数を作成した。
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が日付と認識していることが分かった。
今回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
結果、全員拾い上げることが出来た。
参考まで。