日付データ(シリアル値)をお好みの表示形式で文字列に変換する
今回は、日付データを一括で文字列に変換する簡単なマクロを作ったので紹介します。
まず、日付データを文字列として扱いたいのはどんな場合か? について、軽く触れておきたいと思います。
このように、A列に日付データ、B列にコメントがあったとして
これを、C列に文字列結合 =A1&"は"&B1 すると
あれ?何だこの数値?(@_@;)
これは、日付データの実体はシリアル値だからであり、表に見えている 7月10日 などは、エクセルが私達に見せている仮の姿です。
表示形式を変えると、エクセルが 43291 のようなシリアル値に、表示形式ごとの仮面を被せて
7/10
2018/7/10
2018年7月
2018年7月10日
H30.7.10
平成30年7月10日
・・・等
のように、見えるようにしています。
このような日付データを、シリアル値ではなく、純粋な "7月10日" という文字列にしてから文字列結合を行うとうまくいきます。
では、日付データを文字列として扱うにはどうすればいいでしょう?
この場合、次のような方法が考えられると思います。
- A列の日付データを文字列に変換する
- TEXT関数を使って文字列結合する。(C列の式を =TEXT(A1,"m月d日")&"は"&B1 のようにする)
TEXT関数なんてチマチマ使ってられるか。バーロー!
という人のために、A列の日付データを一括で文字列に変換する という方法をマクロで提供しようと思います。(もちろんA列じゃなくてもOKです)
ただし、日付データを文字列に変換した場合、日付データとしての計算や判定ができなくなるので注意が必要です。
Sub 日付データを好きな書式で文字列に変換() Dim myRange As Range Dim n As Integer n = Application.InputBox(prompt:="書式を選んで下さい" & vbCrLf & vbCrLf & _ "1:yyyy/m/d" & vbCrLf & "2:yyyy/m" & vbCrLf & "3:yy/m/d" & vbCrLf & _ "4:m/d" & vbCrLf & "5:yyyy年m月d日" & vbCrLf & "6:yyyy年m月" & vbCrLf & _ "7:yy年m月d日" & vbCrLf & "8:m月d日" & vbCrLf & "9:ggge年m月d日" & vbCrLf & _ "10:ggge年m月" & vbCrLf & "11:ge年m月d日" & vbCrLf & "12:ge年m月" & vbCrLf & _ "13:ge/m/d" & vbCrLf & "14:ge/m" & vbCrLf & vbCrLf & "(9~14は和暦です)" & _ vbCrLf & vbCrLf, Type:=1) If TypeName(n) = "Boolean" Or n < 1 Or n > 14 Then Exit Sub End If For Each myRange In Selection.SpecialCells(xlCellTypeVisible) '可視セルのみに処理を行う If myRange.Address = myRange.MergeArea(1).Address Then '結合セルの場合は左上のセルのみ処理を行う Select Case n Case 1 myRange.Value = "'" & Format(myRange.Value, "yyyy/m/d") Case 2 myRange.Value = "'" & Format(myRange.Value, "yyyy/m") Case 3 myRange.Value = "'" & Format(myRange.Value, "yy/m/d") Case 4 myRange.Value = "'" & Format(myRange.Value, "m/d") Case 5 myRange.Value = "'" & Format(myRange.Value, "yyyy""年""m""月""d""日""") Case 6 myRange.Value = "'" & Format(myRange.Value, "yyyy""年""m""月""") Case 7 myRange.Value = "'" & Format(myRange.Value, "yy""年""m""月""d""日""") Case 8 myRange.Value = "'" & Format(myRange.Value, "m""月""d""日""") Case 9 myRange.Value = "'" & Format(myRange.Value, "ggge""年""m""月""d""日""") Case 10 myRange.Value = "'" & Format(myRange.Value, "ggge""年""m""月""") Case 11 myRange.Value = "'" & Format(myRange.Value, "ge""年""m""月""d""日""") Case 12 myRange.Value = "'" & Format(myRange.Value, "ge""年""m""月""") Case 13 myRange.Value = "'" & Format(myRange.Value, "ge/m/d") Case 14 myRange.Value = "'" & Format(myRange.Value, "ge/m") End Select End If Next myRange End Sub
※コードの使用方法
- SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら。
- 文字列に変換したい日付データの入ったセルを選択します
(変換前はシリアル値なので、右詰め表示です)
- マクロを実行します
- 表示されたInputBoxからお好きな書式を選んでOKします
(変換後は文字列なので、左詰め表示です)
そもそも書式記号が分からない!という人は、過去記事で触れていますので参考に。