「excel vba 8桁の数値を日付にする」
「エクセル vba 8桁の文字列日付に変更」
「エクセルマクロ 8桁数字を日付型に」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスが時折あります。
年・月・日の数字をつなげた「20140612」といった「yyyymmdd」形式の8桁の数字を、日付データに変換するExcel マクロ・VBA(Visual Basic for Applications)のコードを探している方による検索です。
Mid関数とスラッシュで日付に変換するサンプルマクロ
分かりやすいのは、Mid関数と「/」(スラッシュ)を使って日付データに変換する方法でしょう。
Dim org As String
Dim buf As String With ActiveCell
org = .Value
If Len(org) = 8 Then
buf = _
Mid(org, 1, 4) & "/" & _
Mid(org, 5, 2) & "/" & _
Mid(org, 7, 2)
If IsDate(buf) = True Then
.Value = buf
.NumberFormatLocal = "yyyy年m月d日"
End If ' IsDate
End If ' Len = 8
End With ' ActiveCell
End Sub
「20140612」のようなyyyymmdd形式の、8桁の数字が入力されているセルを選択した状態で、上記のマクロを実行すると「2014年6月12日」という日付データに変換されます。
アクティブセルの値を変数・orgに格納して、
With ActiveCell
org = .Value
8桁の文字列だったときに、
If Len(org) = 8 Then
変数・bufに「yyyy/mm/dd」という形に整形した文字列を格納します。
buf = _
Mid(org, 1, 4) & "/" & _
Mid(org, 5, 2) & "/" & _
Mid(org, 7, 2)
Mid関数は、第1引数に指定された文字列から、第2引数に指定された位置の文字から、第3引数に指定された文字数分の文字列を取得する関数です。
「Mid(org, 1, 4)」でorgの1文字目から4文字(年の数字)
「Mid(org, 5, 2)」でorgの5文字目から2文字(月の数字)
「Mid(org, 7, 2)」でorgの7文字目から2文字(日の数字)
がそれぞれ取得できるので、その間に「/」を入れているのが
Mid(org, 1, 4) & "/" & _
Mid(org, 5, 2) & "/" & _
Mid(org, 7, 2)
の意味です。
その「/」を入れた文字列が、日付データとして扱えをどうかをIsData関数で確認してOKならば、
If IsDate(buf) = True Then
アクティブセルの値を変数・bufに格納されている文字列に書き換え、
.Value = buf
書式の設定を行っています。
.NumberFormatLocal = "yyyy年m月d日"
Format関数で日付に変換するサンプルマクロ
同じことを、Format関数を使っても行うことができます。
Dim org As String
Dim buf As String With ActiveCell
org = .Value
If Len(org) = 8 Then
buf = Format(org, "@@@@/@@/@@")
If IsDate(buf) = True Then
.Value = buf
.NumberFormatLocal = "yyyy年m月d日"
End If ' IsDate
End If ' Len = 8
End With ' ActiveCell
End Sub
考え方はほとんど同じで、違うのは、先ほどのサンプルマクロで
buf = _
Mid(org, 1, 4) & "/" & _
Mid(org, 5, 2) & "/" & _
Mid(org, 7, 2)
となっていた部分が、
buf = Format(org, "@@@@/@@/@@")
になっていることだけです。
Format関数の第2引数に「"@@@@/@@/@@"」と指定することで、「yyyymmdd」という文字列を「yyyy/mm/dd」という文字列に変換しています。
A列のデータを日付に変換するサンプルマクロ
以下のようなマクロにすれば、A列に入力されている8桁の数字をまとめて日付データに変換できます。
Dim org As String
Dim buf As String
Dim i As Long For i = 1 To Range("A1").End(xlDown).Row
With Cells(i, "A")
org = .Value
If Len(org) = 8 Then
buf = Format(org, "@@@@/@@/@@")
If IsDate(buf) = True Then
.Value = buf
.NumberFormatLocal = "yyyy年m月d日"
End If ' IsDate
End If ' Len = 8
End With ' Cells(i, "A")
Next i
End Sub
A1セルからA列の最後のデータまでループを回して、
For i = 1 To Range("A1").End(xlDown).Row
With Cells(i, "A")
先のFormat関数を使ったのと同じロジックで変換しています。
Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » 8桁のyyyymmdd形式の数字を日付に変換するExcelマクロ