VBA/ Macro extraire automatiquement une plage de donnée filtrée [Résolu/Fermé]

Signaler
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016
-
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016
-
Bonjour, je bloque depuis quelque temps sur un moyen d'extraire automatiquement à partir d'une base de donnée située dans une feuille 1 les éléments d'une seule colonne de cette même base filtrée à partir d'un critère située en feuille 2 où se situe un tableau dans lequel je collerai dans la première colonne du tableau la plage copiée.

Je suis tombé sur un fichier excel qui contenait une macro qui correspondait à peu près à ma demande (voir fichier joint). La différence de cette macro est qu'elle extrait toutes les colonnes du tableau filtré ORDER vers SCHEDULE) et qu'elle ajoute 2 critères supplémentaires qui ne m'intéresse pas. J'ai tenté de retravaillé cette macro pour l'adapter à mon fichier mais ca ne fonctionne pas ( je découvre avec beaucoup de curiosité le codage VBA /Macro).

voici la macro que j'ai fait (dans la feuille destination) pour mon fichier à partir de la macro exemple :

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$U$319" Then
Range("A363", Range("A65536").End(xlUp)).ClearContents
With Sheets("base de données France")
.Range("A4").AutoFilter Field:=6, Criteria1:=Range("U319")
.Range("E5" & .Range("E65536").End(xlUp).Row).Cells.SpecialCells(xlCellTypeVisible).Copy Destination:=Range("A363")
End With

End If
End sub

Pouvez vous m'aider à partir d'une réadaptation du fichier joint à obtenir le résultat voulu, exemple extraire uniquement les valeurs filtrées de la colonne commande pour le gestionnaire affiché en B1 (feuille schedule).

Merci d'avance

PS comment faites vous pour inserer un fichier excel dans la discussion ?

4 réponses

Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
490
Bonjour,

Pour insérer un fichier :
https://www.commentcamarche.net/faq/29493-utiliser-cjoint-pour-heberger-des-fichiers#q=cjoint&cur=2&url=%2F

En attendant, tu peux essayer :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$U$319" Then
Range("A363", Range("A65536").End(xlUp)).ClearContents
With Sheets("base de données France")
.Range("A4").AutoFilter Field:=1, Criteria1:=Range("U319")
.Range("E5:E" & .Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Copy Destination:=Range("A363")
End With
End If
End Sub

A+
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

voici le fichier excel dont j vous parlais dans l'annonce. Au passage, merci Gyrus pour votre réponse et votre aide. Je vais voir de ce pas si celà fonctionne ;)

https://www.cjoint.com/c/EFpqYpfVuQu
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

en fait, dans le champ field de la macro, j'avais = 6 car je voulais que dans ma feuille 1, la colonne à filtrer selon le critère en U319 (année choisie) - feuille 2 - soit la colonne "année". Et je pensais par ailleurs que .Range("A4") était la ligne des entêtes de ma base de données
Bonjour

pour copier la colonne A Ex:
Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Copy

A+
Maurice
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

:( alors je sais pas si les espaces entrent en compte dans la ponctuation ou non
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

j crois avoir trouver les raisons du pb. j jette un oeil et j vous explique (si ca fonctionne ou non)
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

bon ca ne fonctionne tjs pas mais je vais essayer de vous apporter un peu plus d'info qui pourrais vous aiguiller pour resoudre ce pb. Dans la feuille où se trouve mon critère variable il y a un tableau comprotant des années. Cette feuille comporte une macro sous jacente :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Calculate
End Sub

cette fonction me permet de surligner la ligne du tableau (mise en forme conditionnelle) des que je clique dessus. J'ai également dans une celle (U319) intégré une fonction qui me permet d'obtenir l'année associé à la ligne surlignée du tableau dès que je clique sur ce tableau. Alors peut être en cliquant sur le tableau je pensais que cela annuler la macro extraction. Mais le soucis c que même si je clique au préalable sur le tableau avant de sortir et revenir sur la feuille pour la réactiver (et ainsi activer la macro) ca ne fonctionne pas. J'avais rencontrer ce pb pour une fonction enregistrer qui me copier des cellules d'une feuille (autre) et coller dans cette feuille de travail. Du coup j'avais trouver la solution de placer la ligne

Range( "cellule").select

juste avant de quitter la feuille, pour qu'ensuite en revenant dessus je n'avais plus qu'à coller sans selectionner l'endroit où coller les élements. Mais pour cette fonction je bloque.
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

par contre dans le fichier que je vous ai envoyé j'ai ouvert une nouvelle feuille afin d'essayer de m'entrainer à obtenir une seule colonne mais en saisissant vos modifications ca ne fonctionnent pas je passe en debugage
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

Range("A2", Range("A2").End(xlDown)).Select

cette formule fonctionne pour selectionner la colonne A de mon tableau le soucis est que c'est une macro qu'on execute manuellement. la transposer dans ma fonction est plus coriace.

Si vous avez eu le tps de vous pencher sur mon pb et que vous ayez decouvert la solution je vous en serai eternellement redevable ^^.

merci d'avance à ceux et celles qui prendront le tps de jeter un oeil à mes commentaires
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
490
Bonjour,

Un fichier pour t'entrainer :D
https://www.cjoint.com/c/EFqqueVYKTK

A+
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

criteria2:= range("U319") pardon
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

En fait si j'essaie de modifier la variable à filtrer il me plante excel
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

d'après mes recherches array signifie tableau. me trompe je ?
pouvez vous m'expliquer la signification de

array( 2, Format(Range("U319"), "mm/dd/yyyy"))

si je veux mettre des années comme variable ou un nom ou groupe (ex: gestion 1, 2 ou 3) que dois modifier dans array ?
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

e et pourquoi passez vous directement par criteria2 sans passer par criteria1 ? j suis dslé de vous embeter avec toutes ces questions c que je suis extrement curieux sur la manière dont vba fonctionne
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

merci d'avance pour votre patience et votre disponibilité
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
490
La plage source regroupe les données des colonnes A à H (PlageS).
L'instruction suivante permet d'appliquer un filtrage sur la colonne H (Field:=8) avec un critère date.
PlageS.AutoFilter Field:=8, Operator:=xlFilterValues,  Criteria2:=Array(2, Format(Range("U319"), "mm/dd/yyyy"))

Dans le tableau Array(2,...), l'indication "2" donne le niveau du filtre : 0 pour l'année, 1 pour le mois et 2 pour le jour)

Si tu changes le type de critère en U319, il est évident que le filtrage ne pourra pas s'effectuer.
Il faudra alors opter pour une autre instruction.

Le resize(,1) permet de réduire la PlageS à la première colonne (colonne A).

Si tu veux voir par quel code se traduisent les opérations de filtrage, je t'engage à utiliser l'enregistreur de macro.
Tu constateras qu'il existe de nombreuses possibilités.

A+
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

merci pour tes commentaires gyrus. c'est très technique en effet.
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

du coup la fonctin resize () peut elle nous permettre par exemple de choisir la colonne que l'on soutaite extraire ou le fait de mettre (,1) nous oblige à prendre la première colonne ?
Messages postés
3334
Date d'inscription
samedi 20 juillet 2013
Statut
Membre
Dernière intervention
9 décembre 2016
490 >
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

La fonction resize permet de dimensionner la plage.
Par exemple :
PlageS.resize(,1) pour une largeur de 1 colonne.

Le choix de la colonne peut être fait avec la fonction Offset.
Par exemple :
PlageS.Resize(, 1).Offset(0, 1) pour la colonne B.

A+
Messages postés
80
Date d'inscription
lundi 15 juin 2015
Statut
Membre
Dernière intervention
8 juin 2016

génial ! merci pour tous tes commentaires vraiment instructifs. Merci vraiment pour ton aide et tes conseils. A très bientot Gyrus