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”!!
任何人都可以帮助我摆脱这种奇怪的情况吗?
欢迎任何解决方案..
答案 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