例文を使って繰り返し業務を時短

【マクロ・VBA】指定した範囲のデータ型を日付に変換する

エクセル、マクロ、VBAのNumberFormatやNumberFormatLocalを使って、データ型を日付にする方法 VBA

NumberFormatとは

NumberFormatプロパティは、数値や日付の表示形式を設定するために使用されます。このプロパティを使用することで、数値や日付を特定の書式で表示することができます。

NumberFormatLocalとは

NumberFormatLocalプロパティは、NumberFormatプロパティと同様に数値や日付の表示形式を設定するために使用されます。しかし、NumberFormatLocalプロパティは、Excelファイルが開かれているローカルな言語設定に基づいて表示形式を設定します。これに対し、NumberFormatプロパティは、Excelファイルの言語設定に依存するため、異なる言語設定で同じマクロを実行する場合、表示形式が異なる可能性があります。

例えば、NumberFormatプロパティで日付の表示形式を”yyyy/mm/dd”と設定した場合、Excelファイルが言語設定が英語の場合は”yyyy/mm/dd”となり、言語設定が日本語の場合は”yyyy年mm月dd日”となります。しかし、NumberFormatLocalプロパティを使用すると、Excelファイルの言語設定に関係なく、常にローカルな言語設定に基づいて表示形式が設定されます。

選択列を日付へ変換

Sub 列日付変換()
Selection.TextToColumns DataType:=xlDelimited, FieldInfo:=Array(1, xlYMDFormat)
End Sub

A列を日付へ変換

Sub A列日付変換()
Range("A:A").NumberFormat = "m月d日(aaa)"    
Range("A:A").Value = Range("A:A").Value
End Sub

2列を日付へ変換

Sub 該当列を数値から日付へ変換()

With Range("A:A", "L:L")
    .NumberFormatLocal = "yyyy/m/d"
    '.NumberFormatLocal = "G/標準"
    '.Value = .Value
End With

MsgBox "完了"
End Sub

日付データの書式変換

Sub 日付の書式変換()
    
    Dim i As Long
    For i = 1 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
        With Cells(i, 1)
            .NumberFormat = "General"
            .Value = Month(.Value)
        End With
    Next i

MsgBox "完了"
End Sub

日付データを書式を選択して文字列に変換

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 = "'" & VBA.Format(myrange.Value, "yyyy/m/d")
            Case 2
                myrange.Value = "'" & VBA.Format(myrange.Value, "yyyy/m")
            Case 3
                myrange.Value = "'" & VBA.Format(myrange.Value, "yy/m/d")
            Case 4
                myrange.Value = "'" & VBA.Format(myrange.Value, "m/d")
            Case 5
                myrange.Value = "'" & VBA.Format(myrange.Value, "yyyy""年""m""月""d""日""")
            Case 6
                myrange.Value = "'" & VBA.Format(myrange.Value, "yyyy""年""m""月""")
            Case 7
                myrange.Value = "'" & VBA.Format(myrange.Value, "yy""年""m""月""d""日""")
            Case 8
                myrange.Value = "'" & VBA.Format(myrange.Value, "m""月""d""日""")
            Case 9
                myrange.Value = "'" & VBA.Format(myrange.Value, "ggge""年""m""月""d""日""")
            Case 10
                myrange.Value = "'" & VBA.Format(myrange.Value, "ggge""年""m""月""")
            Case 11
                myrange.Value = "'" & VBA.Format(myrange.Value, "ge""年""m""月""d""日""")
            Case 12
                myrange.Value = "'" & VBA.Format(myrange.Value, "ge""年""m""月""")
            Case 13
                myrange.Value = "'" & VBA.Format(myrange.Value, "ge/m/d")
            Case 14
                myrange.Value = "'" & VBA.Format(myrange.Value, "ge/m")
                
            End Select
        End If
    Next myrange
    
MsgBox "完了"
End Sub

コメント

タイトルとURLをコピーしました