在VBA中读取包含date时间的Excel单元时出现问题

一些背景:对于我正在处理的项目(从给定的客户数据excel电子表格构buildXML DOM),我需要能够读取其中包含date时间的单元格的内容。 有问题的单元格包含“7/22/2011 0:00”,当我右键单击格式化单元格时,它会告诉我类别是“自定义”(不在标准date类别中),types为“m / d / yyyy h:mm。“ 然而,当我select单元格时,公式窗格将其显示为“7/22/2011 12:00:00 AM”。 所以这三种分类数据types的尝试都不匹配。

问题:当我使用MsgBox中的ActiveWorkbook.ActiveSheet.Cells(x,y)来显示单元格内容以进行debugging时,它仅显示2011年7月22日(切断时间)。 它不能是date和时间之间的空间,因为我成功读取了电子表格中其他位置的空格。

任何人都可以告诉我为什么发生这种情况,或者指向一个VBA / Excel方法的正确方向,而不是做Sheet.Cells(x,y)这种奇怪的裁剪工作? 谢谢。 如果只有我有一个便士每次date时间数据types导致我的问题..

在内部,Excel将date存储为数字。 它没有实现datetypes。 这个数字是从过去的某个时间点开始的天数(1900或1904年,取决于操作系统,闰年时会有一些错误)。 时间表示为数字的小数部分。

为了使它看起来像用户的date,你必须分配一个date格式的单元格。 然后该号码显示为单元格中的date。 (如果您input的东西与Excel的date类似,则Excel会自动分配一个date格式。)

当您使用ActiveWorkbook.ActiveSheet.Cells(x,y) ,您将创build一个Range对象并调用其默认属性,即ValueValue有很多魔术内置。 在你的情况下,它会查看单元格格式并查看date格式,将内部存储的数字转换为子typesdate的Variant 。 当您使用消息框显示它时,会发生下一个技巧。 如果时间是0:00,则date将被转换为没有时间的string。 如果时间从0:00不同,它将被转换为date和时间的string。 date格式取自用户的设置。 它独立于您分配给Excel单元格的date格式。

如果您使用Value2而不是Value (例如通过使用消息框来显示ActiveWorkbook.ActiveSheet.Cells(x,y).Value2 ),那么您将看到date的内部表示forms,即数字。

在编辑单元格时,Excel使用另一种date格式,以便您可以查看和编辑date的所有部分:年,月,日和可能的小时,分​​钟和秒。 这是因为你的单元格的date格式可能只限于月份名称。

国际化增加了另一个复杂性。 某些date格式不是直接应用,而是使用当前用户设置中的date格式的提示。 所以格式首先被replace为另一个date格式,然后应用。 此外,date和时间格式的某些部分受用户设置的影响。 最后,date格式的模式被翻译(英文, yyyy代表一年,德文是jjjj )。 保存Excel电子表格时,这些格式将以英文格式存储,以便用户和Excel使用任何语言打开表格。 在你的情况下,国际化可能会影响编辑单元格时使用的date格式(将月份放在前一个月,并使用AM / PM看起来像北美的12小时显示)。

我不太明白Excel为什么显示“2011/7/22 12:00:00 AM”(而不是“2011/7/22 0:00:00 AM”)。 我很确定你的date/时间有一个“零点”的时间部分。 但是内部数字(如Value2所显示的)肯定会告诉你。

它就像一个公式,在单元格中显示结果,在公式栏中将显示公式。 你可以格式化的单元格,你不能。 所以你可以改变单元格的格式,但是你希望它看起来像。

所以,如果你想格式化msgbox,那么你需要做到以下几点:

 MsgBox (Format(ActiveWorkbook.ActiveSheet.Cells(x,y), "m/d/yyyy h:mm")