Masquer/Afficher des lignes grâce à un bouton selon critère
Bonjour à tous,
tout nouveau sur le forum et je préfère préciser que j'ai un niveau très faible (proche du néant) en macro.
J'aimerais, grâce à un bouton, masquer ou afficher des lignes en fonction d'un seul critère. Voici un exemple pour illustrer (fichier exemple joint au message):
- Onglet 1 'Récap': Tableau récapitulatif de différents problèmes (de 1 à 20) qui peuvent être classés en fonction de 3 degrés de gravité (faible, moyen et fort). J'ai créé une liste déroulante pour affecter à chaque problème un degré de gravité en colonne 'D' (avec Data validation).
- Onglet 2 'Faible': j'ai recopié le tableau récap, mais cette fois-ci les degrés de gravité ne peuvent pas être manipulés (les cellules de la colonne gravité renvoient au contenu de l'onglet Récap, il n'y a plus de liste déroulante).
Je souhaite que dans cet onglet s'affiche seulement les lignes de problèmes qui ont un degré de gravité 'Faible'. Je sais que je pourrais le faire en filtrant la colonne Gravité mais je devrais refaire cette manip à chaque fois que j'actualise l'onglet 'Récap' (et ce sera un fichier collaboratif). En fait, j'aimerais le faire grâce un bouton qui contiendrait une macro qui puisse afficher ou masquer en fonction du contenu de la case Gravité.
Idem pour les onglets Moyen et Fort.
En cherchant un peu, j'ai réussi à trouver quelque chose mais je rencontre un problème. Je vous mets le code et j'explique mon problème par la suite:
Sub HideRow()
Dim isfLastRow As Long
Dim isfCounter As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
With ActiveSheet
.Shapes("Actualisertableau").Visible = True
isfLastRow = .Range("D10000").End(xlUp).Row
For isfCounter = 5 To isfLastRow
If .Cells(isfCounter, "D").Value = "moyen" Or .Cells(isfCounter, "D").Value = "fort" Then
.Cells(isfCounter, "D").EntireRow.Hidden = True
Else
.Cells(isfCounter, "D").Value = "faible"
.Cells(isfCounter, "D").EntireRow.Hidden = False
End If
Next isfCounter
.Range("A1").Select
End With
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End SubEdit modo : code mis entre balises, merci d'y faire attention la prochaine fois
Le code fonctionne, mais lorsque j'exécute la macro grâce au bouton, ma formule (=Récap!D5 par exemple) comprise dans la colonne degré (colonne D) qui renvoit au contenu de l'onglet Récap disparait . C'est à dire que ces cases ne s'actualisent plus en fonction des changements que l'ont fait dans l'onglet Récap (si je souhaite changer de degré de gravité). En gros, le bouton fonctionne une fois et ensuite tout est catégorisé en "faible" et ne s'actualise plus.
Avez-vous une idée pour améliorer le code ou simplement quelque chose de similaire qui fonctionne déjà?
Je vous remercie,
Anthony.
Bonjour anthod13 et
Une petite présentation ICI serait la bienvenue
Tout nouveau, commencez donc par lire :
- La charte du forum et notamment :
- Pour plus de lisibilité, utilisez le bouton </> situé dans la barre d'outils, pour insérer vos codes VBA (et si possible aussi pour vos formules Excel).
- Quelques fonctionnalites du forum à connaître
Regardez aussi les petites icônes mises à votre disposition dans la barre de menu qui :
- vous permettent de poster un code (</>)
- ou de clôturer un fil lorsque vous avez terminé (V)
Merci pour votre participation
Cordialement
Bonjour,
Hello Bruno
Sans VBA, mais en utilisant Power Query, ça pourrait donner ça.
Regarde le fichier joint
Merci beaucoup pour la réponse, effectivement cela fonctionne.
J'ai également trouvé une macro plus simple que celle que j'avais essayé d'utiliser, associée à un bouton dans l'onglet Récap, qui actualise les différents onglets.
Voici le code si jamais ça peut servir pour d'autres personnes:
Sub Generalrefresh()
With Worksheets("Faible")
Dim c As Range
For Each c In Worksheets("Faible").Range("D5:D24")
If c.Value = "moyen" Or c.Value = "fort" Then
c.EntireRow.Hidden = True
Else
c.EntireRow.Hidden = False
End If
Next
End With
With Worksheets("Moyen")
Dim d As Range
For Each d In Worksheets("Moyen").Range("D5:D24")
If d.Value = "faible" Or d.Value = "fort" Then
d.EntireRow.Hidden = True
Else
d.EntireRow.Hidden = False
End If
Next
End With
With Worksheets("Fort")
Dim e As Range
For Each e In Worksheets("Fort").Range("D5:D24")
If e.Value = "faible" Or e.Value = "moyen" Then
e.EntireRow.Hidden = True
Else
e.EntireRow.Hidden = False
End If
Next
End With
End SubJe passe en résolu.
merci beaucoup !
Anthony
Re-,
Euh, je ne comprends pas tout...
Tu mets mon post comme le post t'ayant permis de résoudre ta demande, mais tu ne l'utilises pas...
Au contraire, tu utilises un code inexact, et ça te suffit...????
Dans ton code, tu ne fais que masquer les lignes non concernées par le nom de l'onglet, donc tu ne peux pas utiliser pleinement ces nouveaux tableaux...
Ces données sont toujours présentes...
Mais bon, si ça te va!!
Bonne fin d'apm