将日期一致地转换为 dd/mm/yyyy 格式
Convert dates consistently to dd/mm/yyyy format
我正在尝试将日期格式为 dd.mm.yyyy 的 SAP 数据转换为 Excel 日期格式 dd/mm/yyyy,以便我可以将其从最旧到最新排序。
似乎查找和替换代码正在创建自己的数字格式,使得任何格式应用程序在其使用前后都毫无意义,因为它会尽可能地将任何日期转换为美国格式:
01.02.2015 -> 02/01/2015 instead of 01/02/2015
dd.mm.yyyy -> mm/dd/yyyy instead of dd/mm/yyyy
无法改回格式,因为只有部分数据受到影响,因为某些日期不符合此范围,而是保持静态格式。
是否有解决此问题的方法或查找和替换此数据的替代方法?我在这里看到了类似的替换常量的选项,但是 none 它们对我有用或者是我可以使用的。我无法在日期列旁边添加新列,因为数据是直接从 SAP 粘贴的。
我手上的代码:
' Change Release Date to date format
Sheets("Article List").Select
Last = LastRow(ActiveSheet)
range("K4:K" & Last).Select
Selection.Replace _
What:=".", _
Replacement:="/", _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False, _
SearchFormat:=False, _
ReplaceFormat:=False
Selection.NumberFormat = "dd/mm/yyyy"
使用 vlookup 将格式化后的数据复制到我的主数据 sheet 中,它应该保持与使用 dd/mm/yyyy.
自定义格式设置的格式相同的格式
当手动处理数据时,我能够使用查找和替换给出正确的结果 - 它使用我上面的相同代码,通过在故障排除期间尝试记录宏来确认。
假设你的 LastRow()
returns 长,试试这个:
Private Function MDY2DMY(oRng As Range) As Date
Dim oMDY As Variant, dDMY As Date
oMDY = Split(Trim(oRng.Value), ".")
dDMY = DateSerial(oMDY(2), oMDY(0), oMDY(1))
MDY2DMY = dDMY
End Function
Sub ChangeMDY2DMY()
Dim oWS As Worksheet, Last As Long, oRng As Range, dDMY As Date
Set oWS = ActiveSheet
Last = LastRow(oWS)
Set oRng = oWS.Range("K4")
Do
If oRng.NumberFormat <> "dd/mm/yyyy" Then
dDMY = MDY2DMY(oRng) ' Get the date value from M.D.Y. format
oRng.NumberFormat = "dd/mm/yyyy" ' Change the number format
oRng.Value = dDMY ' Change the value
End If
Set oRng = oRng.Offset(1) ' Move down 1 row
Loop Until oRng.Row > Last
Set oRng = Nothing
Set oWS = Nothing
End Sub
已添加代码以防止单元格上出现另一个 运行。
我花了大约两个小时在整个 google 中搜索这个问题的答案,以及唯一的 VBA 函数,我将日期转换为正斜杠 dd/mm/yyyy 格式,是 TextToColumns 函数。
Sub CleanDate()
Dim LastRow As Long
Sheets("Article List").Select
LastRow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows,
LookIn:=xlValues, _
SearchDirection:=xlPrevious).Row
Range("K4", Cells(LastRow, "K")).Select
Range("K4:K" & LastRow).TextToColumns Destination:=Range("K4"),
DataType:=xlDelimited, _
FieldInfo:=Array(1, xlDMYFormat)
End Sub
有效行:
Selection.Replace _
What: = ".", _
Replacement: = "/",
....
执行了错误的更改操作。它仅在起始日期大于 12 时有效。在这种情况下,代码完美地执行 Replace。
为了避免这种情况,解决方案是在文本模式下设置单元格格式并执行 For Each 和 替换.
此代码完美运行。
Private Sub f_MyFunction()
'Obligatory so that it does not travel the entire column
Range("K4", "K" & Range("K4").End(xlDown).Row).Select
'Obligatory so that Excel does not swap ddmm-> mmdd
Selection.NumberFormat = "@"
'This method does not generate swap errors
For Each obj_cell In Selection.Cells
With obj_cell
If IsNull(obj_cell) Then Exit Sub
obj_cell.Value = Replace(.Text, ".", "/")
End With
Next
'And now change the format to DATE
Selection.NumberFormat = "mm/dd/yyyy;@"
End Sub
我继续调查并找到了另一种立即进行更改的方法,尽管它以 dd/mm/yyyy 的格式保留。如果要将“/”更改为“-”,则必须使用 For Each 方法和 替换我之前回答中提到的
此其他方法使用 Range.TextToColumns 和 FieldInfo 参数:= Array (0, xlDMYFormat)
很厉害,不过就一行而已。此外,单元格不仅按日期格式化,还允许任何字符作为日期分隔符。
'From K4 to last row
Range("K4", "K" & Range("K4").End(xlDown).Row).TextToColumns FieldInfo:=Array(0, xlDMYFormat)
'1.2.2019 -> 01/02/2019
'1_2_2019 -> 01/02/2019
'1*2*2019 -> 01/02/2019...
'To do it over only one cell
Range("A1").TextToColumns FieldInfo:=Array(0, xlDMYFormat)
我正在尝试将日期格式为 dd.mm.yyyy 的 SAP 数据转换为 Excel 日期格式 dd/mm/yyyy,以便我可以将其从最旧到最新排序。
似乎查找和替换代码正在创建自己的数字格式,使得任何格式应用程序在其使用前后都毫无意义,因为它会尽可能地将任何日期转换为美国格式:
01.02.2015 -> 02/01/2015 instead of 01/02/2015
dd.mm.yyyy -> mm/dd/yyyy instead of dd/mm/yyyy
无法改回格式,因为只有部分数据受到影响,因为某些日期不符合此范围,而是保持静态格式。
是否有解决此问题的方法或查找和替换此数据的替代方法?我在这里看到了类似的替换常量的选项,但是 none 它们对我有用或者是我可以使用的。我无法在日期列旁边添加新列,因为数据是直接从 SAP 粘贴的。
我手上的代码:
' Change Release Date to date format
Sheets("Article List").Select
Last = LastRow(ActiveSheet)
range("K4:K" & Last).Select
Selection.Replace _
What:=".", _
Replacement:="/", _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False, _
SearchFormat:=False, _
ReplaceFormat:=False
Selection.NumberFormat = "dd/mm/yyyy"
使用 vlookup 将格式化后的数据复制到我的主数据 sheet 中,它应该保持与使用 dd/mm/yyyy.
自定义格式设置的格式相同的格式当手动处理数据时,我能够使用查找和替换给出正确的结果 - 它使用我上面的相同代码,通过在故障排除期间尝试记录宏来确认。
假设你的 LastRow()
returns 长,试试这个:
Private Function MDY2DMY(oRng As Range) As Date
Dim oMDY As Variant, dDMY As Date
oMDY = Split(Trim(oRng.Value), ".")
dDMY = DateSerial(oMDY(2), oMDY(0), oMDY(1))
MDY2DMY = dDMY
End Function
Sub ChangeMDY2DMY()
Dim oWS As Worksheet, Last As Long, oRng As Range, dDMY As Date
Set oWS = ActiveSheet
Last = LastRow(oWS)
Set oRng = oWS.Range("K4")
Do
If oRng.NumberFormat <> "dd/mm/yyyy" Then
dDMY = MDY2DMY(oRng) ' Get the date value from M.D.Y. format
oRng.NumberFormat = "dd/mm/yyyy" ' Change the number format
oRng.Value = dDMY ' Change the value
End If
Set oRng = oRng.Offset(1) ' Move down 1 row
Loop Until oRng.Row > Last
Set oRng = Nothing
Set oWS = Nothing
End Sub
已添加代码以防止单元格上出现另一个 运行。
我花了大约两个小时在整个 google 中搜索这个问题的答案,以及唯一的 VBA 函数,我将日期转换为正斜杠 dd/mm/yyyy 格式,是 TextToColumns 函数。
Sub CleanDate()
Dim LastRow As Long
Sheets("Article List").Select
LastRow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows,
LookIn:=xlValues, _
SearchDirection:=xlPrevious).Row
Range("K4", Cells(LastRow, "K")).Select
Range("K4:K" & LastRow).TextToColumns Destination:=Range("K4"),
DataType:=xlDelimited, _
FieldInfo:=Array(1, xlDMYFormat)
End Sub
有效行:
Selection.Replace _
What: = ".", _
Replacement: = "/",
....
执行了错误的更改操作。它仅在起始日期大于 12 时有效。在这种情况下,代码完美地执行 Replace。
为了避免这种情况,解决方案是在文本模式下设置单元格格式并执行 For Each 和 替换.
此代码完美运行。
Private Sub f_MyFunction()
'Obligatory so that it does not travel the entire column
Range("K4", "K" & Range("K4").End(xlDown).Row).Select
'Obligatory so that Excel does not swap ddmm-> mmdd
Selection.NumberFormat = "@"
'This method does not generate swap errors
For Each obj_cell In Selection.Cells
With obj_cell
If IsNull(obj_cell) Then Exit Sub
obj_cell.Value = Replace(.Text, ".", "/")
End With
Next
'And now change the format to DATE
Selection.NumberFormat = "mm/dd/yyyy;@"
End Sub
我继续调查并找到了另一种立即进行更改的方法,尽管它以 dd/mm/yyyy 的格式保留。如果要将“/”更改为“-”,则必须使用 For Each 方法和 替换我之前回答中提到的
此其他方法使用 Range.TextToColumns 和 FieldInfo 参数:= Array (0, xlDMYFormat)
很厉害,不过就一行而已。此外,单元格不仅按日期格式化,还允许任何字符作为日期分隔符。
'From K4 to last row
Range("K4", "K" & Range("K4").End(xlDown).Row).TextToColumns FieldInfo:=Array(0, xlDMYFormat)
'1.2.2019 -> 01/02/2019
'1_2_2019 -> 01/02/2019
'1*2*2019 -> 01/02/2019...
'To do it over only one cell
Range("A1").TextToColumns FieldInfo:=Array(0, xlDMYFormat)