2014-04-12 147 views
0

我很新VBA 我有一個Excel範圍的細胞將不斷自動過濾和一個只考慮可見(過濾)細胞的COUNTIFS UDF幫助我很大。 我發現這個代碼似乎是我需要的,但它只適用於COUNTIF,而不適用於COUNTIFS 如果有人對如何修改它以使其成爲COUNTFS,有任何想法,那將是超級大氣!VBA修改Excel COUNTIFS UDF

Function Vis(Rin As Range) As Range 
'Returns the subset of Rin that is visible 

    Dim Cell As Range 
    Application.Volatile 
    Set Vis = Nothing 

    For Each Cell In Rin 
     If Not (Cell.EntireRow.Hidden Or Cell.EntireColumn.Hidden) Then 
      If Vis Is Nothing Then 
       Set Vis = Cell 
      Else 
       Set Vis = Union(Vis, Cell) 
      End If 
     End If 
    Next Cell 
End Function 

Function COUNTIFv(Rin As Range, Condition As Variant) As Long 
'Same as Excel COUNTIF worksheet function, except does not count 
'cells that are hidden 

    Dim A As Range 
    Dim Csum As Long 
    Csum = 0 

    For Each A In Vis(Rin).Areas 
     Csum = Csum + WorksheetFunction.CountIf(A, Condition) 
    Next A 

    COUNTIFv = Csum 
End Function 
+0

你有沒有考慮過使用'SUBTOTAL' - 這可以應用一系列的數學函數(包括計數)到一個範圍,並可以選擇處理所有或僅可見的單元格 –

+0

不,我沒有,但我會試一試!任何指針? – bibs

回答

0

你可以做到這一點做這樣的事情......

考慮到你有diferent範圍與diferent條件下測試:

Function COUNTIFSv(Rin1 As Range, Condition1 As Range, Optional Rin2 As Range, Optional Condition2 As Range, Optional Rin3 As Range, Optional Condition3 As Range) As Long 
    'Same as Excel COUNTIF worksheet function, except does not count 
    'cells that are hidden 

    Dim Csum As Long 
    Csum = 0 

    If Not IsMissing(Rin3) AND Not IsMissing(Condition3) Then 
     Csum = Csum + WorksheetFunction.CountIfs(Vis(Rin1),Condition1,Vis(Rin2),Condition2,Vis(Rin3),Condition3) 
    ElseIf Not IsMissing(Rin2) AND Not IsMissing(Condition2) Then 
     Csum = Csum + WorksheetFunction.CountIfs(Vis(Rin1),Condition1,Vis(Rin2),Condition2) 
    Else 
     Csum = Csum + WorksheetFunction.CountIfs(Vis(Rin1),Condition1) 
    End If 

    COUNTIFSv = Csum 
End Function 

,或者你可以測試不同的同一範圍agains條件:

Function COUNTIFSv(Rin As Range, Condition1 As Range, Optional Condition2 As Range, Optional Condition3 As Range) As Long 

    Dim Csum As Long 
    Csum = 0 

    If Not IsMissing(Condition3) Then 
     Csum = Csum + WorksheetFunction.CountIfs(Vis(Rin),Condition1,Vis(Rin),Condition2,Vis(Rin),Condition3) 
    ElseIf Not IsMissing(Condition2) Then 
     Csum = Csum + WorksheetFunction.CountIfs(Vis(Rin),Condition1,Vis(Rin),Condition2) 
    Else 
     Csum = Csum + WorksheetFunction.CountIfs(Vis(Rin),Condition1) 
    End If 

    COUNTIFSv = Csum 
End Function 
+0

對不起,它似乎沒有工作。我在相同的範圍內對一個正常的COUNTIFS進行了測試,並且COUNTIFS給出了正確的結果,而COUNTIFSv是VALUE !.我試着評估,但沒有幫助。另外,當我提出公式時,它並不要求爭論,我不知道UDF是否正常。還是要謝謝你的幫助!如果可以的話,在你的最後測試一下,如果它有效,那意味着我做錯了什麼:) – bibs