エクセルVBA100本ノック。7本目:日付データの扱い
1 今回のお題
A列は文字列データ(表示形式が文字列)で日付が入っています。
日付とみなされる場合はB列に月末日付をmmddの形式で出力してください。
日付け以外の場合は空欄にしてください。
例.B2は「0930」と出力する。
※何をもって日付とみなすかも含めて考えてください。
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”を使って、インターフェースでいじってくれと思う派です。
ではこのへんで(^^)/~~~