通常,将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
为清楚起见,我执行代码时会发生一些屏幕截图。
从此:
为此:
答案 0 :(得分:0)
而不是调用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列中进行质量检查/质量检查的优势,并且不会自动转换为日期值。
您可以使用正则表达式库(需要引用)来简化各种替换,而不是使用内置的VBA Replace()
函数,尽管这可能会导致性能下降。
答案 1 :(得分:0)
这对我有用:
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