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

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
14 mai 2013 à 15:17
Bonne fête ucfoutu... en passant par là...


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
14 mai 2013 à 20:45
Bonsoir,

J’espère que l'après midi ne fut pas trop dure ;-)

J'ai testé ton code, ça fonctionne nickel et c'est hyper rapide... long de la minute obtenue avec mes differents essais.

Par contre un truc bizarre ma Feuil2 n'est pas pris en compte... je comprend pas du tout pourquoi. Voici le code utilisé:

Feuil1 (pour info toutes les feuilles sont verrouillées, idem pour le classeur et USFWait est juste une form avec un message d'attente le temps du traitement du fichier)
Private Sub CommandButton1_Click()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
   
USFwait.Show 0
USFwait.Repaint

 etat = False
  For i = 2 To 7
  Sheets(i).Activate
  Sheets(i).Unprotect Password:="Toto"
  voyons Sheets(i).Range("K4:K100"), "---", bouton, True
  Sheets(i).Protect Password:="Toto"
  Next
  
Worksheets(1).Activate
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
Unload USFwait
End Sub


le workbook
Private Sub Workbook_Open()

Set bouton = Sheets(1).CommandButton1
  etat = False
  For i = 2 To 7
    voyons Sheets(i).Range("K4:K100"), "---", bouton, False 
  Next
  If etat Then bouton.Caption "montrer" Else bouton.Caption "cacher"

With Worksheets("Total")
    .EnableAutoFilter = True
    .EnableOutlining = True
    .Protect Contents:=True, Password:="Indiko", UserInterfaceOnly:=True
End With
End Sub


et le 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
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 à 21:15
J'ai testé ton code, ça fonctionne nickel et c'est hyper rapide..
.
C'est probablement un sacré coup de veine, "imbibé" comme je le suis ...

Par contre un truc bizarre ma Feuil2 n'est pas pris en compte.

C'est probablement dû au fait que ta feuille Feuil2 n'est pas celle d'indice 2.
C'est la raison pour laquelle il est toujours plus prudent de ne pas se référer aux feuilles par leurs indices (qui peuvent changer), mais par leurs noms (qui, eux, ne changent pas)
Il faut vraiment que je fasse maintenant dodo.
Je te montrerai demain matin comment, avec juste un petit ajout, se référer en boucle aux feuilles qui t'intéressent par leurs noms, sans rien "bousculer du reste".
Bonne nuit.
________________________
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 à 21:53
oki en tout cas un grand merci a toi. Bonne nuit
0

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

Posez votre question
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
15 mai 2013 à 00:00
re,

bon j'ai fait des essais (non concluants) pour prendre en compte les noms des feuilles plutôt que leur index. En fait j'ai essayer les faire un tableau a deux dimensions avec comme variables:
- le nom des feuilles
- le range a scanner dans la sub "voyons"

Par exemple mon classeur aurait 3 feuilles ("Total", "Pieces", "Prix") et en fonction de la feuille, faire la procédure "voyons" sur les ranges suivants:

- "K14:K100" (pour "Total")
- "K4:K63" (pour "Pieces")
- "K20:K120" (pour "Prix)

Je pense qu'il n'y aurait qu'à modifier le sub CommandButton1_Click()

Je continu mes essais
0
waspy59 Messages postés 189 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 15 mai 2013
15 mai 2013 à 00:35
Bon j'ai avancé j'ai fait ceci:

Private Sub Workbook_Open()

tab1(0, 0) = "Total"
tab1(0, 1) = "K14:K63"
tab1(1, 0) = "Réactifs"
tab1(1, 1) = "K14:K64"
tab1(2, 0) = "Calibrateurs"
tab1(2, 1) = "K14:K93"
tab1(3, 0) = "Contrôles"
tab1(3, 1) = "K14:K75"
tab1(4, 0) = "Accessoires Indiko"
tab1(4, 1) = "K14:K44"
tab1(5, 0) = "Prix Patient"
tab1(5, 1) = "K14:K63"


Set bouton = Sheets(1).CommandButton1
  etat = False
  
  For i = 0 To 5
    voyons Sheets(tab1(i, 0)).Range(tab1(i, 1)), "---", bouton, False '====>>> remplkace ici par ta chaîne à toi
  Next
  If etat Then bouton.Caption "montrer" Else bouton.Caption "cacher"
  

With Worksheets("Total")
   .EnableAutoFilter = True
   .EnableOutlining = True
   .Protect Contents:=True, Password:="Indiko", UserInterfaceOnly:=True
End With
End Sub


et

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
   
USFwait.Show 0
USFwait.Repaint

 etat = False
  
For i = 0 To 5
Sheets(tab1(i, 0)).Activate
Sheets(tab1(i, 0)).Unprotect Password:="Indiko"
voyons Sheets(tab1(i, 0)).Range(tab1(i, 1)), "---", bouton, True
Sheets(tab1(i, 0)).Protect Password:="Indiko"
Next
  
  
  
Worksheets(1).Activate
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
Unload USFwait
End Sub


ça fonctionne parfaitement sauf pour la feuille appelée "Total"... je comprend pas pourquoi. J'ai essayer de changer de nom ect...

penses tu que je puisse t'envoyer mon fichier afin que tu jettes un œil?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
15 mai 2013 à 00:48
Bonjour,

Je n'ai pas trop suivi le post, mais...
Si ça fonctionne pour toutes les feuilles sauf Total, es-tu certain qu'il n'y a pas d'espace à la fin du nom de feuille Total ou quelque chose du genre ?

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 mai 2013 à 05:37
Bon,
1) bravo pour ton tableau à deux dimensions (ce qui te permet de définir des plages différentes pour chaque feuille)

2) ta feuille total est protégée différemment des autres et par un mot de passe différent. Il te faut donc la déprotéger différemment quand arrive son tour.

________________________
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
15 mai 2013 à 08:53
Bonjour,

Ben le soucis est que toutes les feuilles et le classeur ont le même mot de passe. Dans les exemples ici j'avais mis Toto mais le vrai mon de passe est Indiko. De plus pas d'espace dans le nom de la feuille Total

Mais le truc bizarre, est que sur la feuille Total j'ai des listes qui on tendance à disparaître sur d'autre version d'excel. Alors que sur les autres feuilles j'ai également des listes du même type qui elles ne bougent pas.... je pige pas trop le soucis. La Feuille Total peut-elle être corrompue?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
15 mai 2013 à 10:04
Bizarre, ton truc.
Recommence pour voir ton classeur à neuf (nouveau classeur) et ses feuilles, sans installer de protections.
Si tout fonctionne alors comme je le pense sans problèmes, la cause sera à chercher dans ton système de protection.


________________________
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
Rejoignez-nous