【问题标题】:Date reversed when saving Excel workbook with macro使用宏保存 Excel 工作簿时日期反转
【发布时间】:2020-10-26 23:20:06
【问题描述】:

我有一个 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

解决方案: Ron 的回答中指出的解决方案是用 SaveAs 替换 Save 行,将 Local 变量设置为 True,因此它不使用 VBA 美国区域默认值。

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

【问题讨论】:

    标签: excel vba date


    【解决方案1】:

    您的问题源于在您的 Excel 版本中打开 csv 文件。

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

    因为您的 WRS 是 DMY 并且 csv 文件日期是 MDY

    • 第二部分 DMY
    • 第 2 部分 >12 的日期将保留为文本

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

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

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

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

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

    编辑

    另一种可能对您的特定示例有所帮助,可能是将Workbook.SaveAs 方法的Local 参数设置为True,因此文件以 Excel 的语言/设置保存,而不是 VBA。尽管在这种情况下这样做可能会奏效,但它远非万无一失,并且可能会在未来引发问题,具体取决于最终用户想要对这些日期做什么。 我猜当从 Excel 工作表执行 SaveAs 时,它将使用 Excel 的语言/设置进行保存(我还没有看到这方面的文档);而 VBA 以美国为中心,除非指定 Local,否则它将保存为 VBA 的语言(即:美国)。

    【讨论】:

    • 底线 - Excel 尝试“帮助”识别日期通常不仅没有帮助,而且具有破坏性。恕我直言,当您控制源时,您的解决方法(明确的日期)是最佳和正确的解决方案。如果您无法控制源代码,我通常会在我对实际格式有先验知识的情况下编写自己的 CSV 处理程序
    • @chrisneilsen 我同意。虽然这些天我更有可能通过使用 Power Query 设置查询来“编写我的处理程序”。
    • 我不认为你完全明白我在问什么,我的意思是为什么手动保存和 VBA 保存的行为完全不同?我实际上在做的是打开一个现有的 CSV 文件,添加一列并通过宏保存它。当宏保存文件时,它会反转日期但是如果我从宏中省略保存功能并手动保存文件,那么它不会反转日期。我希望能够在宏中做到这一点,而不会弄乱日期。
    • 澄清一下,打开文件的方式没有问题。当我打开文件时,我对它识别某些日期为英国格式感到非常满意。如果我手动保存它们,它会保存它识别为英国格式的日期,这很好,因为它与读取它们的方式相匹配。问题是宏中的保存功能将日期保存为美国格式而不是英国格式,因此它将它们反转为打开它们的方式。
    • @GodKratos 您认为它正在识别的日期并未按照最初的预期被识别。
    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多