2011-03-05 69 views
1

我已經養成了通過更改單元格樣式來標記偏離數據的習慣。我想在excel中編寫一個UDF以獲取單元格的Range作爲輸入,並返回未標記爲異常值的那個範圍的子集。如何在Excel VBA中編寫UDF以篩選一系列單元格?

這是我曾嘗試:

Function ValidCells(rCells As Range) As Range 
    Dim c As Range 
    For Each c In rCells 
     If c.Style <> "Bad" Then 
      Set ValidCells = Range(c, ValidCells) 
     End If 
    Next 
End Function 

我的意圖是要能夠做到=Sum(ValidCells(A1:D1)),並只總結非樣式數據。

但是,ValidCells似乎每次都會返回一個空的範圍。我究竟做錯了什麼?

回答

1

你確定它返回一個空的範圍?當我嘗試運行這個時,VBA會在你的'Set'行上產生一個錯誤。如果您從工作表中將該例程作爲UDF調用,則不會看到VBA錯誤,但UDF應該停止執行並返回#VALUE !.

無論如何,你可以做你想做的,但有一個大的警告。首先,代碼:

Function ValidCells(rCells As Range) As Range 
    Dim valid As Range 

    Dim c As Range 
    For Each c In rCells 
     If c.Style <> "Bad" Then 
      If valid Is Nothing Then 
       Set valid = c 
      Else 
       Set valid = Union(valid, c) 
      End If 
     End If 
    Next 

    Set ValidCells = valid 
End Function 

想法是使用VBA的「聯合」方法建立一個多區域範圍。因此,例如,如果我在C8中放入一個壞單元格並調用ValidCells(B7:D9),則返回多區域範圍$ B $ 7:$ D $ 7,$ D $ 8,$ B $ 8:$ B $ 9, $ C $ 9:$ d $ 9然後你可以使用SUM的結果就好了。

需要注意的是,更改單元格樣式不會觸發此UDF重新計算。通常情況下,您可以添加如下行:

Call Application.Volatile(True) 

您的UDF,它會重新計算每個工作簿的更改。然而,改變單元格樣式似乎並不符合波動目的的「變化」。所以,你可以從UDF中得到你想要的東西,但是就重新計算而言,似乎沒有真正的方法使它像一個「常規」工作,即使你將其標記爲volatile。如果你使用它,你將不得不意識到這一點。

+0

是的,我發現重新計算問題時,我也嘗試了別的。感謝聯盟提示! – Eric 2011-03-05 16:44:46

相關問題