2013-02-26 5 views
0

J'essaie de filtrer certaines cellules en fonction des valeurs d'une colonne, mais je crains que la première action de filtrage ne pollue le reste, bien que j'essaie de désactiver le filtre en définissant filtermode sur false.Le filtre automatique ne fonctionne pas correctement

Ma méthode de sélection ressemble à ceci:

Function GetRowRange(sheetRange, column, value) As Range 
'check for a valid section column 
sheetRange.AutoFilterMode = False 
sheetRange.UsedRange.AutoFilter Field:=column, Criteria1:=value 
Set GetRowRange = sheetRange.UsedRange.SpecialCells(xlCellTypeVisible) 
MsgBox ("col:" & column & " val: " & value & " rows:" & GetRowRange.Rows.Count) 
sheetRange.AutoFilterMode = False 
End Function 

Et du msgbox je peux voir que seuls les premiers retours des lignes

+0

D'une certaine manière, ce code semble familier! ;-) –

+0

@PeterAlbert Je pensais que je créerais un nouveau fil et ne profiterais pas de votre aide gentille :) – Jakob

Répondre

3

Ce problème est assez méchant! :-)

Le problème est qu'après l'application de l'Autofilter et .SpecialCells(xlCellTypeVisible), votre nouvel objet Range est composé de plusieurs plages combinées.

E.g. lors du filtrage de cette table pour B, enter image description here

votre objet plage aura 3 zones, chaque 1x2 cellules. Pour une raison étrange, Rows.Count ne prend pas en compte ces zones, donc Selection.Rows.Count est 1 si elle doit être 3. Toutefois, si vous en boucle sur l'énumération des lignes, il va fonctionner comme prévu:

lngCount = 0 
For Each r In Selection.Rows 
    lngCount = lngCount + 1 
Next 

Cette volonté return 3.

Donc, votre GetRowRange renverra la bonne plage, mais la routine .Rows.Count donnera le mauvais résultat. Utilisez cette fonction à la place:

Function RowCount(rngAreas As Range) As Long 
    Dim lngCount As Long 
    Dim rng As Range 
    For Each rng In rngAreas.Areas 
     lngCount = lngCount + rng.Rows.Count 
    Next 
    RowCount = lngCount 
End Function 

Juste une remarque: sachez que votre GetRowRange retournera également toujours la première ligne d'en-tête de votre table, donc gérer cette conséquence!

+0

Quel problème étrange, merci encore – Jakob

+0

En note, savez-vous si les fonctions d'Excel comme .CountiF sont affecté par ceci - j'ai ce bug bizarre, que quand je fais ceci sur une colonne, Field: = 2 cela fonctionne bien, mais quand Field: = 3 cela ne fonctionne pas, et je reçois seulement comme 2 ou 3 rangées retournées si Je cours .CountIf sur la colonne – Jakob

+0

ne sais pas. :-(peut-être essayer '.Subtotal'instead? –

Questions connexes