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

Excel 录制的宏破坏了导出csv中的时间格式,但录制时导出的csv具有所需的时间格式,excel,vba,csv,export,Excel,Vba,Csv,Export,VBA从google finance下载报价,并将其放入数据表中。日期和时间在1列中,通过计算得出,但第1行除外 下一步是对数据进行操作,清理数据并将其转换为可消费格式。我处理日期-时间列并将其粘贴为值,将此工作表复制到新工作簿中,并将新工作簿的工作表另存为CSV。我在提到的地点得到了完美的csv 同时,所有这些步骤都被excel的宏记录器记录下来 当我运行excel时,我得到一个CSV。。。但是该CSV最终会破坏日期和时间格式。由于未知原因,AM/PM被添加到最后一列 请注意,我的系统时间设置

VBA从google finance下载报价,并将其放入数据表中。日期和时间在1列中,通过计算得出,但第1行除外

下一步是对数据进行操作,清理数据并将其转换为可消费格式。我处理日期-时间列并将其粘贴为值,将此工作表复制到新工作簿中,并将新工作簿的工作表另存为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中,该列不是文本,而是带时间的格式化日期值

我们有区域设置,不使用上午/下午时间

现在,我们记录一个宏,同时使用数据-文本到列分割日期和时间。我们在电子表格中的A:C列:

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始终使用en_US语言环境运行,TextToColumns不提供更改此设置的方法。因此,en_US地区的2015年9月14日13:00:00看起来像2015年9月14日01:00:00。如您所见,有三列和AM/PM

据我所知。在VBA中使用TextToColumns正确分割日期和时间以及不使用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

如果使用记事本打开.csv文件,您会看到什么?另外,请更新问题以包含相关代码手动完成csv分别以dd-MM-yy-HH:MM:ss日期和时间格式以正确的方式提供。VBA done csv始终将下一列中的AM/PM添加到时间,并更改日期和时间格式。只是运行了debug->stepinto->,发现TextToColumn在vba模式下不遵守给定的数字格式。不知道为什么。Paul-我已将该文件作为链接附上,我是否仍需要在问题正文中提供完整的vba代码?谢谢你们俩,谢谢你们的回复。我几分钟后去检查一下。如果没有太多要求,请您解释代码实际上在做什么。这将有助于将来在不同的情况下配置它。抱歉,但这不是一个现成的解决方案-就像我的答案永远不会这样。这是一种方法。它表明,录制宏只是使用宏的第一步。您需要将VBA作为编程语言来处理。这不能在这里发布。使用VBA编辑器中的教程和/或帮助功能。我的变量名应该自我解释。在这种情况下,您只需将录制的宏中的TextToColumn部分替换为my宏的内容即可。当然,你必须使A、B和C列适应你的G、H和I。非常感谢阿克塞尔·里克特!它工作得很好。只是更改了列,并删除了一个额外的列在最后的csv出来了正确的格式。
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