【问题标题】:VBA changes date format when a CVS file saved as XLSX当 CVS 文件另存为 XLSX 时,VBA 更改日期格式
【发布时间】:2017-01-18 01:13:40
【问题描述】:

我有一个 csv 文件,它的 D 列中输入了日期,并在澳大利亚日期格式下格式化。其余数据为整数:

4/10/2016 (correctly representing 4 Oct 16)
15/03/2017 (correctly representing 15 Mar 17)

当我手动将此文件保存为 xlsx 时,它会正确保存日期,因此当我重新打开 xlsx 文件时,日期会正确显示:

value = 4/10/2016, format = 4/10/2016 (as dd/mm/yyyy)
value = 15/03/2017, format = 15/03/2017 (as dd/mm/yyyy)

但是,当我以编程方式执行相同操作时:

fileNameXLSX = "H:\20160930.xlsb"
fileNameCSV = "H:\20160930.csv"
Set srcBook = Application.Workbooks.Open(filenameCSV, ReadOnly:=True)
Application.DisplayAlerts = False
srcBook.SaveAs filename:=fileNameXLSX, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
srcBook.Close False
Set srcBook = Nothing
Application.DisplayAlerts = True

并打开文件,一些条目、月份/日期被交换,在那个 xlsx 文件中这些值将变为:

value = 10/4/2016, format = 10/4/2016 (still dd/mm/yyyy)
value = 15/03/2017, format = 15/03/2017 

我在澳大利亚的 windows 语言环境中。我该如何解决这个问题,以便我的 VBA 代码能够按照我的预期执行。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    我会尝试将 local 设置为 true,这样可以使日期保持所需的格式。在您的代码中,这看起来像这样:

    fileNameXLSX = "H:\20160930.xlsb"
    fileNameCSV = "H:\20160930.csv"
    Set srcBook = Application.Workbooks.Open(filenameCSV, ReadOnly:=True)
    Application.DisplayAlerts = False
    srcBook.SaveAs filename:=fileNameXLSX, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False, Local:=True
    srcBook.Close False
    Set srcBook = Nothing
    Application.DisplayAlerts = True
    

    来源:https://msdn.microsoft.com/en-us/library/office/ff841185.aspx

    【讨论】:

    • 魔术。 @Docmarti 的变体也可以。谢谢大家
    【解决方案2】:

    如果 csv 中的日期不是美国日期,我建议在 Open 命令中将 Local 参数设置为 True。

    fileNameXLSB = "H:\20160930.xlsb"
    fileNameCSV = "H:\20160930.csv"
    Set srcBook = Application.Workbooks.Open(filenameCSV, ReadOnly:=True, local:=True)
    Application.DisplayAlerts = False
    srcBook.SaveAs Filename:=fileNameXLSB, FileFormat:=xlExcel12, CreateBackup:=False
    srcBook.Close False
    Set srcBook = Nothing
    Application.DisplayAlerts = True
    

    【讨论】:

    • 对于阅读此问题的任何人 - 这是您问题的解决方案(不是上述问题)。 Docmarti 绝对正确,srcBook 需要“local:=True”。
    【解决方案3】:

    我建议作为一个简单的解决方案添加一行代码,该代码行选择包含日期的列并将其数字格式设置为您喜欢的约定 - 这看起来像这样:

    fileNameXLSX = "H:\20160930.xlsb"
    filenameCSV = "H:\20160930.csv"
    Set srcBook = Application.Workbooks.Open(filenameCSV, ReadOnly:=True)
    Application.DisplayAlerts = False
    srcBook.SaveAs Filename:=fileNameXLSX, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    
    srcBook.Sheets(1).Columns("A:A").EntireColumn.NumberFormat = "d/mm/yyyy"
    
    srcBook.Close False
    Set srcBook = Nothing
    Application.DisplayAlerts = True
    

    希望这会有所帮助, 丝绸代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2017-06-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多