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

6 excel vba excel-2007 excel-vba

一些背景:对于一个项目,我的工作(从客户数据给定的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数据类型只有我一分钱给我造成问题..

Cod*_*odo 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)将告诉你肯定.