2015-04-28 49 views
2

我有一種情況,我希望函數「部分」易失性 - 即不穩定,直到它不再返回錯誤,此時不再計算它,除非其中一個爭論發生了變化(即標準的非骯髒波動)。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被調用。

+0

爲什麼你需要做到這一點? – Rory

+0

我有一個可怕的報告建立在'CubeValue'公式上。這些參數是通過參考「CubeMember」和「CubeSet」來計算的,這些CubeSet可以逐張查找來確定「CubeValue」的參數。根據我昨天提出的問題,「CubeSet」支持'CubeSet'的一套語法,但不支持'CubeValue'。我希望能夠編寫一個UDF,它將(使用我想使用的語法繼續計算'CubeSet',然後一旦計算出來,計算出應該使用支持的版本的語法,然後返回(然後停止揮發) – tobriand

+0

我不認爲你可以用'Volatile'來做。也就是說,據我所知,只有在編譯函數時才進行評估,而不是每次運行。 – Rory

回答

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內部,情況也是如此。

EDIT1:關閉揮發性

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 
+0

不幸的是,這是一個玩具的例子 - 我將要使用它是爲了避免執行大約100k其他昂貴的公式,如果我不需要。換句話說,我關心的是波動性(和相應的執行或不執行函數),而不是計數器(這只是作爲測試)。 – tobriand

+0

@tobriand然後將其設置爲false。看我的編輯。 – L42

+0

這似乎不起作用,至少在Excel 2010上。櫃檯仍然無限期地繼續前進。將揮發性聲明分解爲單獨的函數時也是如此(理論上它只有Application.Volatile,且每次只有一個值)。我能想到的唯一解釋是它更像編譯時設置,更像運行時設置。這很煩人! – tobriand