Masquer lignes selon 2 conditions par macro excel

Résolu/Fermé
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013
-
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013
-
Bonjour,

Je souhaiterais créer une macro sous excel qui me permettrais de masquer les lignes d'un fichier excel selon ces 2 conditions :
Si et seulement si les cellules des colonnes AJ = X et AK = 0 (en chiffre)

Quelqu'un pourrait-il m'aider, je suis novice en macro et je ne me tire les cheveux depuis 2 jours...

D'avance un grand merci.


18 réponses

Messages postés
17829
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
24 janvier 2022
4 910
Salut,

Il a raison le bos pourquoi faire simple lorsqu'il est possible de faire compliqué

Sub Masque_lignes_condition_cellule()
Dim lg As Long, r As Long
Application.ScreenUpdating = False
With ActiveSheet.UsedRange
lg = .Row + .Rows.Count - 1
End With
For r = lg To 1 Step -1
If Cells(r, "AJ") Like "X" And Cells(r, "AK") Like "0" Then
Rows(r).EntireRow.Hidden = True
End If
Next r
Application.ScreenUpdating = True
End Sub


et demain tu nous demanderas comment afficher les lignes masquées
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Pourquoi une macro alors qu'un simple filtre suffit ?
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

C'est ce que j'avais proposé à mon chef de service mais il veut une macro pour n'avoir qu'à cliquer sur un bouton pour masquer les lignes inutiles à la lecture...
Ce fichier est alimenté par une base de données (liaisons) et ces dernières s'actualise quotidiennement. De plus, il ne maîtrise pas excel et ne veut pas s'y mettre.
Enfin, pour ma part j'ai très envi de répondre à son attente mais surtout de m'initier aux macros...

Pouvez-vous m'aider svp ???
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

un grand merci MIKE 31. T'imagines pas comme tu me fais plaisir ; je vais tester ça dès demain...
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Bonjour,

Puisque tu est novice et que tu te lances dans le VBA, une autre méthode documentée qui met en place un filtre automatique lors du clic droit sur la feuille et qui ré-affiche tout lors du clic droit suivant

Cela évitera peut-être (soyons prudent) la question de demain (bonjour Éric).

' Module    : Feuil1
' Objet     : Filtrage automatique des colonnes AJ et AK
' 08/01/13
'
'
' Déclaration des options pour l'ensemble du module de feuille
' Une très bonne habitude à prendre, toujours commencer un module par :
Option Explicit
'
' Déclaration des constantes utilisables dans l'ensemble du module
' (connues de toutes les procédures du module)
Private Const refCellule1 As String = "A1"    'Référence de la 1° cellule du tableau
Private Const refColonne1 As String = "AJ"    'Référence de la 1° colonne à filtrer
Private Const strCritère1 As String = "X"     'Critère de filtrage de la 1° colonne
Private Const refColonne2 As String = "AK"    'Référence de la 2° colonne à filtrer
Private Const strCritère2 As String = "0"     'Critère de filtrage de la 2° colonne
'

' Procédures évènementielles du module de feuille
' (exécutée automatiquement lorsqu'un des évènements de la feuille se produit)
'
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
' Mise à jour du filtre à chaque clic droit sur la feuille (sur l'évènement BeforeRightClick)
' 08/01/13
'
  
  'Annuler l'effet normal du clic droit (pas d'affichage du menu contextuel)
  Cancel = True

  'Appeler la procédure de filtrage en indiquant la feuille sur laquelle appliquer le filtre
  Call Filtrer_Colonnes(ActiveSheet)

End Sub

' Autres procédures du module
' (exécutées uniquement lorsqu'elles sont appelées)
'
Private Sub Filtrer_Colonnes(ByRef wsh As Worksheet)
' Procédure de filtrage des colonnes : Met en place / Enlève le filtrage.
' Arguments : wsh                 [in]  Feuille sur laquelle le filtre sera appliqué
' 08/01/13
'
' Déclaration des variables utilisables dans cette procédure
Dim rngTableau As Range          'Tableau contenant les données
Dim intChamp1 As Integer         'Numéro du 1° champ (1° colonne à filtrer)
Dim intChamp2 As Integer         'Numéro du 2° champ (2° colonne à filtrer)
    
  'Si un filtage est déja en place...
  If wsh.FilterMode = True Then
    '... afficher toutes les données et...
    wsh.ShowAllData
    '... quitter la procédure.
    Exit Sub
  End If
  'sinon on continue
  
  'Définir la plage des cellules contenant le tableau
  Set rngTableau = wsh.Range(refCellule1).CurrentRegion
    
  'Si le filtre automatique n'est pas place, l'activer.
  If Not wsh.AutoFilterMode Then rngTableau.AutoFilter
  
  'Définir les numéros des champs à filtrer = numèro de la colonne de la feuille
  intChamp1 = wsh.Columns(refColonne1).Column
  intChamp2 = wsh.Columns(refColonne2).Column

  'Mettre en place le filtrage des deux champs
  rngTableau.AutoFilter Field:=intChamp1, Criteria1:=strCritère1
  rngTableau.AutoFilter Field:=intChamp2, Criteria1:=strCritère2
  
End Sub

Copies ce code dans le module de la feuille à filtrer :
Copier, Clic droit sur l'onglet, Visualiser le code, Coller
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

Merci patrice pour ces éléments.

En fait, je m'en suis sortie en évitant la saisie en VBA => j'ai triché en faisant jdes filtres que j'ai enregistrer dans ma macro, du coup le boss est content.

Bien évidemment il m' demandé une autre macro pour masquer les pages complètes (avec en-tête de collonne) => 1:133) si une ligne (129)en particulier est vide.

Là je ne peux pas utiliser les filtres? j'ai donc tenté ceci :

Rows("1:133").Select
If Cells("AK129") = 0 Then
End If
Selection.EntireRow.Hidden = True
End sub

Mais ça ne fonctionne pas, quelqu'un pourrait-il m'éclairer svp ?
Pour info, le fichier comporte plusieures pages à la suite pour lesquelles je devrais répéter la même opération mais si j'ai la bonne syntaxe pour une ligne, je devrais me débrouiller pour le reste.

D'avance merci.

ps : Encore merci MIKE 31 mais ça n'a pas fonctionné ; en effet sur la ligne
If Cells(r, "AJ") Like "X" And Cells(r, "AK") Like "0" Then
j'ai eu le message : "erreur de syntaxe" mais ça m'a quand même aidé à voir le langage à utiliser...
Messages postés
4239
Date d'inscription
lundi 20 avril 2009
Statut
Contributeur
Dernière intervention
12 septembre 2014
1 304
Bonjour,

Cells attend comme argument un numéro de ligne et un numéro de colonne.
Cells("AK129") ne fonctionne pas. Utilise Cells(129,37) ou Range("AK129"), ça ira mieux.

Cordialement.
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

oK merci, je vais tenter ça ; pour le reste ça vous semble correct ???
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Bonjour,

Pour détecter un 0 dans une cellule, il faut deux conditions :
- cellule non vide
et
- valeur = 0
car Excel considère qu'une cellule vide contient une valeur égale à 0

Ton code pour masquer les lignes 1:133 devient :
Sub xxx()

  If Cells(129, "AK").Value = 0 And Not IsEmpty(Cells(129, "AK").Value) Then
    Rows("1:133").Hidden = True
  Else
    Rows("1:133").Hidden = False
  End If

End Sub

Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
PS : Quelle version d'Excel utilises-tu ?

Il n'est pas normal que :
If Cells(r, "AJ") Like "X" And Cells(r, "AK") Like "0" Then 
donne "Erreur de syntaxe"
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

Autant pour moi, je m'était trompée sur la version , c'est office 2002 (sur) et excel 1998(je crois)...

Désolée.
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Avec Office 2002, ce doit être Excel 2002
Pour connaître la version :
Dans la ligne de menu, Cliquer sur le ? puis A propos de ...
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

Ok, merci beaucoup.
On peut-dire que t'es particulièrement patient...

Je verrai ça demain au boulot !!!

Bonne soirée
Salut patrice 33740,
Comme convenu, j'ai testé la macro :
If Cells(129, "AK").Value = 0 And Not IsEmpty(Cells(129, "AK").Value) Then
Rows("1:133").Hidden = True
Else
Rows("1:133").Hidden = False
End If

End Sub

Mais je reçois le message => erreur de compilation : Esle sans IF

La version excel est bien 2002, peut-être est-ce la raison ???
Qu'en penses-tu ???

D'avance merci.
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Re,

C'est plutôt Else sans IF

Cette macro fonctionne, c'est donc que tu as oublié ou ajouté quelque chose

Si tu veux qu'on vérifie il faut donner le texte intégral
En effet ça fonctionne très bien, un grand MERCI !

T'es un chef et moi un boulet...

A +
Hello, c'est encore moi, cette fois j'ai un souci pour réafficher les lignes :

J'ai donc 2 macros sur le même fichier => la 1ère à partir d'action de filtrage :
Sub Macrolignes()
'
' Columns("AJ:AJ").Select
selection.AutoFilter
selection.AutoFilter Field:=1, Criteria1:="=A", Operator:=xlOr, _
Criteria2:="<>0"
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 16
ActiveWindow.ScrollColumn = 15
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 12
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 10
ActiveWindow.ScrollColumn = 9
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 5
End Sub

Et la seconde macro :
Sub Macropage()
'
'
If Cells(129, "AK").Value = 0 And Not IsEmpty(Cells(129, "AK").Value) Then
Rows("8:133").Hidden = True
Else
Rows("8:133").Hidden = False
End If
End Sub

Et pour démasquer, je le fais manuellment => Afficher lignes
Je rencontre le problème suivant : J'arrive à lancer les 2 macros à la suite sans problème mais je ne peux plus démasquer ; cela n'est possible qu'en lançant une seule des 2 macros.

Est-ce possible avec excel 2002 et si oui peut-on compiler ces 2 macros pour n'en faire plus qu'une ???

D'avance merci.
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Re,

Tes macros ne correspondent pas à l'exposé du problème !
C'est certainement possible mais encore faudrait-il savoir ce que tu veux exactement ?

Expliques clairement la totalité du besoin :
- Quelles lignes faut-il masquer et sous quelles conditions
- Quelles sont les conditions du "démasquage"
- Comment la macro est-elle exécutée ? par un bouton, plusieurs bouton ou par un ou plusieurs événements ?

Patrice
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

En fait, la demande initiale était de masquer certaines ligne à 0 (mais pas toutes commes celles des intitulés...) => macro 1, exécutée par un bouton

Puis, la seconde demande fût de masquer toutes les pages vides => macro 2, exécutée par un second bouton.

Mais il faudrait annuler l'une ou l'autre ou les deux macros selon la volonté de l'utilisateur...

L'idéal serait executer la macro 1 à l'ouverture du fichier, de lancer la macro 2 quand on le désire et d'annuler chaque opération selon son souhait.

Bien entendu, ce serait l'idéal mais lancer les 2 macros et réafficher serait très bien.

J'espère avoir répondu assez clairement.

Ps: j'ai remarqué qu'il faut impérativement lancer la macro 1 avant la 2 sinon ça ne fonctionne pas...
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

Re Patrice,

Finalement ne t'embêtes pas j'ai trouvé la solution en enlevant tous filtres lorsque je désire démasquer er relancer la macro désirée en fonctin du besoin.

Le seul hic est pour le lancement automatique de la macro 1 dès ouverture du fichier.

J'ai bien trouvé cette discussion sur le forum mais ça ne fonctionne pas ; peut-être est-ce-du à la version excel ???

Je continu les recherches....

Encore merci
Messages postés
17829
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
24 janvier 2022
4 910
Re,

Je me permets de revenir dans la discussion, le problème n'est pas l'écriture d'un code mais de connaitre clairement les attentes dès le départ et accompagné d'un fichier exemple annoté sinon nous allons travailler et faire des propositions pour rien.
Messages postés
15
Date d'inscription
mardi 8 janvier 2013
Statut
Membre
Dernière intervention
28 janvier 2013

Salut Mike-31,

Merci beaucoup de t'intéresser "encore" à mes difficultés mais c'est ok ; je suis parvenue à atteindre tous mes objectifs.

Enfin pour le momment, vu que dès que je trouve une solution, mon boss me pose une nouvelle problématique !!!

Je ne m'en serais certainement pas sortie toute seule

MERCI encore à vous 2

A +