录制的宏破坏了导出的 csv 中的时间格式,但在录制时导出的 csv 具有所需的时间格式

Recorded Macro spoils time format in exported csv BUT csv exported while recording has desired time format

VBA 从 google finance 下载报价并放入 "Data" sheet。日期和时间在 1 列中,并通过计算得出(第 1 行除外)。

下一步是对数据进行操作清理,并将其转化为可消费格式。我处理日期时间列并将它们粘贴为值并将此 sheet 复制到新工作簿中并将新工作簿的 sheet 另存为 CSV。我在提到的位置得到了我完美的 csv。

同时,所有这些步骤都被 excel 的宏记录器记录下来。

当我 运行 excel 我得到一个 CSV...但是...该 CSV 最终破坏了日期和时间格式。由于未知原因 AM/PM 被添加到最后一列。

请注意,我的系统时间设置是美国区域设置,我已将其修改为将短日期显示为 dd-mm-yy,将短时间显示为 HH:mm:ss。

你看我的系统设置里没有"tt"。然而,excel 以某种方式在手动保存时给出了良好的结果,但是当 运行 记录相同的 vba 它继续将日期格式更改为 m-dd-yy 并将时间格式更改为 hh:mm:ss 和 "tt" 在下一列或最后一列中 !!

任何人都可以帮助我摆脱这种奇怪的情况吗?

欢迎任何解决方案..

file for reference

这是 VBA 中 TextToColumns 的一个众所周知的问题。

假设我们有:

14-09-2015 11:00:00
14-09-2015 12:00:00
14-09-2015 13:00:00
14-09-2015 14:00:00

在第 A 列中,它不是文本而是带时间的格式化日期值。

并且我们有不使用 AM/PM 时间的区域设置。

现在我们录制一个宏,同时使用Data - Text to Columns将日期与时间分开。我们在 A:C:

列中进入电子表格
14-09-2015 11:00:00 14.09.2015  11:00:00
14-09-2015 12:00:00 14.09.2015  12:00:00
14-09-2015 13:00:00 14.09.2015  13:00:00
14-09-2015 14:00:00 14.09.2015  14:00:00

B 列中的日期格式是我们Excel 的默认日期格式。在我的例子中是德国日期格式。

并且我们得到了如下的宏记录:

Sub Makro1()
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
End Sub

如果我们运行这个宏,我们得到:

14-09-2015 11:00:00 14.09.2015  11:00:00    AM
14-09-2015 12:00:00 14.09.2015  12:00:00    PM
14-09-2015 13:00:00 14.09.2015  01:00:00    PM
14-09-2015 14:00:00 14.09.2015  02:00:00    PM

为什么?

VBA 运行ning 曾经与 en_US 区域设置一起使用,TextToColumns 不提供更改此设置的方法。所以 14-09-2015 13:00:00 在 en_US 语言环境中看起来像 09/14/2015 01:00:00 PM。如您所见,一共有三列 AM/PM.

据我所知。没有使用 TextToColumns 和 VBA 来正确分割日期和时间而不使用 AM/PM.

的解决方案

所以我们需要使用另一种方法。例如:

Sub Macro2()

 With ActiveSheet

  lLastRow = .Columns("A:A").Cells(.Rows.Count, 1).End(xlUp).Row

  ReDim arrDate(1 To lLastRow) As Long
  ReDim arrTime(1 To lLastRow) As Double
  arrDateTimes = .Range("A1:A" & lLastRow).Value
  For lRow = LBound(arrDateTimes) To UBound(arrDateTimes)
   arrDate(lRow) = Int(arrDateTimes(lRow, 1))
   arrTime(lRow) = arrDateTimes(lRow, 1) - arrDate(lRow)
  Next
  .Range("B1:B" & lLastRow).Value = WorksheetFunction.Transpose(arrDate)
  .Range("C1:C" & lLastRow).Value = WorksheetFunction.Transpose(arrTime)
  .Range("B1:B" & lLastRow).NumberFormat = "dd-mm-yy"
  .Range("C1:C" & lLastRow).NumberFormat = "hh:mm:ss"

 End With

End Sub