使用宏保存Excel工作簿时,日期反转

时间:2020-10-26 23:20:06

标签: excel vba date

我有一个CSV文件,其日期列为美国格式(我的区域格式为英国)。 如果我在excel中打开CSV文件,然后手动保存文件,则它会稍微修改日期条目(如果识别为有效的英国日期),但会以相同的格式保存。 但是,如果我使用 ActiveWorkbook.Save 将工作簿与宏一起保存,则日期会颠倒(即公认的有效英国日期)。

到底发生了什么? 如何保存宏并避免这种情况?

示例输入文件:

Date
06/02/2020
06/30/2020
07/13/2020
07/22/2020
07/31/2020
08/11/2020
08/11/2020
08/31/2020
09/22/2020
09/29/2020

手动保存后:

Date
6/02/2020
06/30/2020
07/13/2020
07/22/2020
07/31/2020
8/11/2020
8/11/2020
08/31/2020
09/22/2020
09/29/2020

使用宏保存后:

Date
2/6/2020
06/30/2020
07/13/2020
07/22/2020
07/31/2020
11/8/2020
11/8/2020
08/31/2020
09/22/2020
09/29/2020

解决方案: 罗恩的答案中指出的解决方案是将“保存”行替换为“保存为”,将“本地”变量设置为True,这样就不会使用VBA美国地区默认值。

    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=ActiveWorkbook.FullName, Local:=True
    Application.DisplayAlerts = True

1 个答案:

答案 0 :(得分:0)

您的问题源于在您的Excel版本中打开

打开文件时,Excel假定任何日期的短日期格式都将与Windows区域设置相同。

由于您的WRS为DMY,而csv文件日期为MDY

  • 第二部分为<= 12的日期将被错误地解释为DMY
  • 第二部分> 12的日期将保留为文本

为防止发生这种情况,请之前将CSV文件导入Excel(将其写入Excel工作表),您必须告诉Excel传入日期的格式。

一种方法(也是我认为最好的方法)是使用旧版向导或Power Query 导入。当您这样做时,您将有机会告诉Excel传入数据的格式。

一种解决方法是使用明确的日期创建CSV。 yyyy-mm-dd通常可以工作,dd-mmm-yy可能也可以工作,尽管后者在月份缩写不同的地方会遇到语言差异的问题。

要以相同的格式保存日期,您可以

  • 导入日期,然后在Excel中将其格式化为mm/dd/yyy,然后再次保存。
  • 导入日期,但是在导入过程中,将该列指定为text。仅当打开工作簿时,该列将不被修改或不用于任何计算,这才起作用。

编辑

另一种可能对您的 特定 示例有帮助的可能性是,将Local方法的Workbook.SaveAs参数设置为{{ 1}},因此文件以Excel的语言/设置而不是VBA保存。尽管这样做可能在这种情况下可行,但这远非防弹,并且可能会导致最终出现问题,具体取决于最终用户对这些日期的处理方式。 我猜测从Excel工作表执行SaveAs时,它将使用Excel的语言/设置进行保存(我还没有看到有关此文档的文档);而VBA以美国为中心,除非指定“本地”,否则它会以VBA(即美国)的语言保存。

相关问题