2017-08-02 1 views
0

J'ai actuellement une boucle qui fonctionne très bien pour masquer les colonnes en fonction de plusieurs cellules déroulantes. Je voudrais également ajouter du code pour masquer les feuilles basées sur les mêmes listes déroulantes, mais je ne suis pas sûr de savoir comment ajouter à mon For Each Cell In Range pour accommoder cela. J'ai collé ce que j'ai pour cacher les colonnes ci-dessous. Toute aide serait grandement appréciée.Masquer les colonnes et plusieurs feuilles à l'aide de la boucle

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim cell As Range 

For Each cell In Range("$A$30:$A$38") 

    If cell = "Descriptor 1" Or cell = "Descriptor 2" Then 
    Columns("B:F").EntireColumn.Hidden = False 
    Exit For 
    Else 
    Columns("B:F").EntireColumn.Hidden = True 
End If 
Next Cell 

Répondre

1

Vous pouvez utiliser quelque chose comme Worksheets("sheet_to_hide").Visible = xlSheetHidden pour cacher une feuille et Worksheets("sheet_to_unhide").Visible = xlSheetVisible à ce nouveau réafficher.

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cell As Range 
    Dim HideIt As Boolean 

    HideIt = True 
    For Each cell In Range("$A$30:$A$38")  
     If cell.Value = "Descriptor 1" Or _ 
      cell.Value = "Descriptor 2" Then 
      HideIt = False 
      Exit For 
     End If 
    Next Cell 

    If HideIt Then 
     Columns("B:F").Hidden = True 
     Worksheets("Sheet1").Visible = xlSheetHidden 
     Worksheets("Sheet2").Visible = xlSheetHidden 
    Else 
     Columns("B:F").Hidden = False 
     Worksheets("Sheet1").Visible = xlSheetVisible 
     Worksheets("Sheet2").Visible = xlSheetVisible 
    End If 
End Sub 

Si les feuilles doivent être cachés/rendus visibles selon que leur nom de la feuille apparaît dans votre gamme, alors je suggère la modification suivante:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cell As Range 
    Dim HideIt As Boolean 

    'Don't do anything if there was no change to A30:A38 
    If Intersect(Target, Range("$A$30:$A$38")) Is Nothing Then Exit Sub 

    HideIt = True 
    For Each cell In Range("$A$30:$A$38") 
     If cell.Value = "Descriptor 1" Or _ 
      cell.Value = "Descriptor 2" Then 
      HideIt = False 
      Exit For 
     End If 
    Next cell 
    Columns("B:F").Hidden = HideIt 

    Dim ws As Worksheet 
    For Each ws In Worksheets 
     If ws.Name <> ActiveSheet.Name Then 
      'See if sheet name exists in A30:A38 
      'Hide the sheet if doesn't, make it visible if it does 
      ws.Visible = Not IsError(Application.Match(ws.Name, Range("$A$30:$A$38"), 0)) 
     End If 
    Next 
End Sub 
+0

Merci pour la réponse rapide! Je vais essayer et vous dire comment ça marche! –

+0

Ok. Alors je l'ai essayé. Ça n'a pas marché comme je l'espérais. Le problème est dans mon explication. J'ai 22 feuilles chacune avec un nom correspondant dans une liste de validation de données dans 9 listes déroulantes distinctes. Je dois non seulement masquer les colonnes basées sur le Descripteur 1 et le Descripteur 2, mais aussi masquer/afficher les feuilles des 22 descripteurs indépendamment du code pour masquer les colonnes en fonction des sélections indépendantes dans les 9 listes déroulantes. Si les noms de feuille indépendants ne sont pas présents dans les listes déroulantes, les feuilles indépendantes doivent être masquées. –

+0

@il_Paco Pas certain à 100% que je comprenne, alors supportez-moi - vous voulez afficher les colonnes sur la feuille active si l'une des A30: A38 sont "Descripteur 1" ou "Descripteur 2"? Vous souhaitez également masquer une feuille de calcul (autre que la feuille active?) Dont le nom n'apparaît dans aucune des cellules A30: A38 de la feuille active, ou bien rendre la feuille visible si le nom de la feuille apparaît dans ces cellules. – YowE3K

0

@ YowE3K Votre code c'est génial. Mais j'ai eu un problème avec les noms d'onglet étant en forme courte et mes descripteurs étant en pleine forme. Donc, j'ai pris votre code original, ajouté un "HideTab" pour chaque onglet, et changé le topline HideTab = False à true et inversé dans la 4ème ligne HideTab (voir ci-dessous). Je suis sûr qu'il y a un moyen plus rapide, mais cela a fonctionné comme un charme. Merci beaucoup pour votre aide! Tu m'as indiqué dans la bonne direction.

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim cell As Range 
Dim HideIt As Boolean 

HideIt = True 
    For Each cell In Range("$A$30:$A$38")  
     If cell.Value = "Descriptor 1" Or 
     cell.Value = "Descriptor 2" Then 
     HideIt = False 
     Exit For 
    End If 
Next Cell 
Columns("B:F").EntireColumn.Hidden = True 


Dim HideTab1 As Boolean 
    HideTab1 = False 
    For Each cell In Range("$A$30:$A$38") 
     If cell = "Descriptor1" Then 
      HideTab1 = True 
      Exit For 
     End If 
    Next cell 
    Sheets("Desc1").Visible = HideTab1 

Dim HideTab2 As Boolean 
    HideTab2 = False 
    For Each cell In Range("$A$30:$A$38") 
     If cell = "Descriptor2" Then 
      HideTab2 = True 
      Exit For 
     End If 
    Next cell 
    Sheets("Desc2").Visible = HideTab2 

Dim HideTab3 As Boolean 
    HideTab3 = False 
    For Each cell In Range("$A$30:$A$38") 
     If cell = "Descriptor3" Then 
      HideTab3 = True 
      Exit For 
     End If 
    Next cell 
    Sheets("Desc3").Visible = HideTab3 
End Sub