filtrage automatique sur excel par bouton et action VBA

filtrage automatique sur excel par bouton et action VBA - VB/VBA/VBS - Programmation

Marsh Posté le 18-11-2009 à 20:35:19    

Bonsoir,
 
Je ne suis nul en matière de VBA et malgré toutes mes recherches sur ce forum, je n'ai pas trouvé de réponse a un problème très simple je pense.
 
Je cherche a automatiser une fonction de filtrage actif de données par une action sur des boutons positionnées en regard d'un tableau de synthèse de ces mêmes données.
 
Le plus simple est de voir l'exemple que j'ai fait:
 
http://cjoint.com/?lsuDVv3Xwj
 
Au dela de votre aide ponctuelle pour laquelle je vous remercie, pouvez-vous me donner les explications pas a pas des lignes de programmation. Tant qu'a faire, autant profiter activement des enseignements reçus
 
Merci pour vos contributions.
 
Fred

Reply

Marsh Posté le 18-11-2009 à 20:35:19   

Reply

Marsh Posté le 19-11-2009 à 20:02:23    

Bonsoir
Ta demande est effectivement très simple...quoique...
Si tu permets, je te suggère de simplifier un peu plus:
Par exemple, de ne mettre qu'UN bouton, qui capte la valeur de la cellule sélectionnée, va à la feuille résultats, et filtre le tableau. plus 1 bouton sur cette page pour annuler le filtre et aller à la page synthèse.
 
Je t'ai fait une macro  pour filtrer ton tableau, et une pour créer les boutons, + 1 pr annuler. Pr les commentaires, tu as raison ds le principe, mais c'est un peu long et fastidieux de commenter chaque ligne. Si j'ai du temps et du courage, j'en ferai un peuu plusssss plus tard. En attendant, sers-toi de ça, regarde bien les lignes, et demande-moi évtuellmnt des explications*, ou des commandes supplémentaires, pour affiner ton travail.  
Sélectionne ces macros avec la souris, Copie-les, ouvre ton fichier, fais Alt+F11, regarde la colonne de gauche: tu vois le nom de ton fichier, le nom des feuilles, et "ThisWorkbook". dbl-clic sur cette mention, et ctrl+V dans la page. ENREGISTRE le fichier. clic ds la macro BOUTONS_DE_FILTRAGE, tape sur F5, tu as tes boutons; Clic dans la cellule du choix feuille "Synthèse", clic sur le bouton, tu as ton résultat.  :sol:  
 
Sub FILTRE()
'Clic dans la cellule du choix feuille "Synthèse"
Dim MaCell As Range
Sheets("Synthèse" ).Select
Set MaCell = ActiveCell.Offset(0, 1)
MaCell.Value = ""  'supp la valeur à côté de la Selection
Choix = ActiveCell.Value
Colonne = 4    '
'Colonne = ActiveCell.Column
Sheets("Résultat" ).Select
 Range("A1" ).CurrentRegion.Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=Colonne, Criteria1:=Choix, Operator:=xlAnd
    '''''''''''''''''''''''''''''''
     nbrangs = Selection.SpecialCells(xlCellTypeVisible).Rows.Count  'nbre de rangs sélectionnés
    MaCell.Value = nbrangs   ' inscrit ce nbre en col B de synthèse à côté de la cell sélectionnée.
    '''''''''''''''''''''''''''si tu veux supprimer le filtre et aller directement à la fl synthèse, supprime les apostrophes au début des lignes choisies.
  '  Selection.AutoFilter
  '  Sheets("Synthèse" ).Select
 
End Sub
 
Sub BOUTONS_DE_FILTRAGE()
 
'Je tai fait 2 macros qui installent ces boutons sur tes feuilles :
Sheets("Synthèse" ).Select
    Rows("1:1" ).RowHeight = 25
    'Application.CommandBars("Forms" ).Visible = True
    ActiveSheet.Buttons.Add(309.75, 6, 215.25, 19).Select
    Selection.OnAction = "ThisWorkbook.FILTRE"
    Selection.Characters.Text = "FILTRAGE"
    With Selection.Characters(Start:=1, Length:=8).Font
        .FontStyle = "Gras"
        .Size = 14
    End With
    Range("D1" ).Select
     
    Sheets("Résultat" ).Select
    Rows("1:1" ).RowHeight = 25
    ActiveSheet.Buttons.Add(309.75, 6, 215.25, 19).Select
    Selection.OnAction = "ThisWorkbook.NO_Filtre"
    Selection.Characters.Text = "Supprime   Filtre"
    With Selection.Characters(Start:=1, Length:=15).Font
        .FontStyle = "Gras"
        .Size = 14
    End With
     Range("D1" ).Select
 
'  Pour info, 1 bouton pour macro s'obtient en cliquant: affichage, barres d'outils, formulaires. dans cette barre, clic sur le rectgle gris ("bouton" )
'reviens là où tu le veux, clic et dessine ton bouton; si tu connais le nom de la macro, tu l'écris dans la ligne (le nom EXACT !!!), ou bien
'échapp, et tu le feras après.  'et change le nom.
End Sub
 
Sub NO_Filtre()
 
Sheets("Résultat" ).Select
 Range("A1" ).Select
    Selection.AutoFilter Field:=1, Criteria1:="", Operator:=xlAnd
    Selection.AutoFilter
  Sheets("Synthèse" ).Select
   
   
End Sub
 
 
Sinon, pr les explications, le mieux est encore d'acheter un bouquin... :pt1cable:  
 
A+


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 19-11-2009 à 22:00:34    

Laoo!
 
Je ne sais comment te remercier d'une part pour la qualité de tes informations et bien sur ta réactivité... si ce n'est mille mercis!
 
Je cherche a me perfectionner sur VBA moi qui ai fait un tout petit peu de programmation en basic étant plus jeune... en celà tes explications sont parfaites!
 
Merci encore et a bientôt
 
Fred

Reply

Marsh Posté le 20-11-2009 à 04:00:39    


Hélas, mille fois hélas, je ne mérite pas tant de remerciements.
 Avant d'aller dormir, pris de je ne sais quelle idée, ou d'un vieux doute enfoui, je regarde la macro de plus près, la teste, et surtout la vérifie vraiment avec un autre contrôle.  
Horreur, funérailles et putréfaction !!! les résultats sont faux, archi-faux. Ebloui par tes camions jaunes et tes hélicos rouges, j'en étais resté là. :ouch:  
 Je t'ai donc refait une macro directe et sûre que voici. Et supprime dans la macro Filtre les 4 dernières lignes.
 
Sub Nb_par_Catégorie()
Sheets("Synthèse" ).Select
    Range("A2" ).Select
    ActiveCell.CurrentRegion.Columns(2).FormulaR1C1 = "=COUNTIF(Résultat!C4:C4,RC1)"   '(formule NB.SI)
    ActiveCell.CurrentRegion.Columns(2).Value = ActiveCell.CurrentRegion.Columns(2).Value
    Range("B1" ) = "nombre"
     
End Sub
 
Encore dix mille fois pardon. :jap:  :pt1cable:  :jap: :pt1cable:   :jap:   :pt1cable: :jap:  :jap:  :whistle:  
 
 
Sur ce, Am Schlaffen !!    :sleep:  
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 20-11-2009 à 07:49:39    

Hoy Laoo!
 
Mais le pire c'est qu'elle semble marcher! Ok Ok, je me range donc a ton sage avis et recopie les quatre dernières lignes comme tu le préconises...
 
Ceci dit, nul moyen de te conforndre en autant d'excuses... Si tu n'aais pas été là, j'en serais encore un même point!
 
Ps -> quid "Am Schaffen"?
 
Bien à toi
 
Fred

Reply

Marsh Posté le 20-11-2009 à 08:31:46    

fredof83 a écrit :

Hoy Laoo!
 
Mais le pire c'est qu'elle semble marcher! Ok Ok, je me range donc a ton sage avis et recopie les quatre dernières lignes comme tu le préconises...
 
Ceci dit, nul moyen de te conforndre en autant d'excuses... Si tu n'aais pas été là, j'en serais encore un même point!
 
Ps -> quid "Am Schaffen"?
 
Bien à toi
 
Fred


 
Hello my Fred!
 
Oui, le pire danger n'est pas quand ça marche pas, mais quand ça marche de travers!!! il ne faut pas RECOPIER les 4 dernières lignes, mais les supprimer, ou les désactiver en mettant une apostrophe en début de ligne, ou en inscrivant Exit Sub juste avant, ce qui fait sortir de la macro. Pour la nouvelle que je t'ai envoyée, tu peux créer un bouton pour la faire fonctionner, tu as maintenant ts les éléments pour, non?   Voilà qui serait un très bon petit exercice...
Et si tu as besoin d'aide, tu me demandes, pas de problo. (enfin, si je sais répondre...)
 
j'aimerais par ailleurs comprendre pourquoi tu veux, ou voulais, faire un filtre, si c'était juste pour voir le nbre de lignes par appel, ou s'il y a une autre finalité, et savoir aussi pourquoi tu as besoin de 2 feuilles différentes pour faire tes tris, cela évidemment uniquement pour t'aider à optimiser ton besoin. si c'est seulement parce que cela te semblait bien, non, on peut faire bcp mieux.  
 
"Schlaffen" = dormir en teuton, dc Am Schlaffen = au lit, aux plumes,...
 
Bien à toi itou.
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 20-11-2009 à 19:23:12    

Hi Laoo!
 
Merci encore pour tes recommandations. J'ai remplacé la macro "filtre" par la nouvelle et tout semble fonctionner. Au regard de toutes ces lignes, j'essaie de comprendre le VBA mais j'avoue que ce n'est pas simple... même pour des petites routines ceomme celle-ci....
Aussi, comme tu me l'as proposé, peut-être pourra tu me donner la signification de ces lignes histoire que j'en perce le mystère!
 
En ce qui concerne le filtre, ce fichier n'est qu'un exemple car au delà du résultat, c'est bien entendu la technique VBA pour des routines simples que je souhaite "maitriser"...
 
A ce sujet, ou se trouvent les différents adressages (sur quelle colonne soit se faire le filtre?, sur quelle collone doit commencer le décomptage?, a partir de quelle cellule?, etc...) enfin bref, si je veux changer tous ces paramètres tout en conservant la même finalité de filtrage, quels élémenrs doivent être modifiés?
 
Je te remercie encore pour ton soutien... ainsi que sur notions d'allemand!
 
Bien a toiitoulaoo....OhOh OhOh
 
Fred

Reply

Marsh Posté le 20-11-2009 à 21:36:20    

Hi my Fred
 
c'était aussi mon sentiment à propos des filtres, que la démarche t'intéressait plus que les comptes; d'ailleurs au début, je n'avais mm pas songé à les introduire, puis avec l'heure tardive, j'ai rajouté ces 2 funestes lignes, sans les vérifier pas à pas, et patatras ! Cent fois sur le métier remettez votre ouvrage, disait Monsieur Boileau...
Tu veux donc des explications sur ces macros, eh bien, si cela peut te rendre service, j'y va.
au fait, sais-tu qu'en ouvrant une macro et en tapant sur F8 tu l'exécutes commande par commande, ce qui est bien utile?
 
Sub FILTRE()  
'Clic dans la cellule du choix feuille "Synthèse"  
Dim MaCell As Range         ' indique au système que ce mot (qu'on appelle aussi une variable , parce qu'on peut lui donner n'importe quelle valeur) prend les caractéristiques d'une cellule (Range= cellule ou groupe de cell.)
 
Sheets("Synthèse" ).Select  
 
Set MaCell = ActiveCell.Offset(0, 1) '''avec le mot-clef Set je donne une propriété spéciale pour la durée de la macro; ici MaCell désignera donc la cellule qui se trouve à côté de la cellule active en ce moment. Ainsi je pourrais lui donner plus bas une valeur nouvelle sans avoir même à venir dans la feuille.  
 
MaCell.Value = ""  'vide la cellule indiquée  
 
Choix = ActiveCell.Value    'la variable Choix prend la valeur de la cellule active (avion rouge, camion bleu,...)
 
Colonne = 4    '  'la variable Colonne prend la valeur 4
 
'''Colonne = ActiveCell.Column 'si tu veux faire 1 tri sur place, tu mets cette expression, tu te places dans la colonne que tu veux filtrer, et tu lances ta macro. ça te permets de varier les colonnes à filtrer sans changer la macro, à la diff de "Colonne = 4", qui est fixe.
 
Sheets("Résultat" ).Select  
 
Range("A1" ).CurrentRegion.Select sélectionne toutes les cellules qui touchent A1, sur 3 lignes ou 1000, sur 3 colonnes ou 1000.
     
Selection.AutoFilter        ' met ou enlève les flèches de filtre
   
    Selection.AutoFilter Field:=Colonne, Criteria1:=Choix, Operator:=xlAnd    'voilà l'intérêt de mettre des variables dans une expression, tu les fais varier de l'extérieur.  
    '''''''''''''''''''''''''''''''  
     nbrangs = Selection.SpecialCells(xlCellTypeVisible).Rows.Count  'nbre de rangs sélectionnés  c'est là que  ça merdoie; des fois c'est bon, des fois c'est pas bon, donc pas fiable, à peaufiner avant usage!!!
 
    MaCell.Value = nbrangs   ' inscrit ce nbre en col B de synthèse à côté de la cell sélectionnée. Ca c'est très important: on est sur une autre feuille, et la cellule que j'ai désignée tt à l'heure avec Set prend la valeur du nbre de rangs. (fausse, d'accord, mais elle pourrait être bonne...)
 
  End Sub  
 'voilà, la suite à plus tard
 


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 22-11-2009 à 19:21:30    

OyOy,
 
Effectivement, ce n'est pas si simple de que ça; je me rappelle de quelques notions de basic et il me semble que la compréhension était plus aisée! Enfin, je prends bonne note de toutes ces explications et vais essayer de les "calquer" sur mon projet tous ces bons conseils...
 
Tu m'as parlé d'un bouquin par apprendre VBA... As tu une référence style VBA pour les nuls histoire de commencer de manière très basique?
 
Merci encore à toi.. que dis-je 10 Kmercis!
 
Et a plus pour la suite des explications (si tu as le temps bien entendu)
 
Fred

Reply

Marsh Posté le 23-11-2009 à 20:29:05    

fredof83 a écrit :

OyOy,
 
Effectivement, ce n'est pas si simple de que ça; je me rappelle de quelques notions de basic et il me semble que la compréhension était plus aisée! Enfin, je prends bonne note de toutes ces explications et vais essayer de les "calquer" sur mon projet tous ces bons conseils...
 
Tu m'as parlé d'un bouquin par apprendre VBA... As tu une référence style VBA pour les nuls histoire de commencer de manière très basique?
 
Merci encore à toi.. que dis-je 10 Kmercis!
 
Et a plus pour la suite des explications (si tu as le temps bien entendu)
 
Fred


 
Hello ami Fred,  
vas-tu bien?
 
voici la suite des esplications:
 
Sub BOUTONS_DE_FILTRAGE()  
 
'Je tai fait 2 macros qui installent ces boutons sur tes feuilles :  
Sheets("Synthèse" ).Select  
 
'hauteur de la 1° ligne:
    Rows("1:1" ).RowHeight = 25  
 
'installe un bouton poussoir sur ta feuille active, à l'endroit et de la taille indiqués entre parenthèses:
      ActiveSheet.Buttons.Add(309.75, 6, 215.25, 19).Select  
 
'emplacement et nom de la macro activée par ce bouton:
    Selection.OnAction = "ThisWorkbook.FILTRE"  
 
'inscription sur le bouton:
    Selection.Characters.Text = "FILTRAGE"  
 
'mise en forme de l'inscription  
    With Selection.Characters(Start:=1, Length:=8).Font  
        .FontStyle = "Gras"  
        .Size = 14  
    End With  
    Range("D1" ).Select  
     
'idem pour l'autre bouton:
    Sheets("Résultat" ).Select  
    Rows("1:1" ).RowHeight = 25  
    ActiveSheet.Buttons.Add(309.75, 6, 215.25, 19).Select  
    Selection.OnAction = "ThisWorkbook.NO_Filtre"  
    Selection.Characters.Text = "Supprime   Filtre"  
    With Selection.Characters(Start:=1, Length:=15).Font  
        .FontStyle = "Gras"  
        .Size = 14  
    End With  
     Range("D1" ).Select  
 
'  Pour info, 1 bouton pour macro s'obtient en cliquant: affichage, barres d'outils, formulaires. dans cette barre, clic sur le rectgle gris ("bouton" )  
'reviens là où tu le veux, clic et dessine ton bouton; si tu connais le nom de la macro, tu l'écris dans la ligne (le nom EXACT !!!), ou bien  
'échapp, et tu le feras après.  'et change le nom.  
End Sub  
 
Et pour la dernière macro:
 
Sub NO_Filtre()  
 
Sheets("Résultat" ).Select  
 Range("A1" ).Select  
 
'''je fais un non-filtre, suivi de la dé-sélection du filtre, ceci est nécessaire car si on ne met que  " Selection.AutoFilter ", 1 coup ça met, un coup ça enlève !!!
       Selection.AutoFilter Field:=1, Criteria1:="", Operator:=xlAnd  
       Selection.AutoFilter  
  Sheets("Synthèse" ).Select  
   
   
End Sub  
 
Et Oila!
 
n'hésite pas si tu as encore des questions.
 
En ce qui concerne les bouquins, oui, pourquoi pas zzz pour les nuls; les bouquins Microsoft sont pas mal non plus; j'avais acheté il y a lgtemps le manuel de référence des fonctions de Excel, qui est très utile aussi.  
 
 
 
Bye


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 23-11-2009 à 20:29:05   

Reply

Marsh Posté le 25-11-2009 à 12:08:38    

Hey tout Laoo!
 
Merci encore pour toutes ces bonnes et belles infos.... Attention, avec tout ça l'élève risque de dépasser le maître!
 
Il me reste maintenant à digérer le tout et surtout "comprendre" ce langage... Je pense qu'en se penchant dessus avec l'aide d'un bon book et surtout l'aide oh combien précieuse d'un contributeur de ton envergure, les résultats devraient rapidement se faire sentir!
 
Bien à toi et, comme tu me le proposes, je ne manquerai pas de te solliciter!
 
Bye
 
Fred

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed