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

Vba 混淆dd/mm/yyyy和mm/dd/yyyy,vba,excel,date,Vba,Excel,Date,我有一个VBA脚本,可以打开一堆CSV文件,并将它们编译成一个摘要报告 但是,我遇到了一个问题,它读取英式日期(dd/mm/yyyy),然后在复制时将其解释为美式日期,然后再次显示为英式日期 因此,原始工作表中的7月4日变为汇总表中的4月7日-通过更改单元格格式以显示月份名称进行验证 这很奇怪,因为当您在Excel中打开CSV文件时,它正确地解释了英国样式的日期 复制是使用这样的代码进行的 SummarySheet.Cells(Y,X).value = CSVSheet.Cells(W,Z).v

我有一个VBA脚本,可以打开一堆CSV文件,并将它们编译成一个摘要报告

但是,我遇到了一个问题,它读取英式日期(dd/mm/yyyy),然后在复制时将其解释为美式日期,然后再次显示为英式日期

因此,原始工作表中的7月4日变为汇总表中的4月7日-通过更改单元格格式以显示月份名称进行验证

这很奇怪,因为当您在Excel中打开CSV文件时,它正确地解释了英国样式的日期

复制是使用这样的代码进行的

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

这里发生了什么?

您可以使用
.Text
(文本显示在Excel单元格中)或
.Value2
(无格式的值)而不是
.value
(有格式的值)

但我强烈建议您使用
将使用的单元格格式设置为您希望在最后使用的格式。NumberFormat=“mm/dd/yyyy”

或者您可以使用
CDate
功能:

SummarySheet.Cells(Y,X).value = CDate(CSVSheet.Cells(W,Z).value)
或者将自定义项与日期序列一起使用:

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文件转换成数字来显示日期,即11月10日15日将显示为42318。或者添加一个单独的列,其中B1是
=DATEVALUE(A1)
,并使用它

创建摘要报告时,请导入数字并使用
CDate
格式
将其转换为日期。大概是这样的:

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
,我认为它将立即使用您的区域设置)和将单元格格式自动设置为日期类型,请使用以下方法:

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

参考文献:

您没有发布有关如何打开CSV文件的代码,这是一个关键领域。在将日期输入工作表之前,需要正确分析日期。下面的代码将选择并打开一个在单个列中包含英国风格日期的文件,并正确解析它们。您需要根据您的特殊要求对其进行调整

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

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

Set csvWB = Workbooks.OpenText(Filename:=myCSVfile, Local:=True)
对于
Local
设置:

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


默认情况下,VBA使用US样式,而Excel会查看您的语言设置。恐怕你自己无法正确解析日期。您也可以尝试使用ADO从CSV文件中获取数据,但这可能有点过分。@Excel中的Tom内部是否不将日期作为某种形式的数字处理,如Unix时间或类似时间?没有办法只复制这个(格式不可知)数字吗?当打开CSV文件时,Excel倾向于尝试将列转换为它知道的格式,因此在本例中是日期。此日期实际上是一个数字(将单元格格式设置为数字而不是日期,您将看到),与使用VBA打开文件相比,Excel打开CSV文件时,所提供文本的转换处理方式有所不同。不过,自己解析文本值并不太困难(只是有点繁琐),因此调用
Workbooks.Open(“Csvfile.csv”)
与我去文件->打开->Csvfile.csv不同。。。再一次,MS和VBA使一切变得不清楚。更好的方法可能是使用OpenText方法。这也将允许您指定如何解析date columnValue2以获得完全相同的结果(转置日期和月份)。与.textOk一样,还有
CDate
?或者您可以使用
DateSerial
!;)尝试自定义函数
ParseDate
Workbook.OpenText
Workbook.Open
相反,它似乎可以完成这项工作-尽管fieldinfo参数有助于避免混淆。@CMaster是的,如果省略fieldinfo,它将根据Windows区域设置进行分析。因此,即使有人在机器上更改了这些设置,包含它也可以正确解析日期。此外,我建议您指定所有分隔符,因为这些分隔符可能会从先前使用的
数据/文本转到列
向导中。对于我的示例,我只需要指定
other:=false
,但对于实时应用程序,我会将除
comma
之外的所有内容都指定为false;并考虑其他可选参数。