Excel VBA。インポートした8桁の数値を日付に戻すにはどうしたらいいの?
<Excel VBA>
CSVファイルやテキストファイルを読み込んだら、日付と思っていたデータが8桁の数値でインポートされていました。次のような状態です。
今回は、この8桁の数値をB列には、「/(スラッシュ)」で区切った年月日で表示するのと、C列には、年月日で日付を表示するようにExcel VBAでプログラム文をつくっていきます。
Sub 八桁数値を日付()
Dim i As Integer
Dim row_count As Integer
Dim nen As String
Dim tuki As String
Dim niti As String
row_count = Range("A1").End(xlDown).Row
For i = 2 To row_count
nen = Mid(Cells(i, "a"), 1, 4)
tuki = Mid(Cells(i, "a"), 5, 2)
niti = Mid(Cells(i, "a"), 7, 2)
Cells(i, "b") = nen & "/" & tuki & "/" & niti
Cells(i, "c") = nen & "/" & tuki & "/" & niti
Cells(i, "c").NumberFormatLocal = "yyyy年m月d日"
Next
End Sub
上記のようにプログラム文を作ってみました。
とりあえず、実行して確認してみましょう。
このように、B列には、「/(スラッシュ)」で区切った年月日で表示する日付に変更することができました。
C列には、年月日で日付を表示することができました。
では、プログラム文を細かく確認していきましょう。
最初は、変数の宣言文ですね。
Dim i As Integer
Dim row_count As Integer
Dim nen As String
Dim tuki As String
Dim niti As String
変数のiとrow_countは数値なので、Integerで宣言しています。
変数のnen と tuki と niti には、文字に関連しますので、Stringで宣言しています。
Yearとかでもいいのですが、関数とごちゃごちゃしそうなので、ワザと、nenにしました。
データの最終行まで繰り返すために最終行の行数をrow_countに代入しているのが次の行ですね。
row_count = Range("A1").End(xlDown).Row
For To Next文で、繰り返し処理を行います。
For i = 2 To row_count ~ Next
nen = Mid(Cells(i, "a"), 1, 4)
tuki = Mid(Cells(i, "a"), 5, 2)
niti = Mid(Cells(i, "a"), 7, 2)
この3行は、変数に、それぞれ、年・月・日に該当する数値を代入させる処理をしています。
Mid関数は、文字列の開始から指定した文字数を抽出する関数です。
例えば、
nen = Mid(Cells(i, "a"), 1, 4)
は、A列のデータの1文字目から、4文字分をnenという変数に代入するという意味になります。
tukiは、5文字目から2文字分を抽出しています。
当然、nenは左から4文字ということで、
nen = Left(Cells(i, "a"), 4) とLeft関数を使っても問題はありませんし、日もRight関数をつかってもOKです。
あとは、それぞれの変数を「/(スラッシュ)」をつかって文字結合してあれば、8桁の数値を日付に変更することができます。
Cells(i, "b") = nen & "/" & tuki & "/" & niti
文字の結合は、お馴染みの「&(アンパサンド)」を使って結合します。
また、年月日で日付を表示するならば、表示形式のプロパティを使う必要が生じるので、
Cells(i, "c") = nen & "/" & tuki & "/" & niti
日付にしたあとに、NumberFormatLocalプロパティをつかって、年月日の表示形式に変更します。
Cells(i, "c").NumberFormatLocal = "yyyy年m月d日"
このように、読み込んだデータが、日付は日付でインポートしてくれるとは限りませんので、色々対応できるようにしていくといいかもしれませんね。