一些背景知识:对于我正在处理的项目(从给定的客户数据excel电子表格构建XML DOM),我需要能够读取一个单元格的内容日期时间。有问题的单元格包含“7/22/2011 0:00”,当我右键单击 - >格式化单元格时,它告诉我类别为“自定义”(不在标准日期类别中),类型为“ m / d / yyyy h:mm。“然而,当我选择单元格时,公式窗格将其显示为“7/22/2011 12:00:00 AM”。因此,对这些数据类型进行分类的所有三种尝试都不匹配。
问题:当我在MsgBox中使用ActiveWorkbook.ActiveSheet.Cells(x,y)显示单元格内容以进行调试时,它只显示7/22/2011(切断时间) )。它不能是引发它的日期和时间之间的空间,因为我在电子表格的其他地方成功读取了带有空格的单元格。
任何人都可以告诉我为什么会发生这种情况,或者让我指出一个VBA / Excel方法的正确方向,而这种方法不能完成Sheet.Cells(x,y)正在做的这种奇怪的裁剪事情吗?谢谢。如果每次datetime数据类型只给我带来一分钱给我带来了问题..
答案 0 :(得分:11)
在内部,Excel将日期存储为数字。它没有实现日期类型。这个数字是自过去某个时间点以来的天数(1900年或1904年,取决于操作系统,闰年内置了一些错误)。时间表示为数字的小数部分。
要使其看起来像是用户的日期,您必须为单元格指定日期格式。然后,该数字将显示为单元格中的日期。 (如果您输入的内容看起来像Excel的日期,Excel会自动指定日期格式。)
使用ActiveWorkbook.ActiveSheet.Cells(x,y)
时,您创建一个Range
对象并调用其默认属性Value
。 Value
内置了许多魔法。在您的情况下,它会查看单元格格式并查看日期格式,将内部存储的数字转换为Variant
子类型日期。当您使用消息框显示它时,会发生下一个技巧。如果时间是0:00,则日期将无时间转换为字符串。如果时间与0:00不同,则会将其转换为包含日期和时间的字符串。日期格式取自用户的设置。它独立于您分配给Excel单元格的日期格式。
如果您使用Value2
而不是Value
(例如,使用信息框来显示ActiveWorkbook.ActiveSheet.Cells(x,y).Value2
),那么您将看到日期的内部表示,即数字。
当您编辑单元格时,Excel会使用另一种日期格式,以便您可以查看和编辑日期的所有部分:年,月,日以及可能的小时,分钟和秒。这是因为您的单元格的日期格式可能仅限于月份名称。
国际化增加了另一种复杂性。某些日期格式不是直接应用,而是提示使用当前用户设置中的日期格式。因此,格式首先替换为另一种日期格式,然后应用。此外,日期和时间格式的某些部分受用户设置的影响。最后,翻译日期格式的模式(英文,yyyy
代表年份,德语为jjjj
)。保存Excel电子表格时,这些格式以英文形式存储,以便用任何语言的用户和Excel安装打开工作表。在您的情况下,国际化可能会影响您编辑单元格时使用的日期格式(前一个月放置,使用12小时显示,AM / PM看起来像北美)。
我不太明白为什么Excel显示“7/22/2011 12:00:00 AM”(而不是“7/22/2011 0:00:00 AM”)。我很确定你的日期/时间有一段时间是“0:00”。但是内部数字(由Value2
显示)会告诉你肯定的。
答案 1 :(得分:3)
它就像一个公式,在单元格中它将显示结果,在公式栏中它将显示公式。你可以格式化的单元格,你不能的公式栏。因此,您可以将单元格的格式更改为您想要的样式。
因此,如果您想格式化msgbox,则需要执行以下操作:
MsgBox (Format(ActiveWorkbook.ActiveSheet.Cells(x,y), "m/d/yyyy h:mm")