以编程方式打开文件时,日期格式/值会发生变化

Posted

技术标签:

【中文标题】以编程方式打开文件时,日期格式/值会发生变化【英文标题】:Date formats/values change when file is opened programmatically 【发布时间】:2012-03-26 10:41:47 【问题描述】:

我有 .csv 文件,它是每日数据的时间序列,每个日期都有几个数据点。

当我手动打开文件时,日期正确打开,日期格式为dd/mm/yyyy

当我以编程方式打开文件时,每个月 12 日之前的日期都以mm/dd/yyyy 打开,尽管格式仍然是dd/mm/yyyy(例如,1983 年 7 月 1 日(1/7/1983)将是于 1983 年 1 月 7 日(1983 年 1 月 1 日)打开 - 这不仅仅是格式问题,与这些日期相关的儒略日期(自 1901 年 1 月 1 日以来的天数)也会发生变化,以及每个日期的 12 日之后的日期月份正确打开,虽然是文本而不是日期。

以文本形式输入的数据不是问题,但是,打开文件后立即更改的日期是有问题的。我可以尝试将整个 .csv 文件作为逗号分隔文本导入,而不是打开文件,但是,如果我可以在打开文件时阻止日期更改,将会更容易、更快捷。

Flder = InputBox("Copy and Paste Folder path here:")

Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourcePath = FSO.GetFolder(Flder)

For Each File In SourcePath.Files        
    Workbooks.Open (File)

    FlNm = File.Name

    StrtCol = Workbooks(FlNm).Worksheets(1).Range(Cells(4, 1), Cells(4, 30)).Find ("Mean").Column

    Workbooks(FlNm).Worksheets(1).Range(Cells(1, 1), Cells(60000, 1)).Copy (Workbooks("Find Water Years V2.xls").Worksheets(1).Range("A3"))
    Workbooks(FlNm).Worksheets(1).Range(Cells(1, StrtCol), Cells(60000, StrtCol + 1)).Copy (Workbooks("Find Water Years V2.xls").Worksheets(1).Range("B3"))

    Workbooks(FlNm).Close
Next

问题似乎出现在Workbooks.Open(File)这一行。

【问题讨论】:

你能定义“以编程方式打开”吗?你的意思是通过 Excel 自动化?还是直接在VBA代码中? “打开文件”不可能改变任何内容;并非如此,但是您在问题中没有发布任何与此相关的内容。打开 .csv 文件本身不会更改内容(例如,在记事本中);发布一些代码或其他信息,显示您如何阅读它以及您对阅读的文本做了什么。否则,我怀疑您的问题将被关闭为“不是一个真正的问题”。 :) 抱歉,Ken 不够清晰,代码如下。 这里必须同意肯。有一个根本原因。那时文件在记事本中是什么样子的,你是如何打开文件的?它是否被拉入模板。粘贴了吗? 使用Workbooks.Open(File)将文件直接打开到excel中(见上面我刚刚粘贴的代码)。在记事本中打开数据时日期是正确的,格式为dd/mm/yyyy,与手动打开文件时相同。 所以,rep 还不够高,无法回答我自己的问题。解决方案是将Workbooks.Open 的本地变体设置为true,强制它使用本地设置解析数据,而不是使用默认设置(美国)。如果你们中的任何一个想回答问题,请随意,否则我会在今天下午晚些时候或明天早上抛出答案。 【参考方案1】:

由于 OP 已经在 cmets 中回答了这个问题,但没有作为官方答案发布,所以我会把它放在这里,以防其他人像我一样错过它。

workbook = workbooks.Open(filename, Local:= true)

通过设置 Local = true 使用本地机器日期格式而不是假设 mdy 因此在澳大利亚 (dmy) 等语言环境中它会改变 Open() 的行为

【讨论】:

感谢您澄清这一点,因为刚刚遇到了同样的问题。虽然很明显存在本地问题,但修复方法并不那么明显(除非您完全了解每个小函数参数)。我看不出默认情况下该选项不正确的原因。 我也是,因为当您以交互方式打开文件时,它的行为就像 Local:=True 所以我同意它应该是默认值【参考方案2】:

我在使用 Office 365 时遇到了这个问题。 通过使用 Excel 导入 csv 文件,一些日期 dd/mm/jjjj(欧洲)被导入为美国日期 mm/dd/jjjjcsv 文件中没有任何日期格式。

按如下方式打开:

Set xla = CreateObject("Excel.Application")
Set xlb = xla.Workbooks.Open(sFilePath, ReadOnly:=False, Local:=True)

使用的本地设置,并解决了问题:-)

打开文件的其他选项是:

expression.Open (FileName, UpdateLinks, ReadOnly, 
                 Format, Password, WriteResPassword, 
                 IgnoreReadOnlyRecommended, Origin, 
                 Delimiter, Editable, Notify, Converter, 
                 AddToMru, Local, CorruptLoad)

【讨论】:

【参考方案3】:

我可以尝试将整个 .csv 文件导入为逗号分隔的文本,而不是实际打开文件,但是,如果我可以在打开文件时阻止日期更改,将会更容易、更快捷。

如果以 CDT 形式打开它仍然很快。您只需使用.OpenText 而不是.Open。其余代码保持不变:)

尝试录制宏,您会看到代码看起来有点像这样。

Workbooks.OpenText Filename:= File, _
Origin:=437, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
TrailingMinusNumbers:=True

【讨论】:

我的经验是,如果日期未格式化为 mdy,OpenText 将无法正常工作 没有。但是您可以强制作为文本导入,将文本操作为具有正确明确的格式(首选 ISO,即 YYYY-MM-DD)并将 CDate 应用于此类操作的字符串。【参考方案4】:

我发现 user2981639 的想法是正确的,但是我得到了一个语法错误,'Local: true' 所以 我改用'local:=True'

这个问题让我抓狂,因为我在 csv 文件中还有 2 个备注字段。 如果我尝试以任何方式格式化日期,备忘录字段将无法正确导入,它们要么被截断为 255 个字符,要么任何嵌入的 CRLF 字符会根据记录的数量将记录切成碎片。

感谢大家发帖

【讨论】:

【参考方案5】:

在这里,您会看到带有示例的工作代码。这个问题也让我沮丧了一段时间。我在 excel 中打开一个 .txt 文件,我使用的日期是从 dd-mm-yyyy 格式转换为 mm-dd-yyyy 格式。下面你会看到一个解决方案。它位于最后一个命令中(,Local := True)。见下文。希望对您有所帮助。

Note that while trasferring .txt file to excel use File Origin as "xlWindows:
    Workbooks.OpenText Filename:= _
    ThisWorkbook.Worksheets("Reporting").Cells(3, 6), Origin:=xlWindows, _
    StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(49 _
    , 1), Array(50, 1), Array(67, 1), Array(80, 1), Array(93, 1), Array(106, 1), Array(119, 1)) _
    , DecimalSeparator:=",", ThousandsSeparator:=".", TrailingMinusNumbers:= _
    True, Local:=True

注意:数组和小数点分隔符的其余设置是我的工作特定的 - 可能不适用于您。

【讨论】:

【参考方案6】:

我也在努力寻找答案。然而,解决这个问题的是:-

本地应该是真的。 并且工作簿关闭保存更改必须为 false。应该可以的。

【讨论】:

【参考方案7】:

自己也遇到了这个问题,找到了上面的解决办法

 workbook = workbooks.Open(filename, Local:= true)

问题在于它会生成错误消息。 MS 文档没有提到括号或 Workbook =,所以我使用了这个:-

 Workbooks.Open Path, local:=True

从我这里开始,希望对你有所帮助。

【讨论】:

以上是关于以编程方式打开文件时,日期格式/值会发生变化的主要内容,如果未能解决你的问题,请参考以下文章

当我打开 Visual Studio 时,MFC 日期时间选择器格式发生变化

当另一个单元格的值发生变化时,一个单元格中的自动日期更新(通过公式计算)

为啥将数据导出到 Excel 时日期格式会发生变化?

如果开始日期和结束日期跨越一个或多个月,则插入表格时日期格式会发生变化

服务器中的日期格式正在发生变化

以编程方式将Tableview滚动到未来日期