filtrage automatique sur excel par bouton et action VBA - VB/VBA/VBS - Programmation
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.
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...
A+
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
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à.
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.
Sur ce, Am Schlaffen !!
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
Marsh Posté le 20-11-2009 à 08:31:46
fredof83 a écrit : Hoy Laoo! |
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.
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
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
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
Marsh Posté le 23-11-2009 à 20:29:05
fredof83 a écrit : OyOy, |
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
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
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