这是我发现的问题,然后我自己解决了,因为我无法找到关于这个主题的问题,我想我会创建一个供将来参考。
我不小心写了
debug.Print day(ow)
而不是
debug.Print day(now)
令我惊讶的是,我没有抛出错误,而是得到了以下结果:
debug.Print day(ow)
30
为什么在给定未初始化的变量作为输入时不会抛出错误?
答案 0 :(得分:7)
除非您在模块顶部写Option Explicit
,否则VBA允许您在第一个使用点自发创建变量(如Variant
类型)。
这些变量实际上是零初始化的。
所以day(ow)
相当于day(0)
,其评分为30.(对应于1899年12月30日)。
答案 1 :(得分:6)
简单的答案是默认值。
以下结果是说明性的:
debug.Print day(0)
30
为什么呢?因为VBA日历中的Day(0)
是日期30/12/1899
。由以下人员证明:
debug.Print format(Cdate(0), "dd/mm/yyyy")
30/12/1899
除非您在模块顶部写Option Explicit
,否则VBA允许您在第一个使用点自发创建变量(如Variant
类型)。
创建变量(但未设置)时,将其设置为“默认值”。 示例默认值:
Long
---0
(其他数字相同,包括Date
,Integer
,Byte
,Double
等。)
Boolean
---False
(在VBA中 许可类型系统,可以强制为0
)
Variant
---Empty
(也可以强制为0
)
String
---Zero-Length-String ("")
(实际上,不可能是0
强制转移到Day("")
,如果您尝试打印Any Object
),则会抛出错误Nothing
---Debug.Print Day(Var)
因此,如果您编写Var
并且Day(0)
是任何数字数据类型,布尔值或Variant(或者从未在第一位声明),那么这将被强制转换为{{1如上所示,它给出了30
的输出。
在问题的具体情况中:
VBA将ow
识别为未声明的变量,因此它会创建它(并将其初始化为Variant
数据类型)并将其传递给Day()
。由于它是Variant,因此它具有初始值Empty
,然后强制转换为0
,从而导致Day(0)
返回30
。