OVH Cloud OVH Cloud

Copie issue de filtre élaboré

5 réponses
Avatar
Péhemme
Bonsoir à Toutes et à Tous,

Je souhaite recopier dans une feuille différente, le résultat (les lignes
visibles) d'un filtre élaboré.
Pour ce faire, j'ai écrit (inspiré d'un post du 18/10/2003 de Denis Michon),
mais cela "coince" au niveau du copier.

Dim Rg As Range
With Worksheets("BasedeDonnées")
Set Rg = .Range("_FilterDatabase")
Set Rg = Rg.Resize(Rg.Rows.Count - 1).Offset(1).SpecialCells
(xlCellTypeVisible)
Rg.Copy Worksheets("Archive").Range("a65536").End(xlUp).Row + 1
'<== Ligne qui coince
End With

Set Rg = Nothing

Au moment où ces lignes de commande s'exécutent, toutes les feuilles
concernées sont visibles.
Problème de syntaxe ?

Merci d'avance de votre aide

Michel

5 réponses

Avatar
michdenis
Bonjour Péhemme,

Cette ligne de code s'applique UNIQUEMENT dans le cas d'un filtre automatique.

"Set Rg = .Range("_FilterDatabase")"

La raison, c'est à cause de de ce truc. (_FilterDatabase). Ceci est si l'on veut le nom qu'excel donne automatiquement à
la plage de cellule (non le résultat du filtre) sur lequel s'est effectué le dernier filtre automatique sur une feuille.
Ce nom demeure même si tu as enlevé le filtre et tu as refermé excel. Lorsque tu ouvriras ton classeur à nouveau,
("_FilterDatabase") est encore valide et désigne toujours le nom de la dernière plage de cellules sur lequel le dernier
automatique a été exécuté. Pour modifier cette plage désignée par ("_FilterDatabase"), il faut simplement exécuter un
nouveau filtre automatique.

Et pas besoin de vérifier, il n'apparaît pas dans la liste de "Nom" du menu barre des menus / insertion / nom / définir
/

Comme tu utilises ("_FilterDatabase") dans un filtre élaboré, la procédure ne tient plus !

et si le code ne bloque pas à cette ligne de code :
Set Rg = Rg.Resize(Rg.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)

je présume que ta feuille a déjà eu un filtre automatique sinon Rg serait égal à Nothing et la ligne de code ne fait
plus de sens.


Salutations !




"Péhemme" a écrit dans le message de news: 41a8c3eb$0$784$
Bonsoir à Toutes et à Tous,

Je souhaite recopier dans une feuille différente, le résultat (les lignes
visibles) d'un filtre élaboré.
Pour ce faire, j'ai écrit (inspiré d'un post du 18/10/2003 de Denis Michon),
mais cela "coince" au niveau du copier.

Dim Rg As Range
With Worksheets("BasedeDonnées")
Set Rg = .Range("_FilterDatabase")
Set Rg = Rg.Resize(Rg.Rows.Count - 1).Offset(1).SpecialCells
(xlCellTypeVisible)
Rg.Copy Worksheets("Archive").Range("a65536").End(xlUp).Row + 1
'<== Ligne qui coince
End With

Set Rg = Nothing

Au moment où ces lignes de commande s'exécutent, toutes les feuilles
concernées sont visibles.
Problème de syntaxe ?

Merci d'avance de votre aide

Michel
Avatar
AV
Un rappel de qques principes concernant le filtre élaboré :
** Les données et la zone de critère peuvent être sur des feuilles différentes
du classeur
** Pour faire une extraction sur une autre feuille que celle contenant les
données il faut lancer la procédure à partir de la FEUILLE CIBLE

Exemple simplifié (à adapter) avec les données en A1:Cx de Feuil1, la zone de
critère en A1:A2 de Feuil2
Tu souhaites extraire en A1 de Feuil3

Sub zzz()
Application.Goto [Feuil3!A1]
[Feuil1!A1].CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=[Feuil2!A1:A2], CopyToRange:=[A1]
End Sub

AV
Avatar
Péhemme
Denis et Alain,
je vous souhaite le bonjour.

Votre efficacité a encore frappé.
Il y a des moments dans la vie où le mot merci devient un peu fade par
rapport à la joie réelle procurée par de nouvelles découvertes.
Malgré sa fadeur dans le cas présent je vous dis MERCI à l'un et à l'autre.
Maintenant, je peux vous assurer que vous allez être bombardés de
questions... ;-))

D'abord merci, pourquoi ?
Simplement parce que :
1°) j'ai découvert que le filtre automatique pouvait être personnalisé par
l'utilisation de plusieurs critères (la vraie question : pourquoi ne l'ai-je
pas vu plus tôt ?)
2°) j'ai fait fonctionner ma "copie, puis destruction des lignes d'origine"

Ensuite les questions :
1°) Pourquoi, après avoir "retaillé" (resize) la plage d'extraction (et
copié celle-ci dans une page de destination) je dois de nouveau retailler
cette plage d'extraction pour supprimer les lignes filtrées.
Sh1.Range("_FilterDatabase").Resize(Sh1.Range("_FilterDatabase") _
.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy Dest
puis :
Sh1.Range("_FilterDatabase").Resize(Sh1.Range("_FilterDatabase") _
.Rows.Count -
1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
ce qui fonctionne parfaitement bien, mais je ne comprends pas pourquoi
("_FilterDatabase") ne conserve pas sa nouvelle dimension avec laquelle on
pourrait continuer de travailler (et économiser une ligne de code).
Sh1.Range("_FilterDatabase").EntireRow.Delete
mais cela me supprimait mes étiquettes.
2°) quelle est la différence fondamentale entre un filtre automatique
personnalisé et un filtre élaboré ?

Voyez, maintenant, c'est vous qui avez des problèmes...
;-)))

Bien amicalement

Michel
Avatar
AV
2°) quelle est la différence fondamentale entre un filtre automatique
personnalisé et un filtre élaboré ?


* Le filtre auto personnalisé est limité à 2 critères
* Le filtre élaboré n'a pas cette limite en offrant, de plus, la possiblité de
critères calculés
Ca ouvre(devrait ouvrir) des horizons....

AV

Avatar
Péhemme
Merci Alain pour ces explications.
Bien amicalement
Michel

"AV" a écrit dans le message de news:

2°) quelle est la différence fondamentale entre un filtre automatique
personnalisé et un filtre élaboré ?


* Le filtre auto personnalisé est limité à 2 critères
* Le filtre élaboré n'a pas cette limite en offrant, de plus, la
possiblité de
critères calculés
Ca ouvre(devrait ouvrir) des horizons....

AV