使用VBA将日期列格式化为文本-问题

时间:2019-04-18 23:03:06

标签: excel vba

问题:我的excel文件中显示的日期不是输入到每个单元格中的实际日期。例如,我可能会直观地看到04/18/2019,但是当我单击该单元格时,它显示04/18/2019 06:48:00 PM。当我运行用于将xlsx文件转换为txt的宏时,这成为一个问题。生成的txt文件将在日期字段中显示04/19/2019 06:48:00 PM,而不是我想要的2019/4/18。

我正在使用的当前修复方法是在日期列旁边插入列,复制日期列并将值粘贴到新插入的列中,然后删除插入的列。这是通过记录宏来完成的(如果您不知道,我是菜鸟)。

最基本的解决方案在生成我需要的输出时效果确实很好。唯一的问题是:如果日期列中有空白,则会粘贴到01/01/1900中。在我的工作中,日期列中的空白非常普遍,因此这是一个主要问题。

我尝试在插入/粘贴值/删除代码后添加此If in:

“在A和C列中修复日期格式”

'

Columns("B").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("E").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("B1").Select
ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""mm"/"dd"/"yyyy"")"
Range("E1").Select
ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""mm"/"dd"/"yyyy"")"
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B" & EndRow)
Range("E1").Select
Selection.AutoFill Destination:=Range("E1:E" & EndRow)
Range("B1:B" & EndRow).Select
Selection.Copy
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range("E1:E" & EndRow).Select
Selection.Copy
Range("D1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Columns("E").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Columns("B").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft

If Range("A1:A") = "01/01/1900" Then ClearContents

'

但是,我收到此错误“编译错误:未定义子函数或函数”,If语句中的Range字样突出显示。我不明白为什么它不能识别范围,因为仅使用了几行就没有问题。我必须做错了事,但我迷路了。有什么想法吗?

PS-If只是解决空白的一种手段,但是我敢肯定,有一种更好的方法可以将这些日期列转换为文本或所需的日期格式。如果您对实现相同结果的更简单方法有任何建议,我将不知所措。

谢谢大家,我真的很感激!

1 个答案:

答案 0 :(得分:0)

Range("A1:A")
  1. 这是{em>'从A1到A列中最后一个使用的单元格的所有内容的引用,不是VBA样式。要么引用整列(例如Range("A:A")),要么使用EndRow变量(例如Range("A1:A" & EndRow))修改结尾行。

  2. 在TEXT公式的VBA应用程序中使用的格式 mask 似乎是错误的。在带引号的字符串中使用双引号时,每次使用双引号两次。 TEXT公式返回一个字符串(即文本);您无需尝试任何进一步的转换。

    ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""mm/dd/yyyy"")"
    
  3. xlR1C1和相对样式的xlA​​1公式均一次应用于所有单元格。 B和E列中目标单元的并集进一步加快了公式插入的速度。

    Range("B1:B" & EndRow & ",E1:E" & EndRow).formular1c1 = "=TEXT(RC[-1],""mm/dd/yyyy"")"
    
  4. 您不能直接将多个单元格范围与单个值进行比较。可以遍历单元格,也可以使用Range.Find,工作表的MATCH函数或自动筛选器之类的广泛比较将匹配的单元格显示为xlCellTypeVisible。

    dim m as variant
    
    m = application.match("01/01/1900", ActiveSheet.Range("A:A"), 0)
    
    do while not iserror(m)
        ActiveSheet.Cells(m, "A").clearcontents
        m = application.match("01/01/1900", ActiveSheet.Range("A:A"), 0)
    loop
    
  5. 如果您已经读了那么多内容,那么从日期时间中删除日期的最简单方法是“文本到列”。只需丢弃第10个字符后的所有字符(例如,来自 mm / dd / yyyy hh:mm amp / pm mm / dd / yyyy )。

    With ActiveSheet.Columns("A")
        .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, _
                       FieldInfo:=Array(Array(0, 1), Array(10, 9))
        .NumberFormat = "mm/dd/yyyy"
    End With
    
  6. 我谨建议您花一些时间来调查How to avoid using Select in Excel VBA。如果您继续开发VBA以提高Office应用程序的效率,则应尽快开始使用推荐的方法。