Masquer lignes selon 2 conditions par macro excel

Résolu/Fermé
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013 - 8 janv. 2013 à 18:57
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013 - 10 janv. 2013 à 14:08
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

Mike-31 Messages postés 18177 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 janvier 2023 5 033
8 janv. 2013 à 22:00
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
1
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 janvier 2023 1 762
8 janv. 2013 à 19:55
Pourquoi une macro alors qu'un simple filtre suffit ?
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
8 janv. 2013 à 20:03
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 ???
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
8 janv. 2013 à 23:33
un grand merci MIKE 31. T'imagines pas comme tu me fais plaisir ; je vais tester ça dès demain...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 janvier 2023 1 762
8 janv. 2013 à 23:42
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
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
9 janv. 2013 à 18:50
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...
0
chossette9 Messages postés 4239 Date d'inscription lundi 20 avril 2009 Statut Contributeur Dernière intervention 12 septembre 2014 1 301
9 janv. 2013 à 19:02
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.
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
9 janv. 2013 à 19:16
oK merci, je vais tenter ça ; pour le reste ça vous semble correct ???
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 janvier 2023 1 762
9 janv. 2013 à 19:30
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

0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 janvier 2023 1 762
9 janv. 2013 à 19:33
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"
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
9 janv. 2013 à 19:42
Autant pour moi, je m'était trompée sur la version , c'est office 2002 (sur) et excel 1998(je crois)...

Désolée.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 janvier 2023 1 762
9 janv. 2013 à 19:47
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 ...
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
9 janv. 2013 à 19:57
Ok, merci beaucoup.
On peut-dire que t'es particulièrement patient...

Je verrai ça demain au boulot !!!

Bonne soirée
0
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.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 janvier 2023 1 762
Modifié par Patrice33740 le 10/01/2013 à 10:08
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
0
En effet ça fonctionne très bien, un grand MERCI !

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

A +
0
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.
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 janvier 2023 1 762
Modifié par Patrice33740 le 10/01/2013 à 11:46
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
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
10 janv. 2013 à 12:15
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...
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
10 janv. 2013 à 12:26
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
0
Mike-31 Messages postés 18177 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 29 janvier 2023 5 033
10 janv. 2013 à 13:17
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.
0
PLAYA2 Messages postés 15 Date d'inscription mardi 8 janvier 2013 Statut Membre Dernière intervention 28 janvier 2013
10 janv. 2013 à 14:08
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 +
0