Excel VBA(エクセル マクロ) 小技集そのA 日付の表示形式統一

日付の表示形式がたくさん。
統一、演算を行って、日付によるデータ分析に役立てよう。

文字列の統一を行い、VLOOLUP等での検索効率を上げようとしているが、今度は日付の問題が上がってきた。

日付の表記方法が下記のように複数あるのだ。

200712
2007/12

しかも文字列で保存されている。

これを、グラフで表記している「07/12」に変更する。


Dim a As String, b As String

Sheets("データ").Select

a = Cells(1, 1).Value

If InStr(a, "/") > 0 Then
b = a & "/01"
Else
b = Format(DateSerial(Left(a, 4), Right(a, 2), "01"), "yyyy/mm/dd")
End If

Cells(1, 2).Value = b
Cells(1, 2).NumberFormat = "yy/mm"


Cells(1,1)の値を変更してCells(1,2)へ代入する。

InStr(a, "/") で変換元のデータに「/」があるかどうか調査し、
処理を別ける。

@「/」がある場合
後ろに「/01」をつけて「2007/12/01」の形式にする。

A「/」が無い場合

b = Format(DateSerial(Left(a, 4), Right(a, 2), "01"), "yyyy/mm/dd")


DateSerial(Left(a, 4), Right(a, 2), "01")で20071201を日付変換し、2007/12/01(土)とする。

ちなみに
Left(a, 4)・・・2007(年)
Right(a, 2)・・・12(月)
"01"・・・(日)
を代入している。

Format関数で"yyyy/mm/dd"の表示形式に変更し、「2007/12/01」の形式にする。


データを整えた後、Cells(1, 2).Valueに値を代入し、セルの表示形式を「yy/mm」に変更する。

Cells(1, 2).Value = b
Cells(1, 2).NumberFormat = "yy/mm"


いきなり、

b = Format(a, "yy/mm")
b = Format(DateSerial(Left(a, 4), Right(a, 2), "01"), "yy/mm")

とすればいいじゃないか、と思うかもしれないが、これでは「7月12日」と出てしまい、NGであった。

値を"yyyy/mm/dd"の形式にして、セルのフォーマットを"yy/mm"にしなければうまくいかなかった。

それでは、

b = DateSerial(Left(a, 4), Right(a, 2), "01")

としてbの形式を「yyyy/mm/dd(曜日)」、セルの形式を"yy/mm"としてみたらどうかと試したところ、

yy/mmの形式にはならず、yyyy/mm/dd(曜日)の形式でしか表示されなかった。

必ず、"yyyy/mm/dd"の形式にして、セルのフォーマットを"yy/mm"にする必要があるようだ。


Excelには制約が多すぎる。。
たかが表示形式と思ったが、制約を解除するために時間を費やした。。

忍者Admaxのテキスト広告で収入UP!

実践!ExcelデータベースTOP