VBA - Création de sous-onglets

Bonjour à tous,

Je travaille actuellement sur un fichier Excel que j'aimerais rendre plus facile d'utilisation, en réduisant le nombre d'onglets qui apparaît. Je souhaite en fait créer des "sous-onglets". Voici ce que j'ai en tête :

  • Onglet 1 = Récap Global
  • Onglet 2 = Fournisseur 1
  • Onglet 3 = Détail Factures du Fournisseur 1
  • Onglet 4 = Fournisseur 2
  • Onglet 5 = Détail Factures du Fournisseur 2
  • Onglet 6 = Fournisseur 3
  • Onglet 7 = Détail Factures du Fournisseur 3
  • etc...

Ce que j'aimerais faire, c'est que ce soit visible uniquement les onglets principaux (Récap + Fournisseur 1 ; 2 ; 3 ; etc.), et que les autres soient masqués ; et que lorsque l'on appuie sur l'onglet Fournisseur 1 par exemple, uniquement l'onglet Détail Factures du Fournisseur 1 apparaisse (tout en laissant les onglets principaux visibles)

L'écriture VBA serait donc du style :

Cacher tous les onglets "Détails Factures du Fournisseur 1 ; 2 ; 3 ; etc."

IF sélection Onglet 2 = Fournisseur 1, THEN afficher Onglet 3 = Détail Factures du Fournisseur 1

J'espère avoir été compréhensible. Vous trouverez un fichier en PJ qui vous aidera certainement à mieux comprendre le problème.

Je vous remercie par avance pour votre aide ; n'hésitez pas à revenir vers moi si vous avez des questions !

WoOdErOu

153questions-vba-v1.xlsm (20.67 Ko)

Bonjour,

à tester,

Sub RAZ()
For Each f In Worksheets
If Left(f.Name, 7) = "Détails" Then f.Visible = False  'ou xlVeryHidden
Next
End Sub

Bonjour à tous,

une autre solution, basée sur le nom des feuilles du classeur joint:

dans la feuille de code ThisWorkBook:

Private Sub Workbook_Open()
 MaskInit
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim Cherch As String, Feuil As Worksheet
Application.ScreenUpdating = False
Cherch = "*" & Left(Sh.Name, InStr(Sh.Name, ".")) & "*"
MaskInit
Application.EnableEvents = False
For Each Feuil In Worksheets
    If Sh.Name <> "Synthèse Globale" Then
        If Feuil.Name Like Cherch Then Feuil.Visible = True
    End If
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

et dans un module standard:

Sub MaskInit()
Dim Sh As Worksheet
Application.ScreenUpdating = False
Application.EnableEvents = False
For Each Sh In Worksheets
    If Sh.Name = "Synthèse Globale" Or Sh.Name Like "*Fournisseur*" Then
        Sh.Visible = True
    Else
        Sh.Visible = False
    End If
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

A l'ouverture du classeur seules les feuilles fournisseurs et Synthèse Globale sont visibles.

A la sélection de la feuille d'un fournisseur, les feuilles de ce fournisseurs sont visibles ( en plus des précédentes)

A la sélection de la feuille d'un nouveau fournisseurs les feuilles de l'autre fournisseur sont masquées et celles du nouveau sont affichées.

A+

Bonjour AlgoPlus,

Un grand merci pour ton aide! C'est presque parfait. Il y a juste un problème lorsque j'essaye d'aller sur les onglets "Détail Factures", cela me fait automatiquement passer à l'onglet suivant, sans que je ne puisse consulter l'onglet "Détail Factures".

Merci également à toi i20100

Correction:

rajouter cette ligne dans Private Sub Workbook_SheetActivate(ByVal Sh As Object) juste après la ligne de déclaration:

If Sh.Name Like "*Détail*" Then Exit Sub

A+

T'es trop fort Stay tuned, je reviens avec plein d'autres sujets de VBA haha !

Rechercher des sujets similaires à "vba creation onglets"