我有大量的Excel工作表,其日期列的格式为“ dd-mm-yyyy”。我需要按此日期列中的日期对行进行排序。如果我手动选择该列并将所有“-”替换为“ /”,则Excel会自动将日期单元格从“常规”格式化为“日期”数字格式,以便可以轻松对其进行排序。具体来说,因为我在澳大利亚,所以它是“ * dd / mm / yyyy”。
但是,当我录制宏时,它看起来像这样:
Range("D13:D134").Replace What:="-", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
当我运行宏时:
如果日期的日期不超过12天,则会翻转日期和月份字段并将数字格式更改为日期
否则,它将数字格式保留为“常规”。
Worksheets("Worksheet").Range("A1").NumberFormat = "d/mm/yyyy"
Application.ReplaceFormat.NumberFormat = "d/mm/yyyy"
Range("D13:D134").Replace What:="-", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True
现在所有单元格都采用日期的数字格式,但仍不能升序排序(仅提供A-Z选项),并且在某些单元格上交换日期和月份字段仍然存在相同的问题。
我什至尝试将X附加到单元格的开头,这样在替换期间它仍将是常规格式。然后删除X。结果相同。
For x = 13 To 134
Cells(x, 4) = "X" & Cells(x, 4)
Next x
Range("D13:D134").Replace What:="-", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
For x = 13 To 134
Range("D" + CStr(x)) = Right(Range("D" + CStr(x)), Len(Range("D" + CStr(x))) - 1)
Next x
答案 0 :(得分:2)
它对您有用吗?
On Error Resume Next
For x = 13 To 134
If Range("D" & x) <> "" Then
Range("D" & x) = CDate(Range("D" & x).Value)
End If
Next x
On Error GoTo 0
答案 1 :(得分:0)
不需要VBA!您可以使用excel功能分两步确定日期。
首先,您需要分隔数据:
-
,然后单击“下一步” 第二,使用定界数据创建正确的Excel日期
您可以使用以下公式从定界数据中获取日期:
=DATE( [cell with year], [cell with month], [cell with day])
答案 2 :(得分:0)
Sub DateProblem()
Const cStrSheet As String = "Sheet1"
Const cStrRange As String = "D13:D134"
Const cStrCell As String = "E13"
Dim vntS As Variant
Dim vntT As Variant
Dim i As Long
vntS = Worksheets(cStrSheet).Range(cStrRange)
ReDim vntT(1 To UBound(vntS), 1 To 1) As Date
For i = 1 To UBound(vntS)
vntT(i, 1) = DateSerial( _
Right(vntS(i, 1), 4), _
Mid(vntS(i, 1), 4, 2), _
Left(vntS(i, 1), 2))
Next
With Worksheets(cStrSheet).Range(cStrCell)
.Resize(UBound(vntT), UBound(vntT, 2)) = vntT
End With
End Sub