我有一个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
答案 0 :(得分:0)
您的问题源于在您的Excel版本中打开。
打开文件时,Excel假定任何日期的短日期格式都将与Windows区域设置相同。
由于您的WRS为DMY
,而csv文件日期为MDY
DMY
为防止发生这种情况,请在之前将CSV文件导入Excel(将其写入Excel工作表),您必须告诉Excel传入日期的格式。
一种方法(也是我认为最好的方法)是使用旧版向导或Power Query 导入。当您这样做时,您将有机会告诉Excel传入数据的格式。
一种解决方法是使用明确的日期创建CSV。 yyyy-mm-dd
通常可以工作,dd-mmm-yy
可能也可以工作,尽管后者在月份缩写不同的地方会遇到语言差异的问题。
要以相同的格式保存日期,您可以
mm/dd/yyy
,然后再次保存。text
。仅当打开工作簿时,该列将不被修改或不用于任何计算,这才起作用。编辑
另一种可能对您的 特定 示例有帮助的可能性是,将Local
方法的Workbook.SaveAs
参数设置为{{ 1}},因此文件以Excel的语言/设置而不是VBA保存。尽管这样做可能在这种情况下可行,但这远非防弹,并且可能会导致最终出现问题,具体取决于最终用户对这些日期的处理方式。 我猜测从Excel工作表执行SaveAs时,它将使用Excel的语言/设置进行保存(我还没有看到有关此文档的文档);而VBA以美国为中心,除非指定“本地”,否则它会以VBA(即美国)的语言保存。