Onglets

Bonjour à tous,

Devant gérer un fichier excel avec de très nombreux onglets, je souhaiterais les regrouper en onglet-sous-onglet.

Cette fonctionnalité n'étant pas possible, je souhaiterais inscrire sur le code de la feuille "regroupant" un code permettant d'afficher les onglets cachés en fonction du contenu d'une cellule de ceux-ci.

Par exemple pour un fichier de commande, si un tous les onglet, comporte la même structure et le nom du client est présent en H6, Ayant déjà créé une feuille pour chaque client, je souhaite afficher les commande concernant le client à l'ouverture de la feuille qui lui est dédiée et de les masquer ensuite.

Merci d'avance

Charles Nicod

Bonjour,

regarde ceci, je pense que ce n'est pas très loin https://forum.excel-pratique.com/viewtopic.php?p=820796#p820796

je vais regarder pour améliorer cette superbe idée pour ma propre bibliothèque !

Steelson,

Merci pour cette réponse, malheureusement en allant sur la discussion que vous m'avez recommandé, et en téléchargeant les fichiers présent je ne suis pas très avancé dans ma recherche.

Pratiquant depuis peu le développement sous vba je ne comprends pas le lien entre mon problème et les solutions proposées:

D'autant que le code soumis comporte des erreurs initiant le débogueur

Pas d'inquiétude, c'est le genre de sujet qui m'intéresse. Je vais faire un démonstrateur ...

Voici une proposition

Option Explicit
Const crit = "A2"
Const var = "H6"

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim choix() As Variant, sw As Worksheet
Dim dico As Object

        ReDim choix(1 To 1)
        If Not Intersect(Range(crit), Target) Is Nothing Then
            Set dico = CreateObject("Scripting.Dictionary")
            For Each sw In Worksheets
                dico(sw.Range(var).Value) = ""
            Next
            If dico.Count > 0 Then
                Target.Validation.Delete
                Target.Validation.Add xlValidateList, Formula1:=Join(dico.keys, ",")
            End If
        End If

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range(crit), Target) Is Nothing Then lister
End Sub

Private Sub Worksheet_Activate()
    lister
End Sub

Sub lister()
Dim sw As Worksheet
    Range("A1").CurrentRegion.Offset(1, 1).Clear
    For Each sw In Worksheets
        If sw.Range(var) = Range(crit) Then
            Range("B" & Rows.Count).End(xlUp).Offset(1, 0) = sw.Name
            sw.Visible = True
        Else
            If sw.Name <> "Sommaire" Then sw.Visible = False
        End If
    Next
End Sub

Merci Beaucoup je vais me pencher là dessus.

Petite question quand je veux définir une variable comme groupe de feuille après une feuille précise que dois je mettre apres

Dim WS as Worksheets pour qu'il ne prenne pas tout le classeur ?

quand je veux définir une variable comme groupe de feuille après une feuille précise que dois je mettre apres

Dim WS as Worksheets pour qu'il ne prenne pas tout le classeur ?

je n'ai pas bien compris la question ! pourrais-tu reformuler avec un exemple ?

J'ai simplifié la macro ...

Option Explicit
Const crit = "A2"
Const var = "H6"

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim sw As Worksheet
Dim dico As Object

        If Not Intersect(Range(crit), Target) Is Nothing Then
            Set dico = CreateObject("Scripting.Dictionary")
            For Each sw In Worksheets
                dico(sw.Range(var).Value) = ""
            Next
            If dico.Count > 0 Then
                Target.Validation.Delete
                Target.Validation.Add xlValidateList, Formula1:=Join(dico.keys, ",")
            End If
        End If

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range(crit), Target) Is Nothing Then lister
End Sub

Private Sub Worksheet_Activate()
    lister
End Sub

Sub lister()
Dim sw As Worksheet
    Range("A1").CurrentRegion.Offset(1, 1).Clear
    For Each sw In Worksheets
        If sw.Range(var) = Range(crit) Then
            Range("B" & Rows.Count).End(xlUp).Offset(1, 0) = sw.Name
            sw.Visible = True
        Else
            If sw.Name <> ActiveSheet.Name Then sw.Visible = False
        End If
    Next
End Sub

Merci beaucoup je commence à y voir clair..

Oui bien sur je m'explique, je ne dois pas prendre en compte l'intégralité des feuilles, or si je metFor each i in Worksheets c'est ce qu'il va faire.

Je voulais donc créer une variable regroupant les feuilles après la premiere a prendre en compte pour pouvoir ecrire

For each i in [cette variable]

[cette variable] doit être un array :

Dim extraitfeuilles As Variant
extraitfeuilles = Array(Sheets("A"), Sheets("B"))

exemple

Sub test()

Dim extraitfeuilles As Variant
extraitfeuilles = Array(Sheets("A"), Sheets("B"))

For Each sw In extraitfeuilles
    MsgBox sw.Range("A1").Value
Next

End Sub

Merci pour tout

Dois-je toutes les nommer je ne peux pas faire array (sheets("a");sheets("c"))dans ton exemple?

Non, on doit pouvoir faire une affectation automatique, genre :

Dim extraitfeuilles() As Variant
ReDim extraitfeuilles(1 To Worksheets.Count)

i = 0
For Each sw In Worksheets
    If sw.Range("H6").Value = "tel_client" Then
        i = i + 1
        extraitfeuilles(i) = sw.Name
        MsgBox sw.Name
    End If
Next
ReDim extraitfeuilles(1 To i)

Il faudrait que je peaufine car j'ai tenté set extraitfeuilles(i) = sw qui serait plus approprié sans grand succès ... à suivre demain !

Je reviens sur le sujet ...

soit tu fais :

Dim extraitfeuilles() As String
ReDim extraitfeuilles(1 To Worksheets.Count)
i = 0
For Each sw In Worksheets
    If sw.Range("H6").Value = "Tel_client" Then
        i = i + 1
        extraitfeuilles(i) = sw.Name
    End If
Next
ReDim Preserve extraitfeuilles(1 To i)

et tu stockes le nom des feuilles dans un array

soit tu fais :

Dim extraitfeuilles() As Variant
ReDim extraitfeuilles(1 To Worksheets.Count)
i = 0
For Each sw In Worksheets
    If sw.Range("H6").Value = "Tel_client" Then
        i = i + 1
        Set extraitfeuilles(i) = sw
    End If
Next
ReDim Preserve extraitfeuilles(1 To i)

et tu stockes les objets feuilles dans un array, ce qui est plus élégant et sans doute plus utile pour la site

Rechercher des sujets similaires à "onglets"