【发布时间】: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属性,而不是分配给任何默认属性发生