我有一种情况,我希望功能是"部分" 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
。
答案 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