我有一種情況,我希望函數「部分」易失性 - 即不穩定,直到它不再返回錯誤,此時不再計算它,除非其中一個爭論發生了變化(即標準的非骯髒波動)。VBA聲明Volatility如何工作
到目前爲止,我已經嘗試了三種方法,其中沒有一種可行。任何人都可以建議其他嗎?
方法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)
),在作爲T屬性存儲的字典中他的工作簿,只有設置髒,如果尚未在功能,打破無限循環,但也會返回#VALUE!
只要rngThis.Dirty
被調用。
爲什麼你需要做到這一點? – Rory
我有一個可怕的報告建立在'CubeValue'公式上。這些參數是通過參考「CubeMember」和「CubeSet」來計算的,這些CubeSet可以逐張查找來確定「CubeValue」的參數。根據我昨天提出的問題,「CubeSet」支持'CubeSet'的一套語法,但不支持'CubeValue'。我希望能夠編寫一個UDF,它將(使用我想使用的語法繼續計算'CubeSet',然後一旦計算出來,計算出應該使用支持的版本的語法,然後返回(然後停止揮發) – tobriand
我不認爲你可以用'Volatile'來做。也就是說,據我所知,只有在編譯函數時才進行評估,而不是每次運行。 – Rory