混淆dd / mm / yyyy和mm / dd / yyyy

我有一个VBA脚本,打开了一堆CSV文件,并将它们编译成一个总结报告。

然而,我在英国风格date(dd / mm / yyyy)中有一个问题,然后在复制时将它们解释为美式风格的date,然后再显示为英式风格的date!

因此,7月4日在原始表中的4月7日汇总表 – 通过更改单元格格式来显示月份名称validation。

这很奇怪,因为当您在Excel中打开CSV文件时,它正确地解释了英国风格的date。

复制是使用这样的代码

SummarySheet.Cells(Y,X).value = CSVSheet.Cells(W,Z).value 

这里发生了什么?

您没有发布关于如何打开您的CSV文件的代码 – 这是关键领域。 在input工作表之前,date需要正确parsing。 下面的代码将select,然后在单个列中打开英式风格date的文件,并正确parsing它们。 您将需要适应您的特定要求。

FieldInfo参数是什么工作。 Excel工作表的格式是“显示”,所以你可以看到一个明确的date。

 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 

尝试使用Workbooks.OpenText()方法,并将Local标志设置为True

 Set csvWB = Workbooks.OpenText(Filename:=myCSVfile, Local:=True) 

这里是关于这个方法的MSDN文章 ,说Local设置:

如果机器的地区设置应用于分隔符,数字和数据格式,请指定True

您可以使用.Text (文本显示在Excel单元格)或.Value2 (没有格式的值)而不是.Value (格式化的值)。

但是我强烈build议你用最后用.NumberFormat = "mm/dd/yyyy"设置你使用的单元格的格式,

或者你可以使用CDatefunction:

 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 

也许你可以转换的CSV文件显示date为数字,即。 10月11日15日将显示为42318.或者添加一个单独的列,其中B1 =DATEVALUE(A1)并使用该列。

在创build摘要报告时,导入数字并使用CDateFormat将其转换为date。 像这样的东西:

 Sub test() Range("A2:A4").NumberFormat = "m/d/yyyy" Range("A2").Value = Format(CDate(Range("A1").Value), "dd.mm.yyyy") Range("A3").Value = Format(CDate(Range("A1").Value), "mm.dd.yyyy") Range("A4").Value = Format(CDate(Range("A1").Value), "Long Date") End Sub 

编辑:

为了更好的格式(不需要NumberFormat ,我认为它会马上使用你的区域设置)和自动设置单元格格式为datetypes,使用这个:

 Sub test() Dim sDate As Date sDate = CDate(Range("A1").Value) Range("A2").Value = DateSerial(Year(sDate), Month(sDate), Day(sDate)) End Sub 

结果:
Excel VBA日期显示

参考文献:
http://www.techonthenet.com/excel/formulas/format_date.php http://www.techonthenet.com/excel/formulas/cdate.php