PCメモ

Excelを中心とした業務改善の記録

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

excel-ubara.com

出題内容

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

VBA マクロ 日付 IsDate CDate

自分の回答

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関数(月数だけ前後の月の最終日)|エクセル入門

そのそも日付以外は入力できないように、入力を制限しておくと良い。