我有一个VBA脚本,它打开了一堆CSV文件,并将它们编译成一个摘要报告。
然而,我有一个问题,它读取英国风格的日期(dd/mm/yyyy),然后解释为美国风格的日期,当它制作副本,然后再显示为英式日期!
因此,原来的7月4日变成了4月7日的摘要表-通过更改单元格格式,以显示月份名称。
这很奇怪,因为当您在Excel中打开CSV文件时,它正确地解释了英国样式日期。
复制是使用如下代码生成的
SummarySheet.Cells(Y,X).value = CSVSheet.Cells(W,Z).value这里发生什么事情?
发布于 2015-11-12 12:37:50
您没有发布关于如何打开CSV文件的代码--这是关键区域。在将日期输入工作表之前,需要正确地分析日期。下面的代码将选择并打开一个在单个列中包含UK样式日期的文件,并正确地解析它们。您将需要使其适应您的特定需求。
FieldInfo参数是做什么工作的。Excel工作表的格式为“用于显示”,因此可以看到明确的日期。
Option Explicit
Sub OpenUKcsv()
Dim sFile As String
Dim WB As Workbook
Dim WS As Worksheet
sFile = Application.GetOpenFilename()
Workbooks.OpenText Filename:=sFile, DataType:=xlDelimited, comma:=True, other:=False, _
fieldinfo:=Array(1, 4)
Set WB = ActiveWorkbook
Set WS = ActiveSheet
With WS.Columns(1)
.NumberFormat = "dd-mmm-yyyy"
.EntireColumn.AutoFit
End With
End Sub发布于 2015-11-12 11:21:43
您可以使用.Text (在Excel单元格中显示的文本)或.Value2 (没有格式设置的值)代替.Value (带格式的值)。
但我强烈建议您将您使用的单元格的格式设置为您在使用.NumberFormat = "mm/dd/yyyy"时所期望的结果。
或者您可以使用CDate函数:
SummarySheet.Cells(Y,X).value = CDate(CSVSheet.Cells(W,Z).value)或者在DateSerial中使用UDF:
Sub test_CMaster()
MsgBox ParseDate("4/7/15") & vbCrLf & CDate("4/7/15")
End Sub
Function ParseDate(ByVal DateInCell As String, Optional Separator As String = "/") As Date
Dim D() As String
D = Split(DateInCell, Separator)
ParseDate = DateSerial(D(UBound(D)), D(1), D(0))
End Function发布于 2015-11-12 12:39:18
尝试使用Workbooks.OpenText()方法,并将Local标志设置为True
Set csvWB = Workbooks.OpenText(Filename:=myCSVfile, Local:=True)下面是有关此方法的MSDN文章,用于Local设置:
如果机器的区域设置应用于分隔符、数字和数据格式设置,则指定True。
https://stackoverflow.com/questions/33669979
复制相似问题