XL 2019 filtrage de données et recopie vers feuille

youpi457032

XLDnaute Occasionnel
Bonjour,
Je possède un fichier avec filtre des données de ma base de données ( je gère une asso)
Je souhaiterais que les resultats du filtre apparaissant dans ma liste box 1 de mon Userform 2 soient recopiés dans une feuille vierge.
Chaque nouvelle opération de filtrage devant nettoyer la feuille cible pour copier les nouvelles données actualisées.
Toutes les colonnes peuvent être recopiées...
ou idéalement les colonnes A, B, puis G,H,I, puis M,O,Q,S,U,W (de la BD)
ca donnerait NOM Prenom mail 1 Mail 2 Mail 3, cours 1 à 6...
Si qulequ'un peut m'aider à réaliser ce systeme de recopie après filtrage dans une nouvelle feuille.... ?
Merci d'avance.
Ci-joint un fichier anonymisé
 

Pièces jointes

  • filtre multicritères travail (4).xlsm
    772.9 KB · Affichages: 8

youpi457032

XLDnaute Occasionnel
Bonjour,
Malheureusement, il semblerait que le classeur ne soit pas "finalisé".
Il y a trop d'erreurs ou de corrections non effectuées dans le code de l'userform2 . o_O
Merci d'avoir essayé....
je sais qu'il y a des erreurs dans mon Fichier....
Est-ce que tu peux y jeter un oeil? J'ai bossé dessus toute la sainte après-midi et rien n'y fait !
J'ai l'impression que les erreurs se multiplient .Je suis reparti d'un fichier qui fonctionnait bien. Sauf qu'il a fallu que je change ma structure de base de données ... j'ai modifié ma base, en conséquence j'ai retravaillé mes userforms et les codes associés....
ca apparaissait simple, mais rien n'y fait ! je suis repassé et repassé et repassé sue cette fichue macro et je ne comprends pas où ça plante !! ,
J'ai une erreur 438 persistante.... qui le bloque....
je n'arrive pas dans mon userform formulaires à récupérer mes listes deroulantes
les choix de liste déroulantes sont définies en feuille références "critères"....
mon formulaire élève s'ouvre, mais si je veux acceder aux listes déroulantes il me plante avec ce code erreur objet 438
Peut tu m'aider ??? 😥😥😥😥😥
 

Pièces jointes

  • CLsCAsYoupi457032.xlsm
    806.9 KB · Affichages: 1

Dranreb

XLDnaute Barbatruc
Bonsoir.
La macro plante sur cette instruction :
VB:
    If Controls("T" & i).ListIndex <> -1 Then
de la Private Sub PrixCoursAdulte() parce que i vaut 13, T13 est une TextBox non visible du Frame2 et qui n'a donc pas de propriété ListIndex. Vous êtes résolu à tourner en rond encore longtemps avant de changer vos noms de contrôles comme je vous le dit dans ce message auquel vous n'avez pas répondu ?
 

youpi457032

XLDnaute Occasionnel
Bonsoir.
La macro plante sur cette instruction :
VB:
    If Controls("T" & i).ListIndex <> -1 Then
de la Private Sub PrixCoursAdulte() parce que i vaut 13, T13 est une TextBox non visible du Frame2 et qui n'a donc pas de propriété ListIndex. Vous êtes résolu à tourner en rond encore longtemps avant de changer vos noms de contrôles comme je vous le dit dans ce message auquel vous n'avez pas répondu ?
Bonsoir,
bon, j'ai avancé" ....
par contre j'ai encore une incohérence.... En laissant mes "T" ça fonctionne... ça a toujours fonctionné par le passé....
Sauf dans le frame "évènements" qui possède pourtant les mêmes caractéristiques que le frame "cours"
Mon frame "cours" focntionne parfaitement. Mes combo sont fonctionnelles.
[For I = 14 To 19 'contrôle références cours
Controls("T" & I).List = Feuil3.Range("A2:A" & Feuil3.Range("A" & Rows.Count).End(3).Row).Value
Next I ] .... là c'est OK
Dans mon frame "évènement" , sur la base du mème principe j'ai une erreur.... je ne comprends pas pourquoi...
[For I = 25 To 30 'contrôle références évènement
Controls("T" & I).List = Feuil3.Range("M2:M" & Feuil3.Range("M" & Rows.Count).End(3).Row).Value
Next I ] là c'est pas bon .....
Je ne cherche pas à m'entêter sur mes appellations en Txxxx,
pour autant je ne comprends pas pouquoi sur le même principe, avec les mêmes macros, des combo fonctionnent et d'autres pas.....
Je joins le fichier en cours....
 

Pièces jointes

  • formulaire élèves.xlsm
    759.3 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
Je ne vois pas d'initialisation des listes des ComboBox du Frame évènements.
Mais si vous ne voulez pas renommer vos contrôles avec un trigramme CBx ou TBx suivi d'une partie mnémonique, puis éventuellement d'un 1 si c'est le premier d'une petite série, ni utiliser les intitulés de colonnes, je ne plongerai plus dans votre programmation.
 

youpi457032

XLDnaute Occasionnel
Je ne vois pas d'initialisation des listes des ComboBox du Frame évènements.
Mais si vous ne voulez pas renommer vos contrôles avec un trigramme CBx ou TBx suivi d'une partie mnémonique, puis éventuellement d'un 1 si c'est le premier d'une petite série, ni utiliser les intitulés de colonnes, je ne plongerai plus dans votre programmation.
bonsoir,
ne nous fachons pas trop vite.....
je ne suis pas un pro du VBA.... j'avance avec mes petites connaissances...
tout cela me parait bien complexe....
je finirai par renommer mes contôles (beaucoup plus lisible)....c 'est évident...
J'ai réussi à faire ce que je voulais, ca n'a pas été de la tarte.... j'y suis arrivé... Je vais donc pas à pas pouvoir changer tous mes intitulés de contrôle ( pour eviter de faire des conneries).....
*Je vous joins mon fichier bien avancé et qui enfin fonctionne !!!
Je me dois avant tout de vous remercier ! c'est bien grâce à vous !!!!
il me reste une dernière étape....
Avec ce fichier l'utilité finale de l'userform filtre est de pouvoir envoyer des mails ciblés.
Après filtrage, mes résultats viennent s'afficher dans ma ListBox1.
A partir de là je voudrais recopier les données filtrées sur un onglet "Résultats du Filtre", en extraire les adresses mails sans doublon, les exporter directement vers outlook. Pour cela j'avais une macro qui le faisait. Mais je suis bien incapable de l'adapter à mon nouveau filtre .
L'ancienne macro je l'ai écrite dans un module "envoyer_mail"...
Si vous n'êtes pas trop fâché, pouvez vous m'aider à l'adapter à mon nouveau filtre ??
Merci d'avance....
De mon côté je vais renommer me CA.add, listbox....combox....etc pour plus de lisibilté....
 

Pièces jointes

  • formulaire élèves.xlsm
    776 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
Je ne vois pas d'UserForm filtre dans votre dernier classeur joint.
Donc je suppose que vous voulez le créer ?
Vous pouvez appliqué à peu près la même Sub UserForm_Initialize avec des ComboBox pour tout ce sur quoi vous voulez pouvoir filtrer. La Sub CL_Résultat est exécutée chaque fois qu'il y a des lignes correspondant aux chois effectués dans une ou plusieurs ComboBox dont il a la charge. Comme le but est différent on ne sort plus si UBound(Lignes) > 1 mais on explore ce tableau des numéros de lignes pour remplir une ListBox.
Attention je n'ai pas Outlook et je suis donc obligé de supprimer la référence manquante chaque fois que je veux tenter une compilation ou une exécution.
 

youpi457032

XLDnaute Occasionnel
Bon jour,
Alors le filtre existe. IL s'agit de l'userform2 que je viens de nommer Filtre.
Sur ce filtre qui fonctionne parfaitement, j'ai créé un bouton " Contacter la Sélection par mail". C'est à partir de ce bouton que je souhaite lancer ma fonction mail.
Deux possibiltés : je ne sais pas quelle est la meilleur.
_ soit on extraie les données de la listBox qui reçoit les données filtrées et on les recopie vers une feuille à part nommer " Resultat du Filtre".... puis on fait travailler la macro mail depuis cette feuille à partir des resultats extraits. *c'est ce que la macro que j'avais lusqu'à présent faisait...
- soit une seconde solution, et là je ne sais pas si c'est techniquement faisable, on extrait avec la macro directement depuis la la listbox les adresses mail (trois colonnes concernées dans la "BD" (mail élève, mail mamaman, mail papa)...
Je ne sais qu'elle soliution est la plus adaptée ? qu'en pensez vous ? et comment mettre en oeuvre tout cela ?
Je rejoins le fichier.....
Merci beaucoup....
J'espère que je suis assez clair dands mes explications et / ou demandes ....🤔🤔
A plus tard....
 

Pièces jointes

  • formulaire élèves.xlsm
    764 KB · Affichages: 4

Dranreb

XLDnaute Barbatruc
D'habitude je m'établit toujours une liste des numéros des lignes retenues de la base de départ comme ça je peux l'utiliser après comme je veux. Je ne repars jamais d'une ListBox. Est-il nécessaire de pouvoir spécifier plusieurs cours, professeurs etc. ? Parce que je n'ai pas d'outils tout faits pour extraire les numéros de lignes concernés par des sélections multiples dans une ListBox, seulement pour une seule sélection dans une ComboBox.
En revanche j'ai étudié ce matin de quoi établir un Sujet à partir de plusieurs colonnes espacées régulièrement :
VB:
Function SujMultiCol(ByVal Src, ByVal CDéb As Integer, ByVal CFin As Integer, _
   Optional ByVal Pas As Integer = 1, Optional ByVal Format As String)
   Dim TDon(), LDon As Long, CDon As Long, LAuxMax As Long, LAux As Long, TAuxClé(), TAuxLgn() As Long, _
      Sujet, LesListes(), N As Long, TLgn() As Long, L As Long
   If TypeOf Src Is Excel.Range Then TDon = Src.Value Else TDon = Src
   For LDon = 1 To UBound(TDon, 1): For CDon = CDéb To CFin Step Pas
      If Not IsEmpty(TDon(LDon, CDon)) Then LAuxMax = LAuxMax + 1
      Next CDon, LDon
   ReDim TAuxClé(1 To LAuxMax, 1 To 1), TAuxLgn(1 To LAuxMax)
   For LDon = 1 To UBound(TDon, 1): For CDon = CDéb To CFin Step Pas
      If Not IsEmpty(TDon(LDon, CDon)) Then
         LAux = LAux + 1: TAuxClé(LAux, 1) = TDon(LDon, CDon): TAuxLgn(LAux) = LDon
         End If: Next CDon, LDon
   Sujet = SujetCBx(TAuxClé, Format:=Format)
   LesListes = Sujet(1)
   For N = 0 To UBound(LesListes): TLgn = LesListes(N)
      For L = 1 To UBound(TLgn): TLgn(L) = TAuxLgn(TLgn(N)): Next L
      LesListes(N) = TLgn: Next N
   SujMultiCol = Array(Sujet(0), LesListes)
   End Function
À tester.
Techniquement un sujet n'est pas un objet. C'est un Array à 2 éléments, 0 et 1, le 0 étant une table classée et sans doublon des clés, c'est à dire des valeurs de la colonne traitée, pouvant être affectée à une propriété List de ComboBox ou de ListBox, le 1 une table des listes de numéros des lignes possédant chaque clé.
 

youpi457032

XLDnaute Occasionnel
D'habitude je m'établit toujours une liste des numéros des lignes retenues de la base de départ comme ça je peux l'utiliser après comme je veux. Je ne repars jamais d'une ListBox. Est-il nécessaire de pouvoir spécifier plusieurs cours, professeurs etc. ? Parce que je n'ai pas d'outils tout faits pour extraire les numéros de lignes concernés par des sélections multiples dans une ListBox, seulement pour une seule sélection dans une ComboBox.
En revanche j'ai étudié ce matin de quoi établir un Sujet à partir de plusieurs colonnes espacées régulièrement :
VB:
Function SujMultiCol(ByVal Src, ByVal CDéb As Integer, ByVal CFin As Integer, _
   Optional ByVal Pas As Integer = 1, Optional ByVal Format As String)
   Dim TDon(), LDon As Long, CDon As Long, LAuxMax As Long, LAux As Long, TAuxClé(), TAuxLgn() As Long, _
      Sujet, LesListes(), N As Long, TLgn() As Long, L As Long
   If TypeOf Src Is Excel.Range Then TDon = Src.Value Else TDon = Src
   For LDon = 1 To UBound(TDon, 1): For CDon = CDéb To CFin Step Pas
      If Not IsEmpty(TDon(LDon, CDon)) Then LAuxMax = LAuxMax + 1
      Next CDon, LDon
   ReDim TAuxClé(1 To LAuxMax, 1 To 1), TAuxLgn(1 To LAuxMax)
   For LDon = 1 To UBound(TDon, 1): For CDon = CDéb To CFin Step Pas
      If Not IsEmpty(TDon(LDon, CDon)) Then
         LAux = LAux + 1: TAuxClé(LAux, 1) = TDon(LDon, CDon): TAuxLgn(LAux) = LDon
         End If: Next CDon, LDon
   Sujet = SujetCBx(TAuxClé, Format:=Format)
   LesListes = Sujet(1)
   For N = 0 To UBound(LesListes): TLgn = LesListes(N)
      For L = 1 To UBound(TLgn): TLgn(L) = TAuxLgn(TLgn(N)): Next L
      LesListes(N) = TLgn: Next N
   SujMultiCol = Array(Sujet(0), LesListes)
   End Function
À tester.
Techniquement un sujet n'est pas un objet. C'est un Array à 2 éléments, 0 et 1, le 0 étant une table classée et sans doublon des clés, c'est à dire des valeurs de la colonne traitée, pouvant être affectée à une propriété List de ComboBox ou de ListBox, le 1 une table des listes de numéros des lignes possédant chaque clé.
Re,
Merci de vous pencher sur le problème....
Alors non, il n'est pas indispensable d'afficher plusieurs cours dans l'extraction. Une fois filtré dans ma listbox, ce qui m'intéresse c'est d'envoyer des mails aux seules personnes concernées par le résultat du filtre. L'essentiel ne porte pas sur les cours à cette étape, mais sur les adresses mails. Je dois pouvoir récupérer toutes les adresses sans doublon listées dans le résultat du filtre ( ListBox1)....
par contre oui j'ai besoin d'utiliser tous les critères de filtres en même temps....
D'où l'idée de filtrer avec une ou plusieurs conditions..... (cours, puis prof, lieu....etc)....
le filtre produit son résultat en Listbox.... Je pense que l'idée c'est d'extraire les données qui sont dans le sous formulaire listbox, pourquoi pas vers une autrre feuille.....
puis au départ de cette nouvelle feuille, récupérer sans doublon toutes les adresses mail listées ( sur les trois colonnes de mail concernées : elève, papa, maman)....
en plus simple peut-être :
ETape 1 : je filtre en fonction de mes critère :
Etape 2 : j'exrtraie les données de la ListBox
Etape trois: je récupère les adresses mails ( 3 colonnes concernées) après filtrage pour les envoyer dans Outlook en To, ou Cc...
L'ancienne macro que j'ai réécrite dans le module _envoyer_mail, le faisait très bien....
Je suis juste incapable de l'adapter à mon nouveau filtre.
Je vais regarder ce que vous me proposer, un peu plus tard dans la soirée. Je bosse de nuit....
Je reviens vers vous en temps utile....
UN grand merci.....
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Donc toujours les lignes d'un seul cours et/ou un seul professeur etc. ?
Dans ce cas on peut remplacer les ListBox par des ComboBox et les faire prendre en charge par un ComboBoxLiées. Ne pas spécifier de colonne aux CL.Add mais implanter une Private Sub CL_SujBdDPersoSVP(ByVal CBM As ComboBoxMmbr) dans laquelle on fera CBM.SujetBdD = SujMultiCol(CL.PlgTableau, ColonneDébut, ColonneFin, Incrémentation)
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Informations :
1) — Quelques tests de ma Function SujMultiCol donne des résultat encourageants. Il y a cependant une erreur dans le code posté au #10 vers la fin: il faut TLgn(L) = TAuxLgn(TLgn(L)) et non TAuxLgn(TLgn(N))
2) — J'ai redécouvert qu'il existe une Sub ÉtablirTLgnLBx(TLgn() As Long, ByVal LBx As MSForms.ListBox, ByVal Sujet) dans CLsCAs qui retrouve les numéros de lignes attachés aux lignes sélectionnées dans une ListBox à sélections multiples. Elle n'est toutefois pas employée par l'objet ComboBoxLiées. Si donc il en faut finalement quand même il faudrait se farcir l'établissement de la liste des numéros de lignes présents dans toutes les sélections comme il le fait.
Ne vous tracassez pas pour ce qu'on en fait en aval: La ListBox résultant du filtre est établie à partir du TblBD et de la liste des numéros de lignes obtenue, et l'exportation vers une autre feuille aussi. Pour cette dernière on ne repart pas de la ListBox. La ListBox et l'exportation pourrait très bien comporter des colonnes de la TblBD différentes.
 

Dranreb

XLDnaute Barbatruc
J'ai quand même écrit en attendant le filtre avec les ListBox à sélections multiples.
vérifiez si ça fonctionne car je crois que votre version du CLsCAs est un peu ancienne.
Je n'est pas fait la partie Mail. Faite une boucle utilisant TblBD et TLFiltr comme la fin de Affiche.
 

Pièces jointes

  • CLsCAsYoupi457032.xlsm
    769.2 KB · Affichages: 5

youpi457032

XLDnaute Occasionnel
Bonsoir,
Merci pour la réécriture du Filtre ca fonctionne parfaitement bien. C'est vraiment une autre façon d'aborder le VBA. Beaucoup plus digeste que mon écriture à moi.... C'est certain. Ca entend de comprendre des fonctions que je ne mairtrise pas encore vraiment bien.... Je me fais pencher sur votre écriture, et comprendre comment tout ceal fonctionne.... Donc un grand merci avant toute chose !
Ne me reste plus qu'à adapter ma macro mail !
 

Discussions similaires

Statistiques des forums

Discussions
294 412
Messages
1 938 340
Membres
188 785
dernier inscrit
michelle40000