5/22/2020

Excel VBA。インポートした8桁の数値を日付に戻すにはどうしたらいいの?【Date】

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日"

このように、読み込んだデータが、日付は日付でインポートしてくれるとは限りませんので、色々対応できるようにしていくといいかもしれませんね。