2013-08-27 182 views
2

我在使用VBA中的過濾範圍時遇到問題。 如果我使用宏來過濾範圍,然後使用另一個調用小計工作表函數來查找第一列中的最小值,我得到過濾範圍的預期最小值;這就是我要的。這如下所示:在VBA中過濾範圍

Sub TestFilterTrans() 
    Call FilterTrans("111Wall") 
End Sub 

Sub TestMinDate() 
    MsgBox MinTransDate() 
End Sub 

Sub FilterTrans(Inv As String) 
    Range("TransLabels").Select 
    Selection.AutoFilter 
    ActiveSheet.Range("Trans").AutoFilter Field:=2, Criteria1:=Inv 
End Sub 

Function MinTransDate() 
    MinTransDate = Application.WorksheetFunction.Subtotal(5,  Worksheets("Transactions").Range("TransDates")) 
End Function 

然而,如果從片材,我調用一個函數來首先調用濾波器程序,然後調用一個函數來找到最小值,它的整個範圍內選擇最小,如下所示:

Function IncepDate(Inv As String) 
    Dim d As String 
    Call FilterTrans(Inv) 
    d = MinTransDate() 
    Call FilterOff 
    IncepDate = d 
End Function 

有誰能告訴我爲什麼過濾器在第二種情況下似乎不起作用嗎?

+1

通常,函數只是返回一個值,並且不會在工作表上進行其他更改。您可能需要使用Sub而不是Function來操作過濾器。 –

+0

「從一張表」是這個問題的根源,我認爲。看到我的回答如下:) –

回答

0

函數不應該操縱工作表對象。這裏有幾個關於該主題的問題,但共識是從工作表函數內調用子例程來操作工作表對象是一個壞主意。

我通過一些類似的代碼來嘗試和複製這一點。

代碼執行時沒有錯誤,但是如果逐步執行,您將看到自動過濾器從未實際應用。

我相當肯定這是設計,雖然錯誤/警告信息會很好。

我在一個類似的問題之前的評論:

Cells reference not working in Excel VBA 2010 Function

這是不可能的從從工作表名爲UDF操作工作表單元格。

點擊此處瞭解詳情:

https://stackoverflow.com/a/15647054/1467082

在這裏:

http://www.excel-it.com/UDF.htm

一般,子程序可以操縱的工作表,和功能不能。

例外情況是從子程序(有時)中調用的函數可以,但是這可能是一個壞的習慣,除了將值返回給子例程外,其他任何函數都可能使用該函數。

而且,很多關於這個文件從微軟:

http://support.microsoft.com/kb/170787

通過公式工作表單元格稱爲用戶定義函數不能 變化的Microsoft Excel的環境。這意味着這種 函數不能執行以下任何操作:

  • 插入,刪除或格式化電子表格中的單元格。
  • 更改另一個單元格的值。
  • 移動,重命名,刪除或將工作表添加到工作簿。
  • 更改任何環境選項,例如計算模式或屏幕視圖。
  • 將名稱添加到工作簿。
  • 設置屬性或執行大多數方法。

的用戶定義函數的目的是允許用戶創建不包括在與 Microsoft Excel中附帶的功能 自定義函數。包含在Microsoft Excel中的功能也不能 更改環境。函數可以執行一個計算,即 將一個值或文本返回給它們輸入的單元格。 任何環境更改都應通過使用Visual Basic Basic子例程進行。

在計算過程中,Excel會檢查 包含用戶定義函數的單元格的先例。如果在計算過程中迄今爲止計算出的所有先例都不是 ,則Excel最終將調用用戶定義的函數並將空或空單元傳遞給函數 函數。然後,Excel會確保爲所有要計算的先例發生足夠的計算過程 。在最終計算 通過期間,用戶定義的函數將傳遞 單元格的當前值。這可能會導致用戶定義的函數被調用的次數比預期的要多,並且帶有意外的參數。因此,用戶定義的函數可能會返回意外的值 。

爲了正確計算,所有在計算 中使用的範圍應作爲參數傳遞給函數。如果您沒有通過 計算範圍作爲參數,而不是在函數的VBA代碼中引用範圍 ,Excel無法在計算引擎中將它們計入 。因此,Excel可能不會充分計算工作簿以確保在計算用戶定義的函數之前計算所有先例 。

+0

根據上面的答案,我改變了從一個函數調用到一個子程序,這解決了這個問題。 – user1787425

+0

請考慮將此答案標記爲「已接受」,因爲它解決了您的問題。 –