录制的宏破坏了导出的 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" 在下一列或最后一列中 !!
任何人都可以帮助我摆脱这种奇怪的情况吗?
欢迎任何解决方案..
这是 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
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" 在下一列或最后一列中 !!
任何人都可以帮助我摆脱这种奇怪的情况吗?
欢迎任何解决方案..
这是 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