【问题标题】:How to adjust for differences between 32 and 64 bit Excel VBA date handling?如何调整 32 位和 64 位 Excel VBA 日期处理之间的差异?
【发布时间】:2012-09-03 14:12:33
【问题描述】:

问题:

64 位 Excel VBA 有一个讨厌的习惯,即在将数组分配给范围时将数组日期转换为数字。另一方面,32 位 VBA 保留日期格式。

示例:

这里有一些示例代码来演示不同的日期处理:

Sub test()
    Dim arr(0 to 1) As Variant
    arr(0) = "Text"
    arr(1) = #9/12/2007#
    ActiveSheet.Range("A1:B1") = arr
End Sub

(请注意,如果使用单个日期值,则日期不会在 64 位 Excel 中转换;必须存在第一个文本值)

结果:

在 32 位 Excel 中运行时,输出为Text, 9/12/2007

在 64 位 Excel 中运行时,输出为 Text, 39337

就好像 64 位 VBA 只对所有范围对象使用 Value2 属性。

问题:

如何在不编写函数来处理所有数组写入的情况下让 64 位 VBA 表现得像 32 位 VBA?

只是为了阻止可能的善意回应:我知道这些单元格之间的基本公式保持不变。然而,32 位 Excel 会自动将正确的单元格设置为日期格式,这大大简化了我的代码。

【问题讨论】:

  • 您确定这不仅仅是 64 位 XL 没有为您自动格式化单元格的问题吗?我之所以这么问,是因为 2007 年 9 月 12 日 excel 中的“日期值”是39337。出于所有意图和目的,它将将该值读取为使用它的任何功能的日期。可能需要做的就是告诉 Excel 在程序中或通过 VBA 将其格式化。有关 Excel 中的日期和时间的更多信息,请参阅此内容ozgrid.com/Excel/ExcelDateandTimes.htm
  • @Scott Holtzmann:这正是正在发生的事情,尽管 Excel 不会将数字视为日期,除非它们被格式化。 32 位 Excel 会自动适当地格式化这些单元格,因此不需要额外的工作,而 64 位则不需要。那么如何强制 64 位 Excel 表现得像 32 位呢?
  • 在此之后我可能不得不退出,因为我不太精通 64 位和 32 位 excel,但您能否通过一些测试运行范围并格式化任何日期。我知道这是一个丑陋的解决方案......但它可能是唯一的。
  • 那将是 a 解决方案,只是不是理想的解决方案。我目前有大量数据,我每周都在运行这个宏。我认为,测试每个单元格会将宏减慢到无法控制的速度,并且我必须将每个 range=array 语句更改为某个自定义函数(这在我所拥有的宏中并不是一个微不足道的更改)。如果可能的话,我需要一个快速、直接的解决方案。不过,感谢您的回复。
  • ActiveSheet.Range("A1:B1").Value = arr 有什么不同吗?显式分配给Value 属性,而不是分配给任何默认属性发生

标签: vba excel


【解决方案1】:

我之前遇到过这样的问题,并通过确保单元格格式始终设置为日期格式来解决它。

这样的事情应该可以解决问题:

Range("A1").Select
Selection.Format = "long date"

【讨论】:

  • 请阅读原始问题的 cmets。发帖人知道您可以专门设置格式,但并非所有值都是日期;问题是不必必须为数组中的单个值设置格式。
猜你喜欢
  • 1970-01-01
  • 2010-12-18
  • 2011-05-15
  • 1970-01-01
  • 2010-09-21
  • 2011-12-11
  • 2011-04-02
  • 2012-12-17
  • 2016-12-25
相关资源
最近更新 更多