エクセルVBA100本ノック。7本目:日付データの扱い

この記事から得るもの

IsDate関数、DateSerial関数の使い方がわかる。


1 今回のお題

A列は文字列データ(表示形式が文字列)で日付が入っています。
日付とみなされる場合はB列に月末日付をmmddの形式で出力してください。
日付け以外の場合は空欄にしてください。
例.B2は「0930」と出力する。
※何をもって日付とみなすかも含めて考えてください。

f:id:bimori466:20201105132056p:plain

excel-ubara.com

2 今回のお題の意図

何をもって日付とみなすか考える。

3 回答

私の最初の回答

Sub ノック7本目_1()

Dim i As Byte: i = 1
Dim Ws As Worksheet: Set Ws = Worksheets("sheet1")
Dim TragetDate As Variant


'最終行取得
LastLine = Ws.Cells(Rows.Count, 1).End(xlUp).Row


For k_date = 2 To LastLine
    TragetDate = Ws.Cells(k_date, 1)
    
    If IsDate(TragetDate) = True Then
        Ws.Cells(k_date, 2) = DateSerial(Year(TragetDate), Month(TragetDate) + 1, 0)
        Ws.Cells(k_date, 2).NumberFormatLocal = "mm/dd"
    End If
    
Next

End Sub


これまた、問題文をよく読んでおらず、 "mm/dd"としてしまいました。"mmdd"としなければなりませんでした。
一応は、これでクリアなのですが、神髄先生の回答をみると私とのスマートさの違いが分かります。


*神髄先生の回答

Sub VBA100_07()
  Dim i As Long
  Dim d As Variant
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    d = Replace(Cells(i, 1).Value, ".", "/")
    If IsDate(d) Then
      d = CDate(d)
      Cells(i, 2) = Format(DateSerial(Year(d), Month(d) + 1, 0), "'mmdd")
    Else
      Cells(i, 2) = ""
    End If
  Next
End Sub

私のコードと比べると2つの違いがあります。
1 最終行の取得で変数を使っていない。
2 Format関数とDateSerial関数を組み合わせて、セルの転記と表示型式の設定を1行で記述している。

ちなみに、神髄先生はドット(.)を/に置き換えて救済されていますが、私はやりません。それはそもそもエクセルへのリテラシーが低いのでこちらのやる気がそがれてしまいますのでw。まぁ、手動で置換した後に再処理するくらいの優しさは持ち合わせていますよ!

やはり、神髄先生の差は多いです。
またまた、勉強になりました。何をもって日付にするかってかなり悩ましい問題ですね(;^ω^)。
私としてはDBには”yyyy/mm/dd”を使って、インターフェースでいじってくれと思う派です。

ではこのへんで(^^)/~~~