将日期一致地转换为 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

我从这个页面得到了灵感 - https://social.msdn.microsoft.com/Forums/en-US/e3522eac-13b1-476c-8766-d70794131cc8/strange-date-conversion-while-using-vba-replace-function?forum=isvvba

有效行:

 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.TextToColumnsFieldInfo 参数:= 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)