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

时间:2015-10-03 10:08:52

标签: excel vba csv export

VBA从谷歌财经下载报价并输入“数据”表。日期和时间在1列中,并通过计算得出(第1行除外)。

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

同时,所有这些步骤都由excel的Macro Recorder记录。

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

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

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

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

欢迎任何解决方案..

file for reference

1 个答案:

答案 0 :(得分:0)

这是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使用en_US语言环境运行,TextToColumns没有提供更改此方法的方法。因此,en_US区域设置中的14-09-2015 13:00:00看起来像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