2017-04-05 2 views
6

Basierend auf der question von @Chips Ahoy gestellt, entschied ich mich, eine UDF zu erstellen, um den PercentRank der sichtbaren Zellen in einem Bereich zu finden.SpecialCells (xlCellTypeVisible) arbeitet nicht in UDF

Während @Chips mit meiner Syntaxkorrektur zufrieden scheint, kann ich meine UDF nicht richtig arbeiten lassen.

Wenn ich unten ausführen, lesen die beiden Adressen identisch lesen. In meinem Beispiel, das eine Formel von =VisiblePercentRank($A$2:$A$41,0.5) verwendet, lesen beide Adressen, die zum unmittelbaren Fenster ausgegeben werden, $A$2:$A$41, obwohl die Zeilen 3 bis 11 durch einen Autofilter verdeckt sind.

Code:

Function VisiblePercentRank(x As Range, RankVal As Double) 
    Debug.Print x.Address, x.Rows.SpecialCells(xlCellTypeVisible).Address 
    VisiblePercentRank = WorksheetFunction.PercentRank(x.Rows.SpecialCells(xlCellTypeVisible), RankVal) 
End Function 

Auch versucht.Rows Entfernung:

Function VisiblePercentRank(x As Range, RankVal As Double) 
    Debug.Print x.Address, x.SpecialCells(xlCellTypeVisible).Address 
    VisiblePercentRank = WorksheetFunction.PercentRank(x.SpecialCells(xlCellTypeVisible), RankVal) 
End Function 

Sollte der zweite Ausgang $A$2,$A$12:$A$41 nicht gelesen oder habe ich etwas verpasst?

Verwenden von Excel/Office 2013, 64bit auf Win7, 64bit.

BRAIN FRITTIERT UPDATE

ich gefunden habe, dass mein UDF funktioniert, wenn ich es aus dem sofortigen Fenster auszuführen:

?VisiblePercentRank(range("A2:A41"),0.5) 
$A$2:$A$41 $A$2:$A$11,$A$39:$A$41 
0.207 

Aber wenn von einer in-Zell-Formel von =VisiblePercentRank(A2:A41,0.5) laufen:

$A$2:$A$41 $A$2:$A$41 
+0

Entfernen Sie die 'Rows.':' x.SpecialCells (xlCellTypeVisible) .Address' –

+0

versucht, dass @ScottCraner, keine leider ändern. – CLR

Antwort

4

Es scheint, dass SpecialCells bekannt ist, in UDFs zu versagen. Einige Quellen: 1, 2, 3

Sie müssten Ihre eigene Funktion erstellen. so etwas wie dies vielleicht:

Function VisiblePercentRank(x As Range, RankVal As Double) 
    Debug.Print x.Address, VisibleCells(x).Address 
    VisiblePercentRank = WorksheetFunction.PercentRank(VisibleCells(x), RankVal) 
End Function 

Private Function VisibleCells(rng As Range) As Range 
    Dim r As Range 
    For Each r In rng 
     If r.EntireRow.Hidden = False Then 
      If VisibleCells Is Nothing Then 
       Set VisibleCells = r 
      Else 
       Set VisibleCells = Union(VisibleCells, r) 
      End If 
     End If 
    Next r 
End Function 
+2

Danke @CallumDA, das ist perfekt. Sieht so aus, als hätte Microsoft einen Fehler zu beheben und keinen Appetit darauf. – CLR