【问题标题】:Find & Replace functionality automatically formats cells to dates查找和替换功能自动将单元格格式化为日期
【发布时间】:2018-08-01 02:51:25
【问题描述】:

通常在将 PDF 转换为 excel 文档时,某些值会失真且不准确。准确地说,我的“日期”列中的某些单元格在语法上不包含正确的月份。例如,不是“XX Jun”,而是“XX Iun”,其中“XX”代表一天(数字)。

我已经使用了查找和替换功能,它几乎可以完美运行,唯一需要注意的是,替换后,我的单元格被格式化为我希望它们保持不变的日期文本。

因此,如果可能的话,我希望解决的问题是使用查找和替换功能,而不是通过修改我的 VBA 代码将我的单元格格式化为替换后的日期。

Sub Macro2()

Dim rng As Range

Set rng = Application.InputBox("Select Date Column", "Obtain Range", Type:=8)

rng.Replace What:="ian", Replacement:="Jan"
rng.Replace What:="lan", Replacement:="Jan"
rng.Replace What:="iun", Replacement:="Jun"
rng.Replace What:="lun", Replacement:="Jun"

End Sub

为清楚起见,一些屏幕截图显示了我执行代码时发生的情况。

从这里:

到这里:

【问题讨论】:

  • rng.NumberFormat = "@" 在替换任何东西之前
  • @TimWilliams 我认为这与手动将我的日期列格式化为“文本”然后使用查找和替换工具是一样的。如果是这样,我已经尝试过了。
  • 为替换添加前缀'。例如rng.Replace What:="ian", Replacement:="'Jan"
  • @Jeeped 与以月份开头的单元格完美配合,然后是日期(Month Day)。倒置的单元格则不然。

标签: vba excel


【解决方案1】:

这对我有用:

Sub Macro2()

    Dim rng As Range, v, c

    Set rng = Application.InputBox("Select Date Column", "Obtain Range", Type:=8)

    'only look at the used range...
    Set rng = Application.Intersect(rng, rng.Worksheet.UsedRange)
    If rng Is Nothing Then
        MsgBox "no cells to fix!"
        Exit Sub
    End If

    With rng
        .NumberFormat = "@"
        For Each c In .Cells
            v = c.Value
            If Len(v) > 0 Then '<<< ignore empty cells
                v = Replace(v, "ian", "Jan")
                v = Replace(v, "Ian", "Jan")
                v = Replace(v, "iun", "Jun")
                v = Replace(v, "Iun", "Jun")
                c.Value = v
            End If
        Next c
   End With

End Sub

【讨论】:

  • 真的很困惑如何通过简单地使用另外 2 个变量来欺骗 excel 而不格式化单元格......谢谢!
  • 以什么方式崩溃?
  • Excel 变得反应迟钝,我必须结束 excel 任务
  • 如果您选择了很大的范围(例如整列),可能会发生这种情况
  • 没关系,我刚刚又试了一次,它没有崩溃。但是,我必须允许它大约。在它再次响应之前 20 秒。是因为代码应用于列中的每个单元格吗?如果是这样,将其限制在定义的行数会更好吗?
【解决方案2】:

与其调用 Range.Replace,不如保留原始列,并使用另一列调用用户定义函数宏来“修复”错误的 OCR 值。该函数将接受一个参数,即“错误”日期的范围,并返回一个字符串。像这样的:

Public Function FixDate(ByVal s As String) As String
  s = Replace$(s, "ian", "Jan")
  [...other replacements...]
  FixDate = s
End Function

然后这样称呼它: =FIXDATE(A2)

这样做的好处是将原始值保留在 A 列以供 QA/QC 使用,并且不会自动转换为日期值。

您可以使用正则表达式库(需要参考)来简化各种替换,而不是使用内置的 VBA Replace() 函数,尽管这可能会导致性能下降。

【讨论】:

  • 除了不知道这段代码究竟做了什么也不知道如何使用它(我是初学者),我担心它会扫描我工作表中的所有“ian”。
猜你喜欢
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 2017-10-02
  • 2013-06-02
  • 2018-06-01
  • 2020-02-21
  • 1970-01-01
  • 2018-09-28
相关资源
最近更新 更多