Masquer et afficher avec macro

Bonsoir

Je cherche à masquer des lignes si condition et à pouvoir les afficher à nouveau si besoin.

Mon fichier test joint

merci pour l'aide

Lingo

Bonsoir Lingo,

je te retourne ton fichier modifié :

à toi de tester les 2 boutons !


Alt F11 pour voir le code VBA, puis revenir sur Excel

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Bonsoir, Salut Dhany !

Autre méthode :

Sub Masquer()
    Dim n%
    With ActiveSheet
        n = .Range("B" & .Rows.Count).End(xlUp).Row
        .Range("M5:M" & n).SpecialCells(xlCellTypeConstants) _
         .EntireRow.Hidden = True
    End With
End Sub

Sub Afficher()
    Dim n%
    With ActiveSheet
        n = .Range("B" & .Rows.Count).End(xlUp).Row
        .Rows(5 & ":" & n).Hidden = False
    End With
End Sub

Cordialement.

Bonjour à tous,

Et une dernière basée sur la proposition de MFerrand !...

Cdlt.

Bien joué Jean-Eric !

Bonsoir à tous

Et surtout merci pour toutes ces réponses.

Toujours ce maudit MAC qui ne veut pas ouvrir les macros correctement, mais j'ai transféré sur un ancien PC et j'ai découvrir toutes les réponses.

En effet , celle de Jean Eric un peu plus difficile à décortiquer !!!!

Merci encore à tous

Bonne soirée

Lingo Bert

Bonjour,

Je pense que tu dois avoir des difficultés avec un contrôle ActiveX avec ton Mac.

Et comme ça, de prime abord, je ne sais pas faire la même chose avec un contrôle de formulaire.

Cdlt.

Bonjour Lingo, le forum,

Jean-Eric a écrit :

Je pense que tu dois avoir des difficultés avec un contrôle ActiveX avec ton Mac.

oui, et c'est normal ; car les contrôles ActiveX ne sont pas pris en charge sur Macintosh :

https://support.office.com/fr-fr/article/affecter-une-macro-%C3%A0-un-bouton-formulaire-ou-commande-d58edd7d-cb04-4964-bead-9c72c843a283?ocmsassetID=HP010342137&CorrelationId=717d5b0d-6bf3-412f-b1a3-f1ba54a15dab&ui=fr-FR&rs=fr-FR&ad=FR

(c'est écrit un peu après le début : la remarque qui est sous les 2 premières petites images)


le précédent code VBA de Jean-Eric est très bien, mais il comporte quand même un p'tit bug :

si y'a aucune donnée en B5:B20, n (dernière ligne) vaut 1

.Range("M5:M" & n) équivaut à .Range("M5:M1") ➯ ça fait le job pour les lignes 1 à 5 et pas 5 à en-dessous

or dans ce cas, faut rien faire du tout ! mais ça induit ce problème : le clic sur la case à cocher a déjà fait son œuvre : ça en a déjà changé l'état coché ou non, et du coup c'est plus correctement synchronisé avec l'état réel masqué ou non des lignes !

il aurait fallu pouvoir annuler le changement d'état de la coche, et ça aurait été facile avec Cancel = True, mais y'a pas d'variable Cancel à disposition ! j'ai fait un essai avec CheckBox1 = Not CheckBox1 mais ça crée une erreur de pile insuffisante, car le changement d'état fait qu'la sub s'appelle de nouveau récursivement ! j'ai alors ajouté une désactivation des événements avant, puis une réactivation après : échec : même erreur de pile insuffisante !


aussi, j'ai laissé tomber la case à cocher, et je l'ai remplacée par un bouton de commande (contrôle de formulaire) :

normalement, ça doit marcher sans aucun problème sur ton Macintosh !

* tu peux voir que toutes les lignes sont affichées

* clique sur le bouton pour masquer les lignes

* clique sur le bouton pour afficher les lignes

* efface toutes les données de B5:B20

* clique sur le bouton ; eh oui, cette fois, ça fait rien !

* fais Ctrl z pour annuler ta suppression de données

* tu peux faire joujou avec ton bouton comme avant


Alt F11 pour voir le code VBA, puis revenir sur Excel

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Bonsoir Dhany !

Pas de problème de résultat intempestif d'abord parce qu'on dimensionne la plage sur une colonne remplie, donc n aura le numéro de ligne de fin de plage, ensuite parce que SpecialCells déclenche une erreur si aucune cellule ne correspond au type voulu. Là il y a effectivement un correctif à apporter qui consiste à introduire une gestion d'erreur...

Et s'agissant du contrôle, on peut transposer sur une case à cocher de formulaire.

Cordialement.

Bonjour MFerrand,

tu a écrit :

Pas de problème de résultat intempestif parce qu'on dimensionne la plage sur une colonne remplie

oui, c'est effectivement le cas dans l'exemple actuel du fichier ; mais si au départ B5:B20 est vide (avant la toute 1ère saisie dans le tableau), c'est là que survient le problème que j'ai décrit dans mon post précédent.

et la solution que j'ai donnée dans mon post de 02:25 marche très bien sans avoir dû introduire une gestion d'erreur.

dhany

@Lingo

je te laisse lire mon post de 02:25 : https://forum.excel-pratique.com/viewtopic.php?p=689269#p689269

quand tu auras fini de lire l'article Microsoft, n'oublie pas de lire la suite du même post ! après ma description du p'tit bug du code VBA de Jean-Eric, tu trouveras un nouveau fichier Excel ; je pense que tu apprécieras le bouton de commande (qui est un peu spécial).

dhany

Bonjour tout le monde,

La même procédure que Jean-Eric mais avec une case à cocher issue de la boite à outils Formulaire. IIf() est utilisé car la valeur retournée pour faux est -4146. Ne pas oublier d'affecter la macro à la case à cocher :

Sub AfficherMasquer()

    Dim S As Shape
    Dim n As Long

    With ActiveSheet

        Set S = .Shapes(Application.Caller)

        n = .Range("B" & .Rows.Count).End(xlUp).Row
        .Range("M5:M" & n).SpecialCells(xlCellTypeConstants).EntireRow.Hidden = IIf(S.ControlFormat.Value = 1, 1, 0)

    End With

End Sub

Bonjour,

@ Theze,

Une solution simple, concise, sans artifice !...

Je n'utilise plus de contrôles de formulaires depuis des lustres.

Je savais qu'il y avait une réponse, mais cela m'aurait demandé de nombreuses recherches.

Je mets de côté.

Cdlt

Bonjour à tous !

Si la colonne B est vide ! Notre ami n'est pas idiot ! Il ne lance pas une procédure sans objet s'il n'a aucune donnée et que son tableau n'existe pas ! Certes on on peut prévoir le cas mais ça s'apparente aux fioritures décoratives...

La remarque de Theze sur l'utilisation de True ou False pour les cases à cocher est en effet particulièrement utile. Il faut éviter d'utiliser ces valeurs au profit de xlOn et xlOff.

Bonne journée.

@Lingo

n'oublie pas de lire mon post précédent :

https://forum.excel-pratique.com/viewtopic.php?p=689278#p689278


@MFerrand

tu a écrit :

Si la colonne B est vide ! Notre ami n'est pas idiot ! Il ne lance pas une procédure sans objet s'il n'a aucune donnée et que son tableau n'existe pas ! Certes on on peut prévoir le cas mais ça s'apparente aux fioritures décoratives...

pour moi, ce n'est absolument pas une fioriture décorative ! même si le tableau ne contient aucune donnée, c'est quand même beaucoup mieux de prévoir, de façon préventive, une fausse manip de l'utilisateur ; d'ailleurs, de la même façon préventive, pour la saisie d'un nombre dans un InputBox, faut pas utiliser une variable numérique au cas où l'utilisateur se trompe et saisit une lettre, sinon : plantage « Type Mismatch » !

dhany

Bonsoir dhany

Merci pour ce nouveau fichier

Cependant , j'ai regardé le nouveau fichier et d'une part, je n'ai pas le bouton masquer les lignes , d'autre part j'ai un message d'erreur ( voir photo joint en annexe)

Cdlt

Lingo

erreur fichier

??? regarde cette copie d'écran :

screen

en fait, c'est pas 2 boutons différents, mais un seul et même bouton, dont le texte change. voilà pourquoi je disais que c'est un bouton un peu spécial. quand tu cliques sur le bouton avec le texte « Afficher les lignes », tu retrouves ce que tu vois en haut de la copie d'écran, donc tu peux vérifier que les lignes visibles sont bien les bonnes.


j'ai aucune idée de pourquoi ça veut pas marcher sur ton Macintosh alors que c'est bien un contrôle de formulaire et pas un contrôle ActiveX ! donc là, j'peux pas t'aider davantage !

j'ai une seule solution en réserve : achète un Macintosh pour ton domicile aussi, comme ça t'auras plus d'problèmes de transfert entre les 2 ordis ! (celui d'ton bureau et celui d'ta maison)


en tout cas, sur ton PC, ma solution devrait marcher tout aussi bien qu'sur le mien ! j'y peux rien, moi, si Excel pour Macintosh est moins évolué qu'Excel version PC ! c'est encore la faute à Crosoft, tout ça ! bon, ça doit s'expliquer car il connaît très bien Windows (normal vu qu'il l'a lui-même conçu), et beaucoup moins bien l'OS du Mac ! (Bill Gates est pas Steve Jobs !)

note pour ceux qui n'auraient pas bien compris le rapport : tout logiciel d'application se sert des fonctions du système d'exploitation ; donc Excel version PC utilise des fonctions de Windows et Excel version Macintosh utilise des fonctions de l'OS du Mac.

dhany

@Lingo

lis d'abord mon post précédent, puis celui-ci ; en usant ma dernière cartouche, je te propose cet autre fichier :

j'ai utilisé une méthode un peu différente ; peut-être qu'elle passera sur ton Mac sans Error 400 ?

mais là où ça risque de coincer sur ton Macintosh, c'est avec cette instruction : SendKeys "{ESC}"

note : l'objet est toujours un bouton de commande, et c'est toujours un contrôle de formulaire.

dhany

ajout à mes 2 précédents posts : en cherchant encore, j'ai réussi à trouver ceci :

idem que le fichier précédent, mais sans l'instruction SendKeys "{ESC}" !


cette fois, j'ai vraiment plus d'autre idée, alors si ça marche toujours pas,

essaye l'Armée du Salut et des pauvres hères déshérités !

dhany

Bonjour,

Je reviens avec l'hypothèse du contrôle de formulaire.

j'ai testé sous Mac (et le visuel est meilleur que sous PC).

Prise en compte de la remarque de MFerrand.

Cdlt.

Sub AfficherMasquer()
Dim S As Shape, n As Long
    With ActiveSheet
        Set S = .Shapes(Application.Caller)
        n = .Range("B" & .Rows.Count).End(xlUp).Row
        .Range("M5:M" & n).SpecialCells(xlCellTypeConstants).EntireRow.Hidden = IIf(S.ControlFormat.Value = xlOn, 0, 1)
    End With
End Sub
Rechercher des sujets similaires à "masquer afficher macro"