VBA如何宣布Volatility的运作方式

时间:2015-04-28 09:19:05

标签: excel vba excel-vba

我有一种情况,我希望功能是"部分" volatile - 也就是说,在它不再返回错误之前是不稳定的,此时它将不再被计算,除非它的一个参数发生变化(即标准的非脏波动)。

到目前为止,我已经尝试了三种方法,但没有一种方法可行。任何人都可以提出别的建议吗?

方法1: Application.Volatile在IF条件下

Public Function VolTest() As Long
    Static lngCounter as Long
    If lngCounter < 5 Then
        Application.Volatile
    End If
    lngCounter = lngCounter + 1
    VolTest = lngCounter
End Function

结果:计数器计数超过5(我相信它应该停在5)

方法2: Application.Volatile在单独的被调用函数中,并不总是被称为

Public Function VolTest() As Long
    Static lngCounter as Long
    If lngCounter < 5 Then
        lngCounter = VolTest_VolatileIncrememnt(lngCounter)
    Else
        lngCounter = VolTest_NonVolatileIncrememnt(lngCounter)
    End If
    VolTest = lngCounter
End Function

Public Function VolTest_NonVolatileIncrememnt(lngCounter As Long) As Long
    VolTest_NonVolatileIncrememnt = lngCounter + 1
End Function

Public Function VolTest_VolatileIncrememnt(lngCounter As Long) As Long
    Application.Volatile
    VolTest_VolatileIncrememnt = lngCounter + 1
End Function

结果:作为方法1

方法3: 传入当前单元格并设置脏(如果尚未到达)

Public Function VolTest(rngThis as Excel.Range) As Long
    Static lngCounter as Long
    If lngCounter < 5 Then
        rngThis.Dirty
    End If
    lngCounter = lngCounter + 1
    VolTest = lngCounter
End Function

结果:Excel挂起无限循环

我还尝试跟踪rngThis,其中参数是字符串而不是范围(范围通过Range(strThisCell)),在存储为ThisWorkbook属性的字典中,并且仅设置为脏尚未在函数中,它打破了无限循环,但一旦调用#VALUE!,也会返回rngThis.Dirty

1 个答案:

答案 0 :(得分:0)

第一个代码在我的最后工作,但您需要将计数器放在If Statement内,如下所示:

Public Function VolTest() As Long
    Static lngCounter As Long
    If lngCounter < 5 Then
        Application.Volatile
        lngCounter = lngCounter + 1
    End If
    VolTest = lngCounter
End Function

它仍然是不稳定的,但价值只会变为5。如果您在顶部声明Application.Volatile但又将计数器放在If Statement内,则相同。

编辑1:关闭易失性

Public Function VolTest() As Long
    Static lngCounter As Long
    If lngCounter < 5 Then
        Application.Volatile (True)
        lngCounter = lngCounter + 1
    Else
        Application.Volatile (False)
    End If
    VolTest = lngCounter
    MsgBox "Called" ' to test if it is turned off
End Function