出題内容
#VBA100本ノック 7本目
A列は文字列データ(表示形式が文字列)で日付が入っています。
日付とみなされる場合はB列に月末日付をmmddの形式で出力してください。
日付け以外の場合は空欄にしてください。
例.B2は「0930」と出力する。
※何をもって日付とみなすかも含めて考えてください。
自分の回答
Dim LastRow As Long
Dim i As king
LastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To LastRow
If IsDate(Cells(i, 1)) = True Then
Cells(i, 2) = Format(Cells(i, 1), "mmdd")
Else
End If
Next i
mmdd形式には変換されるが、月末日付になっていない。
このままだと入力者が日付だと思って入力している数値を変換できない。(2020.10.5など)
解説
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
CDate(d)とすることで、変数dを日付型に変換できる。
d = Replace(Cells(i, 1).Value, ".", "/")を日付型に変換している。
変換できない場合はCells(i, 2) = ""となる。
日付判定できる≠シリアル値
IsDateでTrue判定になったとしても、そのままMonth関数で変換はできない。
CDateでシリアル値に変換する必要がある。
DateSerial(Year(d), Month(d) + 1, 0) 日付を0にすると前月末日になる。
EoMonthを使っても良いかも。
EOMONTH関数(月数だけ前後の月の最終日)|エクセル入門
そのそも日付以外は入力できないように、入力を制限しておくと良い。