2012-08-03 96 views
0
Sub TurnAutoFilterOn() 
'check for filter, turn on if none exists 
    If Not ActiveSheet.AutoFilterMode Then 
    ActiveSheet.Range("A1").AutoFilter 
    End If 
End Sub 

工作正常,打開AutoFilter。Excel VBA Autofilters裏面的功能

Function Req(ByVal MCode As String) As Integer 
    TurnAutoFilterOn 
End Function 

不起作用。

Function Req(ByVal MCode As String) As Integer 
'check for filter, turn on if none exists 
    If Not ActiveSheet.AutoFilterMode Then 
    ActiveSheet.Range("A1").AutoFilter 
    End If 
End Function 

不起作用。

是excel vba autofilters應該只在SUBs下工作,而不是在函數中?

+2

如果調用VBA中的函數,那麼它會工作,但如果你使用它作爲一個UDF則它不會工作,因爲UDF不會允許您更改自動篩選器,因爲它不允許您更改其他單元格的值 – 2012-08-03 10:09:21

+0

上述函數不是UDF .. – Ashok 2012-08-03 10:29:11

+0

我明白您的意思是UDF ...是我試圖從一個Excel單元格中調用該函數...從函數我試圖調用爲自動過濾器定義的SUB,仍然Excel不啓用自動過濾器。 – Ashok 2012-08-03 10:41:26

回答

1

上述評論者對於由單元調用的函數更新工作簿(即任何單元格)是正確的 - 它不被允許/不被支持。

Excel提供了一個工作簿重新計算模型,可以根據單元格公式預先計算單元間依賴關係。這允許(相對)高效地將變化從其原始源傳播到取決於它們的單元。它會重複傳播更改(即遞歸),直到它們傳播到其他公式中未引用的單元格爲止,此時工作簿中繼完成。它不允許單元格公式修改工作簿中的任何單元格;如果它支持它會有效地使預先計算的基於公式的依賴性分析失效(或至少大大削弱),並且需要另一種計算模型(這可能效率會更低)。 (對於此方法,圓形單元格引用(直接或間接)也存在問題,這使歷史函數有點棘手)。在下面的例子中,非常簡單的公共gx,但是這樣的數據結構幾乎可以有任何複雜性)。然後,您可以在使用事件重新計算工作簿之後使用該記錄的數據。工作表更改事件是在計算後運行某些代碼(您可以編寫子例程Worksheet_Calculate並將其放入工作表中)的方式,此時可以修改單元格。還有一個Workbook_SheetCalculation,它包含在ThisWorkbook的代碼中,這可能是有趣的。

在 「的ThisWorkbook」:

Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 
    MsgBox "gx=" & gx 
    Application.Worksheets("Sheet1").Range("A1") = gx 
End Sub 

在 「模塊1」:

Public gx As Long 

Function MyFormula(x As Long) As String 
    gx = x 
    MyFormula = "hello" 
End Function 

在Sheet1的單元格A5:

= MyFormula(A4)

你在gx被設置爲A4中的數字(顯示公式運行中的數據存儲)的上下文中彈出,mod開發一個工作表。現在,用另一個數字修改A4,您將看到結果,因爲更改A4會觸發重新計算。

(請注意,您還可能有興趣在Workbook_SheetChange事件作爲替代SheetCalculate事件。)

+0

有一件事我忘記提及,當您在由變更或計算觸發的事件中更改工作簿時,事件可能會再次觸發。因此,如果運行兩次,或者在第一次調用中放入一些代碼以清除狀態,那麼可以使用正常工作的代碼進行準備,因此後續調用可以測試該操作並且無需執行任何操作。 – 2012-08-07 02:20:23