混淆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"
设置你使用的单元格的格式,
或者你可以使用CDate
function:
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摘要报告时,导入数字并使用CDate
和Format
将其转换为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
结果:
参考文献:
http://www.techonthenet.com/excel/formulas/format_date.php http://www.techonthenet.com/excel/formulas/cdate.php