VBAの勉強を始めてみた

色々試しています。

日付データ(シリアル値)をお好みの表示形式で文字列に変換する

今回は、日付データを一括で文字列に変換する簡単なマクロを作ったので紹介します。

 

まず、日付データを文字列として扱いたいのはどんな場合か? について、軽く触れておきたいと思います。

 

このように、A列に日付データ、B列にコメントがあったとして

f:id:kouten0430:20180710143217j:plain

 

これを、C列に文字列結合 =A1&"は"&B1 すると

f:id:kouten0430:20180710143322j:plain

 

あれ?何だこの数値?(@_@;)

 

これは、日付データの実体はシリアル値だからであり、表に見えている 7月10日 などは、エクセルが私達に見せている仮の姿です。
表示形式を変えると、エクセルが 43291 のようなシリアル値に、表示形式ごとの仮面を被せて

7/10
2018/7/10
2018年7月
2018年7月10日
H30.7.10
平成30年7月10日
・・・等

のように、見えるようにしています。

 

このような日付データを、シリアル値ではなく、純粋な "7月10日" という文字列にしてから文字列結合を行うとうまくいきます。

f:id:kouten0430:20180710143358j:plain

 

では、日付データを文字列として扱うにはどうすればいいでしょう?
この場合、次のような方法が考えられると思います。

  • 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

 

※コードの使用方法

  1. SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら
  2. 文字列に変換したい日付データの入ったセルを選択します

    f:id:kouten0430:20180710144851j:plain(変換前はシリアル値なので、右詰め表示です)

  3. マクロを実行します
  4. 表示されたInputBoxからお好きな書式を選んでOKします

    f:id:kouten0430:20180710144939j:plain(変換後は文字列なので、左詰め表示です)

 

 そもそも書式記号が分からない!という人は、過去記事で触れていますので参考に。 

kouten0430.hatenablog.com