VBA sélection de cellules visibles après filtrage
Le code suivant applique des filtres et sélectionne le top 10 des éléments de la colonne B, après quelques filtres sont appliqués à la table. J'ai été en utilisant ce pour de nombreuses filtré de la sélection, mais je suis tombé sur un problème avec un de mes combinaisons de filtres.
J'ai constaté que quand il n'y a qu'un seul élément dans la colonne B, après filtrage, il ne copie pas qu'une cellule - à la place, il copie l'intégralité de la ligne et semble être un étrange sélection.
Quand j'ai ajouter manuellement un élément de plus à ce que le filtre (total 2), puis il le copie fine. Toutes les idées sur pourquoi ce code ne fonctionne pas quand il y a un seul élément?
Sub top10()
Dim r As Range, rC As Range
Dim j As Long
'Drinks top 10
Worksheets("OLD_Master").Columns("A:H").Select
Selection.sort Key1:=Range("H1"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Worksheets("OLD_Master").Range("A:H").AutoFilter Field:=4, Criteria1:=Array( _
"CMI*"), Operator:= _
xlFilterValues
Worksheets("OLD_Master").Range("A:H").AutoFilter Field:=5, Criteria1:="Drinks"
Set r = Nothing
Set rC = Nothing
j = 0
Set r = Range("B2", Range("B" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
For Each rC In r
j = j + 1
If j = 10 Or j = r.Count Then Exit For
Next rC
Range(r(1), rC).SpecialCells(xlCellTypeVisible).Copy
Worksheets("For Slides").Range("P29").PasteSpecial
Worksheets("OLD_Master").ShowAllData
End Sub
- Vous utilisez un
PasteSpecial
, mais où voulez-vous réel de faire la copie? - Si vous appliquez
Specialcells
à une seule cellule, il s'applique en fait à l'ensemble de la plage utilisée de la feuille. Vous devez tester le comte avant de l'utiliser. - Désolé à ce sujet - j'ai été le tester avec "select" à la place de la copie. Je l'ai changé maintenant
Vous devez vous connecter pour publier un commentaire.
Rory utilement souligne:
Maintenant, nous savons quel est le problème, on peut l'éviter! La ligne de code où vous utilisez
SpecialCells
:Au lieu de cela, définissez la plage d'abord, tester si elle ne contient qu'une seule cellule, puis de procéder...
Remarque, vous êtes en supposant qu'il en est de même un ligne est toujours visible. Il se pourrait que le
.End(xlUp)
sélectionne la ligne 1 s'il n'existe pas de données visibles, vous voudrez peut-être vérifier que les lignes qui c'est d'abord trop!De côté: Vous devriez vraiment être entièrement admissible vos gammes, c'est à dire au lieu de
Vous devez utiliser
Cela vous fera économiser de confusion erreurs à l'avenir. Il y a des raccourcis, vous pouvez prendre, par exemple, sauver la répétition à l'aide de
With
de blocs ou de déclarer les objets de la feuille.Merci à @Rory
Ne fonctionne pas avec une cellule sélectionnée. Adapté de la manière suivante:
......
Range(r(1), rC).SpecialCells(xlCellTypeVisible).Copy
?