【问题标题】:Override reformatting of cell excel VBA覆盖单元格excel VBA的重新格式化
【发布时间】:2019-01-14 15:41:16
【问题描述】:

我有大量带有“dd-mm-yyyy”形式的日期列的 Excel 工作表。我需要按此日期列中的日期对行进行排序。如果我手动选择该列并将所有“-”替换为“/”,则 Excel 会自动将日期单元格从“常规”格式化为“日期”数字格式,以便对它们进行轻松排序。具体来说就是“*dd/mm/yyyy”,因为我在澳大利亚。

但是,当我录制宏时,它看起来像这样:

Range("D13:D134").Replace What:="-", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

当我运行宏时:

  • 如果日期的第 12 天或更少,则翻转日期和月份字段并将数字格式更改为日期

  • 否则将数字格式保留为常规。

之前: 之后: 我尝试将 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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    它对你有用吗?

    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
    

    【讨论】:

      【解决方案2】:

      此操作不需要 VBA!您可以使用 Excel 功能分两步修复日期。

      首先你需要对数据进行分隔:

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

      其次,使用分隔数据创建正确的 Excel 日期 您可以使用以下公式从分隔数据中获取日期: =DATE( [cell with year], [cell with month], [cell with day])

      【讨论】:

      • 谢谢,但我想使用 VBA 来自动化这个过程,因为我有 3000 张纸。我仍然明白如何使用这个答案让我到达那里,但其他人完美地解决了它。
      【解决方案3】:

      日期问题

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        相关资源
        最近更新 更多