Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从其他工作簿复制工作表时,如何阻止Excel格式化日期?_Excel_Vba_Csv_Date - Fatal编程技术网

从其他工作簿复制工作表时,如何阻止Excel格式化日期?

从其他工作簿复制工作表时,如何阻止Excel格式化日期?,excel,vba,csv,date,Excel,Vba,Csv,Date,我在工作簿中写入了一个宏,该宏打开指定的.csv文件,并将内容复制到原始工作簿中的新工作表中。.csv中的一列包含非美国格式的日期,Excel将其中一些日期读取为美国日期并将其转换,例如2020年2月12日[12/02/2020非美国]读取为2020年12月2日[12/02/2020美国] 大多数日期都在第12天之后,因此无法转换为美式格式,这些日期以文本形式读取。其余部分存储为日期整数 我如何通过程序停止这种行为 工作簿将由不同计算机上的多个用户使用,因此更改Windows日期默认值不是一个解

我在工作簿中写入了一个宏,该宏打开指定的.csv文件,并将内容复制到原始工作簿中的新工作表中。.csv中的一列包含非美国格式的日期,Excel将其中一些日期读取为美国日期并将其转换,例如2020年2月12日[12/02/2020非美国]读取为2020年12月2日[12/02/2020美国]

大多数日期都在第12天之后,因此无法转换为美式格式,这些日期以文本形式读取。其余部分存储为日期整数

我如何通过程序停止这种行为

工作簿将由不同计算机上的多个用户使用,因此更改Windows日期默认值不是一个解决方案

谢谢

编辑: 源工作表由另一个系统生成,文件以dd/mm/yyyy格式在网络位置存档,其中B列数据为dd/mm/yyyy格式

Dim Source_Sheet As Worksheet
Set Source_Sheet = Workbooks("example").Worksheets("example")

Dim Target_Sheet As Worksheet
Set Target_Sheet = Workbooks("example2").Worksheets("example2")

Source_Sheet.Copy After:=Target_Sheet
我认为格式的变化发生在复印工作表的过程中

csv打开为:

Workbooks.Open ("file")

假设所有值的格式相同,即dd/mm/yyyy

复制到excel时,请使用等于运算符=12/02/2020。这将强制excel将数据保存为文本,而不更改日期格式


复制后,您可以将文本转换为dd/mm/yyyy格式的日期。

无论您如何导入数据,我绝对建议您在将字符串写入单元格之前导入字符串时立即将其转换为实际日期值。否则,你很容易陷入混乱

例如,使用Split函数按分隔符/将字符串拆分为天、月和年,然后使用DateSerialyear、月、日函数

要创建一个真实的日期值,然后可以将其格式化为您喜欢的任何外观:

Range("A1").NumberFormat = "yyyy-mm-dd"

此日期是一个真实的日期值,可以进行排序和计算。

如果日期数据的显示格式为dd/mm/yyyy,则以下代码将适用

Sub Test()
    Dim vR()
    Dim rngDB As Range, rng As Range
    Dim Source_Sheet As Worksheet
    Dim Target_Sheet As Worksheet
    Dim Ws As Worksheet
    Dim r As Long, n As Long
    Dim s As String, vS As Variant

    Set Source_Sheet = Workbooks("example.xlsx").Worksheets("example")
    Set Target_Sheet = Workbooks("example2.xlsx").Worksheets("example2")

    Source_Sheet.Copy After:=Target_Sheet
    Set Ws = Target_Sheet.Next

    With Source_Sheet
        Set rngDB = .Range("b1", .Range("b" & Rows.Count).End(xlUp))
    End With

    r = rngDB.Rows.Count
    ReDim vR(1 To r, 1 To 1)
    For Each rng In rngDB
        n = n + 1
        s = rng.Text
        If InStr(s, "/") Then
            vS = Split(s, "/")
            vR(n, 1) = DateSerial(vS(2), vS(1), vS(0))
        Else
            vR(n, 1) = s
        End If
    Next rng

   With Ws.Range("b1").Resize(r)
        .Value = vR
        .NumberFormat = "mm/dd/yyyy"
   End With
End Sub

请将您的代码显示在您的问题中以包含它。如果我们看不见你做错了什么,我们就说不出来。还请包括显示/表示所有错误和正确案例的示例数据,并请说明CSV中的textdate格式是mm/dd/yyyy还是dd/mm/yyyyy。请注意,如果您只是打开类似工作簿的CSV文件。打开文件,您可以让Excel猜测每列数据的格式,Excel有时猜得不太好。这可能就是Excel猜测日期格式错误的原因。请参阅如何更可靠地导入CSV数据并为列选择正确的格式。如果您不知道如何在VBA中编码,请首先使用宏录制器,而不更改不正确的日期格式。Excel无法判断此字符串的日期格式是mm/dd/yyyy还是dd/mm/yyyy,因此它只能猜测。根据操作系统使用的格式,这很容易导致错误。因为OP说这是由不同的机器使用的,所以他们可能在操作系统中设置了不同的格式。第一条规则应该是:永远不要让Excel猜测字符串的日期格式,否则你可能很快就会陷入混乱。我没有提到Excel如何更改日期格式。我的意思是:它不会改变格式。我给出的解决方案将输入值视为文本。日期和字符串对于Excel来说都是无用的,它们既不能用于计算,也不能用于正确排序。保存为文本的日期实际上是Excel中最糟糕的日期,因为无论是人类还是计算机都无法告诉您2020年2月12日是mm/dd/yyyy还是dd/mm/yyyy,除非您有任何背景信息,您必须猜测:50/50的可能性我看到的唯一正确的方法是解析字符串,并在导入时直接将其转换为正确的日期值。我知道所有这些事情。我假设所有值都是相同的日期格式,即dd/mm/yyyy,但excel在复制时将其更改为mm/dd/yyyy。为了修正格式,我给出了这个解决方案。复制之后,我们可以将文本更改为日期格式dd/mm/yyyy。我正在复制整个工作表。Source_Sheet.Copy After:=目标_Sheet@TarriqPillay问题是如何打开/导入CSV?请出示您的代码,否则我们看不到您是如何做到的。如何导入CSV数据的选项太多了。编辑您的原始问题以包含您的code.Workbooks.Openfilepath-我认为此时需要将其作为文本阅读好了,现在您演示了如何复制工作表,但没有演示如何导入CSV。签出并滚动至步骤5。在该窗口中,您可以为每个列选择其应采用的格式,因此请为您的日期列选择日期,并选择正确的格式,使您的CSV数据与您以后希望的格式不同。如果正确导入,您可以稍后使用numberformat更改日期格式。但您需要先正确导入。如果CSV中的数据是以文本/字符串形式导入的,则这将起作用。但值得注意的是,在CSV导入期间,Excel可能已经尝试转换
将字符串转换为Excel在默认模式下尝试猜测的日期,因此在导入过程中日期可能已经被弄乱。因此,绝对有必要关注导入,因此它要么以文本形式导入,而不用Excel猜测,然后使用上面的代码,要么通过在“导入”对话框中指定正确的格式并设置所需的数字格式作为正确的日期。@Pᴇʜ,我猜op的原始数据是一个Excel文件,在不同的国家以日期表示。有一个限制是op对原始文件内容的描述不清楚。op的第一句话说源是csv:我在工作簿中写入了一个宏,这将打开一个指定的.csv文件,在他的最后一句话中,他说csv是作为:工作簿.Open文件打开的,因此确实存在Excel猜测和试图在默认模式下转换日期的危险。由于CSV中的日期始终是字符串,因此无法准确猜测它们。最好的方法是使用ISO日期:
Sub Test()
    Dim vR()
    Dim rngDB As Range, rng As Range
    Dim Source_Sheet As Worksheet
    Dim Target_Sheet As Worksheet
    Dim Ws As Worksheet
    Dim r As Long, n As Long
    Dim s As String, vS As Variant

    Set Source_Sheet = Workbooks("example.xlsx").Worksheets("example")
    Set Target_Sheet = Workbooks("example2.xlsx").Worksheets("example2")

    Source_Sheet.Copy After:=Target_Sheet
    Set Ws = Target_Sheet.Next

    With Source_Sheet
        Set rngDB = .Range("b1", .Range("b" & Rows.Count).End(xlUp))
    End With

    r = rngDB.Rows.Count
    ReDim vR(1 To r, 1 To 1)
    For Each rng In rngDB
        n = n + 1
        s = rng.Text
        If InStr(s, "/") Then
            vS = Split(s, "/")
            vR(n, 1) = DateSerial(vS(2), vS(1), vS(0))
        Else
            vR(n, 1) = s
        End If
    Next rng

   With Ws.Range("b1").Resize(r)
        .Value = vR
        .NumberFormat = "mm/dd/yyyy"
   End With
End Sub