重写单元格Excel VBA的格式

时间:2019-01-12 06:13:31

标签: excel vba

我有大量的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天,则会翻转日期和月份字段并将数字格式更改为日期

  • 否则,它将数字格式保留为“常规”。

之前:BEFORE 之后:AFTER 我尝试将ReplaceFormat设置为:

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

3 个答案:

答案 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功能分两步确定日期。

首先,您需要分隔数据:

  1. 突出显示您的日期
  2. 转到“数据”标签->单击“数据工具”部分中的“文本到列”
  3. 在弹出窗口中选择“定界”,然后单击“下一步”
  4. 在“分隔符”下,取消选择“标签”,然后选择“其他”。在框中输入-,然后单击“下一步”
  5. 在数据旁边选择一个目标单元格,以免覆盖它。点击完成

第二,使用定界数据创建正确的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