[VBA] Masquer ligne selon un critère

Bonjour à vous !

J'ai un soucis sur mon VBA...

Je souhaite masquer toutes les lignes de ma feuille NE contenant PAS "lundi".

Jusque là, je pensais que le VBA était simple à faire... Mais, je bloque sur ce VBA et j'avoue être à court de solutions...

Sub Mondays_view_VESI_code()
'Introduction critères de sélection
    Dim VESI As Long
    VESI = Cells(Rows.Count, 3).End(xlToDown).Rows
'Itroduction critère de contrôle
    For i = 3 To VESI
    If Cells(i, 3) <> "Lundi" Then Rows(i).Hidden = True
    Next i
End Sub

Je suppose que la solution est simple, pour excuse, je suis un amateur VBA J'apprends, j'apprends...

Si quelqu'un pourrait m'aider, je suis désespéré

En vous remerciant par avance,

Cdt

Bonjour,

Suffit pas d'écrire en anglais pour que le code soit fonctionnel !

La syntaxe est celle de VBA...

xlToDown n'existe pas, c'est xlDown, mais recherchant à partir de la dernière cellule, tu dois remonter et non descendre, c'est donc xlUp le paramètre à utiliser. Et tu cherches un numéro de ligne, ce n'est donc pas Rows, mais Row.

Et tu ne qualifies pas tes expressions (Cells sans rien devant...), ton code reste donc approximatif et soumis à des aléas... Toute plage appartient à une feuille et on a toujours intérêt à la pointer, ne serait-ce que par ActiveSheet. Et si on s'y réfère plusieurs fois, toujours intérêt à la mettre sous instruction With ActiveSheet...

Si tu prévois une variable Long, c'est que tu risques d'avoir plus de 32767 lignes à parcourir (?)

En tout état de cause l'exécution ne sera pas très rapide, même en ajoutant avant la boucle :

Application.ScreenUpdating = False

ce qu'il faut tout de même faire pour qu'elle soit moins lente.

Mais compte-tenu de ce que tu veux faire, le filtre conviendrait beaucoup mieux et serait infiniment plus rapide.

On peut très facilement opérer manuellement, le recours à VBA serait donc superflu...

S'il est nécessaire de le coder, il faut savoir quelle est ta ligne d'en-tête : la 2 ?

Cordialement.

Bonjour MFerrand,

Je te remercie pour tes précieuses explications !

Il est vrai que faire un filtre est bien plus rapide, mais étant donné que j'essaye d'apprendre le VBA, je commence à faire des petits VBA tout simple. Ceci explique cela

Mais petite question... En effet, je viens de corriger le VBA, aurais-tu une piste (ou idée) de comment pouvoir alléger l’exécution ?

Merci par avance,

Tu utilises cette expression : Cells(Row.Count, 3).... pour appeler un objet.

Mais dans l'expression Cells n'est pas l'objet plage que l'on veut renvoyer !

C'est une propriété de l'objet Worksheet à laquelle cette plage appartient, qui va permettre de renvoyer la plage, pour en tirer des informations ou la manipuler...

N'indiquant pas quelle est cette feuille, tu ne qualifies pas ton expression et laisse VBA l'attribuer par défaut à la feuille active du classeur actif, ce qu'il doit rechercher (et qu'il n'aurait pas besoin de faire si tu le lui précisait !)

Tu peux facilement comprendre aussi que si au moment où cette commande est exécutée la feuille concernée implicitement n'est plus la feuille active, tu auras quelques surprises...

C'est ce qui arrive quand on code ainsi, pas de problèmes en principe au début, puis on ajoute des feuilles, des procédures, des opérations, etc. et un beau jour ses anciennes macros qui fonctionnaient se mettent à dérailler et on se demande pourquoi !!!

En outre en plaçant la feuille sous instruction With... End With, on n'a plus qu'un point à mettre devant Cells ou Range pour référer à la feuille, méthode qui simplifie l'écriture, mais qui de surcroît permet à VBA d'être plus rapide...


Tiens ! La question à laquelle je répondais me semble avoir disparue ! L'aurais-je rêvée ?

Oui je crois avoir déjà dit que le filtre serait infiniment plus rapide dans ce cas !

Mais si tu préfères attendre, c'est ton choix !

Bonjour alundrak, bonjour le forum

Essaye ça:

Sub masque()
dl = Range("C" & Rows.Count).End(xlUp).Row
    For i = 3 To dl
           If Cells(i, "C") <> "Lundi" Then
            Rows(i).EntireRow.Hidden = True
           End If
     Next
End Sub

Cdlt

Bonsoir jp65

Rows(i).EntireRow.Hidden = True

Ça ! en langage courant, c'est un pléonasme : c'est dire masquer la ligne de la ligne i au lieu de se contenter avec simplicité de masquer la ligne i

Et tu lui proposes la même méthode qu'il utilise déjà : masquer ligne par ligne... ce qui n'apportera rien de plus.

Puis après que j'ai fourni un conseil et une recommandation longuement expliquée pour qualifier (doter toutes sess expressions de qualificateur d'objet, si tu ne comprends pas ce que c'est, ce n'est pas moi qui ai inventé cette appellation, et tu lis mes explications pour savoir ce qu'il en est), juste après ça donc, tu lui proposes un code totalement non qualifié !

Tu comprendras que je puisse consédérer cela comme une provocation délibérée

Si c'est une position que tu entends défendre, je suis prêt à en discuter avec de réels arguments et illustrations des effets... Tu pourras tenter alors de prouver ce que tu avances implicitement...

Je rappelle par ailleurs que j'ai proposé à Alundrak de lui coder le filtrage : il suffit de l'essayer manuellement pour voir immédiatement que ce sera plus rapide ! sans avoir à mesurer le temps d'exécution. J'avais demandé pour cela de confirmer la ligne d'en-tête... mais il ne veut pas du filtrage. S'il préfère appliquer une méthode dont on a toujours su qu'elle était plus lente, c'est son droit.

Cordialement.

Bonjour à vous,

Je vous remercie de votre aide

MFerrand a écrit :

S'il préfère appliquer une méthode dont on a toujours su qu'elle était plus lente, c'est son droit.

Je confirme :p Je sais que le filtre est beaucoup plus rapide, mais dans l'optique d'apprendre à utiliser VBA, je me dois d'apprendre un peu les bases avant de me lancer dans une "vraie" macro.

Je clôture ce poste en résolu

Bonjour,

Ce n'est pas jp65 qui a écrit ce que tu cites...

Je ne vois pas trop le lien de cause à effet entre vouloir apprendre les bases de VBA et refuser de coder un filtrage en VBA !

Il m'apparaît par ailleurs souhaitable que dès que l'on commence à coder on produise du "vrai" code, dès sa première ligne de code, aussi bien structuré que possible... Aucune raison de faire de "fausses" macros (?) pour attendre d'être en mesure d'en faire des "vraies" !

Oups ! Mauvais quotage Je corrige !

Je comprends , d'ailleurs je me suis amusé à faire ce que tu as proposé et je re-confirme que c'est bien mieux ! J'essaye de mon mieux pour que ça soit structurée (avec des commentaires en plus)

Mais les "fausses" macros me permettent de tester justement les limites, comprendre mieux les formules et d'apprendre de mes erreurs ! Je m'invente des cas pratiques pour les mettre en pratique (ici c'était sélectionner selon critère + masquer + boucle) ! On va dire que c'est pas les meilleures pratiques haha

Mais bon, là n'est pas le sujet de ce topique...

Sélectionner selon critères..., c'est tester le critère... ! Pas de souci, en VBA tu passes pas mal de temps à en faire, cela va donc vite s'assimiler. En complément, note que concurremment au If... Then... etc. le plus fréquemment utilisé, tu disposes aussi de Select Case qui peut dans certains s'avérer plus pratiques, surtout lorsque le nombre d'options grandit ou que certains cas sont groupés...

Faire des boucles... Je t'accorde que c'est un apprentissage indispensable pour un codage efficace. Une fois la maîtrise des 3 types de boucles simples assurée, il y a encore d'un côté les imbrications de boucles et d'un autre : faire tout de même des boucles quand les conditions pour en faire ne sont pas réunies !

Complément indispensable pour poursuivre et t'ouvrir des horizons : les tableaux !

Bonne journée.

Rechercher des sujets similaires à "vba masquer ligne critere"