Excel VBA PasteSpecial 添加不一致
Excel VBA PasteSpecial Add is Inconsistent
我有一个工作簿 (.xls),它是从一个专有软件生成的,其中包含 Excel 只能识别为字符串的日期 (dd/mm/yy hh:mm:ss)。
大约有 18000 行和 10 列。我可以 Excel 通过复制空白单元格、选择相关范围然后执行 PasteSpecial -Values -Add 来手动转换它们。或者,我可以在每一列上使用“文本到列”来触发更改为正确的 Excel 日期格式。
我想通过 VBA 子例程(下面的示例代码)执行此操作。
Range("E1").Select 'blank cell
Selection.Copy
Range("A8").Select 'top left of range
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select 'to bottom right
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
但是,这似乎只影响了大约 35% 的选定单元格。
有趣的是,当我尝试使用替代 VBA 代码逐列执行“文本到列”时也是如此。
我被卡住了:你知道为什么会这样吗,还有其他选择吗?
csv 文件中的日期格式很奇怪。将数据转换为文本后,一些日期比其他日期长一个字符,我找不到它是哪个字符。肯定是非打印字符!
此过程基于您发布的文件。该过程从 D 列循环到 H 列,更正日期时间值,然后将它们作为值复制到原始列。
在测试之后添加您可能拥有的其他日期时间列,如果这对您来说没问题。
Sub FormatCSVDates()
Dim tmpRng As Range
Dim tmpCol As Integer: tmpCol = Range("AA8").Column
Dim srcRng As Range
Dim startCol As Integer: startCol = 4 ' column D
Dim endCol As Integer: endCol = 8 ' column H
Dim col As Integer
For col = startCol To endCol
' clear helper column
Range("AA8").CurrentRegion.ClearContents
' column range to format(source range)
Set srcRng = Range(Cells(8, col), Cells(8, col).End(xlDown))
' temporary range
Set tmpRng = srcRng.Offset(0, tmpCol - col)
' Insert formula in temporary range
tmpRng.FormulaR1C1 = "=SUM(DATEVALUE(RC[-" & tmpCol - col & "]),TIMEVALUE(RC[-" & tmpCol - col & "]))"
' copy formula to values
tmpRng.Copy
tmpRng.PasteSpecial (xlPasteValues)
' copy from temporary range to source range
tmpRng.Copy srcRng
' format sorce range
srcRng.NumberFormat = "dd/mm/yy hh:mm:ss"
Next col
Application.CutCopyMode = False
' clear helper column
Range("AA8").CurrentRegion.ClearContents
End Sub
我有一个工作簿 (.xls),它是从一个专有软件生成的,其中包含 Excel 只能识别为字符串的日期 (dd/mm/yy hh:mm:ss)。
大约有 18000 行和 10 列。我可以 Excel 通过复制空白单元格、选择相关范围然后执行 PasteSpecial -Values -Add 来手动转换它们。或者,我可以在每一列上使用“文本到列”来触发更改为正确的 Excel 日期格式。
我想通过 VBA 子例程(下面的示例代码)执行此操作。
Range("E1").Select 'blank cell
Selection.Copy
Range("A8").Select 'top left of range
Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select 'to bottom right
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
但是,这似乎只影响了大约 35% 的选定单元格。 有趣的是,当我尝试使用替代 VBA 代码逐列执行“文本到列”时也是如此。
我被卡住了:你知道为什么会这样吗,还有其他选择吗?
csv 文件中的日期格式很奇怪。将数据转换为文本后,一些日期比其他日期长一个字符,我找不到它是哪个字符。肯定是非打印字符!
此过程基于您发布的文件。该过程从 D 列循环到 H 列,更正日期时间值,然后将它们作为值复制到原始列。
在测试之后添加您可能拥有的其他日期时间列,如果这对您来说没问题。
Sub FormatCSVDates()
Dim tmpRng As Range
Dim tmpCol As Integer: tmpCol = Range("AA8").Column
Dim srcRng As Range
Dim startCol As Integer: startCol = 4 ' column D
Dim endCol As Integer: endCol = 8 ' column H
Dim col As Integer
For col = startCol To endCol
' clear helper column
Range("AA8").CurrentRegion.ClearContents
' column range to format(source range)
Set srcRng = Range(Cells(8, col), Cells(8, col).End(xlDown))
' temporary range
Set tmpRng = srcRng.Offset(0, tmpCol - col)
' Insert formula in temporary range
tmpRng.FormulaR1C1 = "=SUM(DATEVALUE(RC[-" & tmpCol - col & "]),TIMEVALUE(RC[-" & tmpCol - col & "]))"
' copy formula to values
tmpRng.Copy
tmpRng.PasteSpecial (xlPasteValues)
' copy from temporary range to source range
tmpRng.Copy srcRng
' format sorce range
srcRng.NumberFormat = "dd/mm/yy hh:mm:ss"
Next col
Application.CutCopyMode = False
' clear helper column
Range("AA8").CurrentRegion.ClearContents
End Sub