Masquer demasquer lignes sous excel

Résolu
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013 - 13 mai 2013 à 18:11
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 15 mai 2013 à 10:04
Bonjour a tous,

J'ai un petit soucis sous excel et vba. je cherche a creer un bouton masquer/demasquer, qui me permette de masquer ou demasquer les lignes d'un range en fonction de leur etat hidden.

j'utilise le code suivant:


Dim s As Shape, I As Long, a As Long, e As Long
Dim tablosupp() As Variant

Sub MasquerDemasquer()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
   
USFwait.Show 0
USFwait.Repaint
   
For I = 2 To 7
    e = 0
 
    Sheets(I).Activate
    Sheets(I).Unprotect Password:="Toto"
 
    For Each s In Sheets(I).Shapes
    s.Placement = xlMoveAndSize
    Next
 
    With Sheets(I).Range("K14:K100")
    Set c = .Find("---", LookIn:=xlValues)
        If Not c Is Nothing Then
        firstAddress = c.Address
        Do
        e = e + 1
        ReDim Preserve tablosupp(1 To e) 
        tablosupp(e) = c.Address
        Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
        End If
 
  For a = 1 To UBound(tablosupp)
        If Sheets(I).Range(tablosupp(a)).EntireRow.Hidden = True Then
        Sheets(I).Range(tablosupp(a)).EntireRow.Hidden = False
        Sheets(1).Cells(1, 19) = "NON"
        Sheets(1).CommandButton1.Caption = "Masquer"
        Else
        Sheets(I).Range(tablosupp(a)).EntireRow.Hidden = True
        Sheets(1).Cells(1, 19) = "OUI"
        Sheets(1).CommandButton1.Caption = "Demasquer"
        
        End If
    Next
    End With
Sheets(I).Protect Password:="Toto"
Next

Worksheets(1).Activate
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
Unload USFwait
End Sub



ce code n'est pas parfait, car si je clique sur le bouton pour masquer les lignes contenant "---" en K, il les masque bien. Mais si j'enregistre et que je rouvre le fichier excel, en recliquant sur le bouton pour cette fois demasquer, alors j'ai l'erreur d'execution 9 sur la ligne:

For a = 1 To UBound(tablosupp)


c'est normal vu que le tableau est vide... comment faire pour ne pas avoir cette erreur mais toujours pouvoir masquer ou demasquer les lignes en utilisant UN SEUL bouton?

merci pour votre aide

30 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 mai 2013 à 18:33
Bon...
Je zigzague encore un peu (dur dur, de sortir de ripailles...).

On va quand même tâcher de faire avec ces "vapeurs" :
Dis-moi ce que fait ceci

Dans thisworkbook :
Private Sub Workbook_Open()
  Set bouton = Sheets(1).CommandButton1
  etat = False
  For i = 2 To 7
    voyons Sheets(i).Range("K4:K100"), "ici", bouton, False '====>>> remplkace ici par ta chaîne à toi
  Next
  If etat Then bouton.Caption "montrer" Else bouton.Caption "cacher"
End Sub

Dans un module :
Public atraiter As Range, bouton As Object, etat As Boolean

Public Sub voyons(plage As Range, quoi As String, bouton As Object, how As Boolean)
  Dim i As Long, tablo
  Set atraiter = Nothing
  If WorksheetFunction.CountIf(plage, quoi) > 0 Then
    tablo = plage
    For i = 1 To UBound(tablo)
      If tablo(i, 1) = quoi Then
        If plage(i).EntireRow.Hidden True Then etat True
        If atraiter Is Nothing Then
          Set atraiter = plage(i)
        Else
          Set atraiter = Union(atraiter, plage(i))
        End If
      End If
    Next
  End If
  If etat Then bouton.Caption "cacher" Else bouton.Caption "montrer"
  If Not how Then Exit Sub
  If Not atraiter Is Nothing Then
    atraiter.EntireRow.Hidden = Not etat
  End If
End Sub

et sur ta feuille 1 :
Private Sub CommandButton1_Click()
  etat = False
  For i = 2 To 7
     voyons Sheets(i).Range("K4:K100"), "ici", bouton, True
  Next
End Sub




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
Utilisateur anonyme
13 mai 2013 à 19:08
Bonjour,

If ubound(tablosupp) > 0 then
    For a = 1 To UBound(tablosupp) 
       bla bla bla
    next a
end if
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 mai 2013 à 19:23
Bonjour,
Il me faut m'absenter pour environ deux heures 30 (pêche/marée)
Je viendrai vers toi à mon retour avec du plus rapide.
A +


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
13 mai 2013 à 20:03
@cmarcotte: même erreur sur le if ...
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 mai 2013 à 22:03
Bon. Me voilà de retour.
Si j'ai bien tout compris :
1) - les lignes à masquer/démasquer sont celles contenant "---" en colonne K, de la ligne 4 à la ligne 100. Est-ce bien cela (Réponse oui ou réponse non) ?
2) - ton masquage/démasquage doit-il pouvoir se faire y compris entre deux sessions de ton appli (réponse oui ou réponse non) ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
13 mai 2013 à 23:01
hello

1) oui

2) oui

Pour être précis, toutes les lignes contenant "---" seront masquées ou non masquées (pas de panachage). Par contre ces lignes contenant "---" seront variables en fonction du remplissage d'autre onglets.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 mai 2013 à 23:03
Bon... plus là ?
ergarde ce petit exemple que je viens de bâcler !
Sur une feuille de calcul contenant un bouton de commande commandutton1
- écris quelques "ici" en colonne K, entre les lignes 4 et 100
et mets ce code :
Private atraiter As Range
Private Sub CommandButton1_Click()
  If Not atraiter Is Nothing Then
    atraiter.EntireRow.Hidden = Not atraiter.EntireRow.Hidden
    CommandButton1.Caption = IIf(atraiter.EntireRow.Hidden, "montrer", "masquer")
  End If
End Sub

Private Sub Worksheet_Activate()
  voyons
  If Not atraiter Is Nothing Then
    CommandButton1.Caption = IIf(atraiter.EntireRow.Hidden, "montrer", "masquer")
  Else
    CommandButton1.Caption = "masquer"
  End If
End Sub

Private Sub voyons()
  Dim quoi As String, plage As Range, i As Long, tablo
  quoi = "ici"  '=======>>> mets-y ce que toi, tu veux comme critère
  Set plage = Range("K4:K100")
  If WorksheetFunction.CountIf(plage, quoi) > 0 Then
    tablo = plage
    For i = 1 To UBound(tablo)
      If tablo(i, 1) = "ici" Then
        If atraiter Is Nothing Then
          Set atraiter = plage(i)
        Else
          Set atraiter = Union(atraiter, plage(i))
        End If
      End If
    Next
  End If
End Sub

Vas sur une autre feuille puis reviens sur cette feuille (car j'ai utilisé son évènement activate)
Et regarde ce qui se passe.
A toi de jouer avec cela, maintenant. Adapte en utilisant l'évènement Workbook_Open plutôt que le Sheet_activate, si tu préfères.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
13 mai 2013 à 23:15
salut

la declaration de "atraiter" doit ce mettre ou?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 mai 2013 à 23:18
tout ce code : de la 1ère ligne à la dernière : sur le module de code de ta feuille ! Un simple copier.coller


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
13 mai 2013 à 23:23
j'ai testé cela

dans un module
Private atraiter As Range

Private Sub voyons()
  Dim quoi As String, plage As Range, i As Long, tablo
  quoi = "---"  '=======>>> mets-y ce que toi, tu veux comme critère
  Set plage = Range("K4:K100")
  If WorksheetFunction.CountIf(plage, quoi) > 0 Then
    tablo = plage
    For i = 1 To UBound(tablo)
      If tablo(i, 1) = "ici" Then
        If atraiter Is Nothing Then
          Set atraiter = plage(i)
        Else
          Set atraiter = Union(atraiter, plage(i))
        End If
      End If
    Next
  End If


dans le workbook_open:
Private Sub Workbook_Open()

 voyons
  If Not atraiter Is Nothing Then
    CommandButton1.Caption = IIf(atraiter.EntireRow.Hidden, "montrer", "masquer")
  Else
    CommandButton1.Caption = "masquer"
  End If
End sub


et enfin, dans le code de la feuille contenant mon bouton:

Private Sub CommandButton1_Click()
If Not atraiter Is Nothing Then
    atraiter.EntireRow.Hidden = Not atraiter.EntireRow.Hidden
    CommandButton1.Caption = IIf(atraiter.EntireRow.Hidden, "montrer", "masquer")
  End If
End Sub


au final... erreur d'execution 424, objet requis sur le if du commandbutton

problème de portée du "atraiter"?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 mai 2013 à 23:34
Là, ce sont apparemment les rudiments, qui te manquent !!!!
Je ne vais pas te prendre par la main tout au long, comme çà !!!
Je vais te laisser cogiter et travailler un peu seul sur cette adaptation, hein ...
Juste quelques indications pour que tu t'y mettes avec sérieux :
- intéresse-toi à la portée des variables (B.A.BA)
- intéresse-toi à l'accessibilité des procédures (également B.A.BA)
- on ne peut accéder à un un contrôle "distant" qu'en le faisant précéder de son container (B.A.BA également)
Je ne t'aiderai au-delà qu'après avoir vu le résultat (ou au moins ta tentative) de ton acquisition (ultra nécessaire) de ces notions de base .
Donnant donnant !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
13 mai 2013 à 23:35
bon je dois pas être doué... j'arrive pas a adapter ton exemple
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
13 mai 2013 à 23:37
oki ça roule
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
14 mai 2013 à 00:31
Bon avant toute chose je dois dire que je suis plutôt neophyte en vba... je l'utilise une fois tous les 36 et pour des truc très simple. La ça depasse mes faibles compétences en la matière.

J'ai donc refait un essai, sur mon projet qui comporte 7 feuillets, et pour lesquels je veux masquer/demasquer les lignes contenant "---" en K (pour les feuillets 2 à 7).

Donc dans le code de ma feuillet 1 qui contient le commandbutton, j'ai mis:
Private Sub CommandButton1_Click()
If Not atraiter Is Nothing Then
    atraiter.EntireRow.Hidden = Not atraiter.EntireRow.Hidden
    CommandButton1.Caption = IIf(atraiter.EntireRow.Hidden, "montrer", "masquer")
  End If
End Sub


Dans le code du workbook, j'ai mis:
Private Sub Workbook_Open()
a = 1
voyons
  If Not atraiter Is Nothing Then
    CommandButton1.Caption = IIf(atraiter.EntireRow.Hidden, "montrer", "masquer")
  Else
    CommandButton1.Caption = "masquer"
  End If
  
With Worksheets(1)
    .EnableAutoFilter = True
    .EnableOutlining = True
    .Protect Contents:=True, Password:="Indiko", UserInterfaceOnly:=True
End With
 a = 0
End Sub


enfin dans un module, j'ai mis:

Public atraiter As Range
Public a As Integer


Public Sub voyons()
  Dim quoi As String, plage As Range, i As Long, j As Long, tablo
  
  
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  If a = 0 Then
  USFwait.Show 0
  USFwait.Repaint
  End If
   
   For j = 2 To 7
    e = 0
 
    Sheets(j).Activate
    Sheets(j).Unprotect Password:="Toto"
 
    For Each s In Sheets(j).Shapes
    s.Placement = xlMoveAndSize
    Next
 
 quoi = "---"
Set plage = Sheets(j).Range("K14:K100")
  
  If WorksheetFunction.CountIf(plage, quoi) > 0 Then
    tablo = plage
    For i = 1 To UBound(tablo)
      If tablo(i, 1) = quoi Then
        If atraiter Is Nothing Then
          Set atraiter = plage(i)
        Else
          Set atraiter = Union(atraiter, plage(i))
        End If
      End If
    Next
  End If
 
 Sheets(j).Protect Password:="Toto"
Next


Worksheets(1).Activate
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
If a = 0 Then
Unload USFwait
End If
  End Sub



J'ai donc mis en public le sub "voyons" pour pouvoir l'appeler a l'initialisation du workbook. idem pour le range "atraiter".

Mais j'obtiens l'erreur d'excution 1004...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 mai 2013 à 06:56
Déjà : tu n'as tenu aucun compte de ce que je t'ai dit plus haut :
- on ne peut accéder à un un contrôle "distant" qu'en le faisant précéder de son container (B.A.BA également)

Comment veux-tu que cette ligne de ton code :
 CommandButton1.Caption =  IIf(atraiter.EntireRow.Hidden, "montrer", "masquer")

présente dans une procédure dans un module distinct de celui de la feuille contenant ce bouton de commande puisse avoir la moindre chance de savoir de quel bouton il s'agit !
Je veux bien tout t'écrire, mais je tiens à ce que tu fasses AU MOINS ce petit effort-là !
Suggestion d'entraînement : sur un classeur tout neuf : met un bouton de commande CommonButton1 sur chacune des feuilles 1 et 2.
Depuis celui de la feuille2 (au click de son bouton de commande) remplace par "coucou" le caption du bouton de la feuille 1.
Fais AU MOINS ce pas-là et je t'écrirai (donnant donnant) alors ensuite tout ton code. Pas avant !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
14 mai 2013 à 10:24
salut,

Oui autant pour moi, j'avais zappé ce passage (pourtant j'ai déjà fait des petits prog en vb6 et en VB.net).

Donc du coup, je dois mettre dans le code du workbook:

Private Sub Workbook_Open()
a = 1
voyons
  If Not atraiter Is Nothing Then
    Feuil1.CommandButton1.Caption = IIf(atraiter.EntireRow.Hidden, "montrer", "masquer")
  Else
    Feuil1.CommandButton1.Caption = "masquer"
  End If
  
With Worksheets("Total")
    .EnableAutoFilter = True
    .EnableOutlining = True
    .Protect Contents:=True, Password:="Toto", UserInterfaceOnly:=True
End With
 a = 0
End Sub


Oui bien plutôt "Activeworkbook.sheet(1).CommandButton"?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 mai 2013 à 10:39
Essaye et tu le sauras . Non ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
14 mai 2013 à 11:09
J'ai testé les deux écriture, elles fonctionnent toutes deux deux mais laquelle est a privilégier?

Concernant mon exemple, j'ai l'erreur 1004, la methode 'union de l'objet' _global a échoué...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 mai 2013 à 11:38
Voilà... Rien ne vaut les tests pour apprendre des "choses"
1)La précision d'un classeur n'est nécessaire que si entre deux classeurs différents (ce qui n'est pas ton cas). Sans précision du classeur, c'est le classeur actif
2) il me faut aujourd'hui enterrer ma 71ème année (hé oui...) je viendrai te faire tout ton code au retour des ripailles (cet aprem, donc).
A +


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
14 mai 2013 à 11:49
oki merci pour tes lumières

très bon anniversaire et bon ripaille
0
Rejoignez-nous