覆盖VBA的Now()函数

时间:2017-01-09 08:30:45

标签: vba excel-vba access-vba excel

有没有办法在VBA中覆盖Now()以进行测试?这里有类似的东西 - What's a good way to overwrite DateTime.Now during testing?,但对于VBA。

因此,我需要Now()来返回预定义的值而不是当前的PC时间。

我所做的想要的是这样的:

Option Explicit

Public Function NowDefined() As Date

    'NowDefined = Now()
    NowDefined = Format("2016-01-15 15:01:01", "yyyy-MM-dd hh:mm:ss")

End Function

只需将整个代码Now()更改为NowDefined()

3 个答案:

答案 0 :(得分:3)

不是创建Function Now() As Date Now = DateSerial(2016, 1, 15) + TimeSerial(15, 1, 2) End Function 变量然后让Excel尝试将其转换为{{1}},而是最好生成实际开始日期:

{{1}}

答案 1 :(得分:2)

Vityataanswer有效,但它有点脆弱,可能会变得很麻烦:你必须记得在完成测试后删除或注释掉整个函数声明;并在需要进行更多测试时将其重新放入...然后在释放时再次将其删除......等等。

我会做这样的事情:

Const IN_TESTING_MODE As Boolean = True ' Set this to false when done testing

Function Now() As Date
    If IN_TESTING_MODE Then
        Now = ... 'whatever date you want
    Else
        Now = VBA.Now() ' back to default behavior
    End If
End Function

在这里你只需改变一个进入和退出测试模式的东西:常量IN_TESTING_MODE的值。您可以在其他函数中重用此常量,以及在测试时您想要不同的行为。

答案 2 :(得分:1)

实际上这有效:

Option Explicit

Public Function Now() As Date

    Now = Format("2016-01-15 15:01:01", "yyyy-MM-dd hh:mm:ss")

End Function