为什么Day()在无效输入时返回30?

时间:2016-06-06 15:41:13

标签: vba

这是我发现的问题,然后我自己解决了,因为我无法找到关于这个主题的问题,我想我会创建一个供将来参考。

我不小心写了

debug.Print day(ow)

而不是

debug.Print day(now)

令我惊讶的是,我没有抛出错误,而是得到了以下结果:

debug.Print day(ow)
 30 

为什么在给定未初始化的变量作为输入时不会抛出错误?

2 个答案:

答案 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(其他数字相同,包括DateInteger,   ByteDouble等。)
  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