Tri des onglets classeur XL2010 d'après sommaire

Signaler
Messages postés
4
Date d'inscription
mercredi 11 janvier 2012
Statut
Membre
Dernière intervention
13 janvier 2012
-
Messages postés
4
Date d'inscription
mercredi 11 janvier 2012
Statut
Membre
Dernière intervention
13 janvier 2012
-
Bonjour,

N'ayant pas trouvé de solution à mon problème après plusieurs jours de recherche je me permets de poser ma question ici :

J'ai un classeur Excel avec un nombre variable de feuilles (+250 et ça grandit) certaines avec des données brutes (souvent issues d'extraction de EssBase mais pas que), d'autres exploitant ces données et les mettant en forme. Ces dernières sont généralement intitulée numériquement sous le format ##### mais, pour faire simple, pas toujours (ex: 5 lettres puis 4 chiffres), ceux-ci correspondant à la nomenclature interne.

Je souhaite d'abord créer un sommaire pour pouvoir trier ces dernières d'après l'adresse de cellule "B101" comme suit :
- absence dans le sommaire des feuilles masquées & des feuilles non "nomenclaturées" (dont le nombre et le nom varie au cours du temps) - peut être en excluant les onglets qui sont de telle ou telle couleur ? (mais je ne sais pas comment faire cela ! )
- extraction dans ce sommaire de : intitulé de la feuille ; valeur en "A1" (nom de mon entité ; propre à chaque feuille) ; valeur en "B101" (valeur de tri des onglets par la suite)
- lien hypertexte au niveau de l'intitulé de la feuille

Par la suite je souhaite trier ce sommaire d'après la valeur "B101" de chaque feuille, puis ordonner uniquement les onglets concernés (nomenclaturés) dans l'ordre de ce sommaire sans toucher à celles qui ne m'intéressent pas.

J'ai trouvé ce code que j'ai modifié pour obtenir un sommaire avec nom de feuille avec lien hypertexte, valeur A1 et valeur B101. Mais ne connaissant rien (ou presque) en VBA je n'ai pas su aller plus loin :

Sub Ajout_Sommaire_NomsFeuilles()

Dim I As Integer
ActiveWorkbook.Worksheets(1).Select
ActiveSheet.Range("A2").CurrentRegion.ClearContents
For I = 2 To ActiveWorkbook.Worksheets.Count
ActiveSheet.Range("A" & I).Select
ActiveSheet.Hyperlinks.Add _
Anchor:=Selection, _
Address:="", _
SubAddress:="'" & Worksheets(I).Name & "'!A1", _
TextToDisplay:=Worksheets(I).Name
ActiveSheet.Range("B" & I) = Worksheets(I).Range("A1")
ActiveSheet.Range("C" & I) = Worksheets(I).Range("B101")
Next
Cancel = True

End Sub


J'avais également trouvé ce code-ci plus complet et devant me faire tout ce que je demande mais il ne semble pas fonctionner pour moi (sans doute parce que je m'y prends mal) et me met une "Erreur d'exécution 9 : L'indice n'appartient pas à la sélection" (ligne de débogage en gras) :

Sub Tri_Sommaire_Onglets_CAHT_BudFi()

Sheets("Sommaire").Activate
For I = 2 To Sheets.Count
Cells(I, 1).Value = Sheets(I).Name
Cells(I, 2).Value = Sheets(I).Range("A1").Value
Cells(I, 3).Value = Sheets(I).Range("B101").Value
Next

Columns("A:C").Sort Key1:=Range("B101"), Order1:=xlDescending, Header:=xlNo

Sheets(Cells(1, 1).Value).Move before:=Sheets(1)
For I = 2 To Sheets.Count
Sheets(Sheets("Sommaire").Cells(I, 1).Value).Move after:=Sheets(I - 1)
Next

End Sub


Cela fait 3 jours que j'essaye de trouver une solution donc si quelqu'un(e) voulait bien m'aider siouplé ?

Merci !

7 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,

je ne sais pas comment tu "approches" généralement VBA, mais c'est (pardonne-moi) un peu en dépit du bon sens

Essaye par exemple ceci, à adapter au beoin :

Dim c As Range, i As Integer
  With Sheets("sommaire")
    .Cells.ClearContents
    For i = 1 To Sheets.Count
      If Sheets(i).Name <> "sommaire" Then
       .Cells(i, 1).Value = Sheets(i).Name
      End If
    Next
    .Range("A:A").Sort Key1:=.Range("A1")
    DoEvents
    For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row
      Worksheets(.Range("A" & i).Text).Move after:=Sheets(Sheets.Count)
    Next



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Attention (zut) Ajoute bien évidemment eu
End With
à la ligne qui suit le dernier Next, hein !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
4
Date d'inscription
mercredi 11 janvier 2012
Statut
Membre
Dernière intervention
13 janvier 2012

je ne sais pas comment tu "approches" généralement VBA

ah mais je ne l'approche pas : je découvre ^^ Jusque là je ne connaissais qu'à demi mot et n'avait jamais eu à l'appliquer par moi-même...

je testerai tout à l'heure car c'est le repos des braves là ^^

merci en tout cas!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
ah mais je ne l'approche pas : je découvre

Je comprends.
Mais alors : fais comme moi, si tu veux continuer "en vraie bonne forme"
Commence par le tout début, pas à pas... en t'imposant des exercices de plus en plus complexes. Et surtout : sans jamais ouvrir Google pour y rechercher une "soluce" fausse amie.
C'est ainsi, que l'on devient tout doucement MAIS SUREMENT un vrai développeur, crois-moi.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
4
Date d'inscription
mercredi 11 janvier 2012
Statut
Membre
Dernière intervention
13 janvier 2012

Sur le principe je suis entièrement d'accord, c'est toujours la démarche que j'applique habituellement et que j'applique déàj sur mon temps libre.

Cependant, dans le cas présent, pas trop le choix : on me demande une solution pour vendredi au plus tard! Et, vu le contexte (patron dans le dos), je n'ai pas trop la possibilité de dire "non, je ne sais pas et pas le temps d'apprendre assez vite".

Donc je demande de l'aide pour celui-ci et après, promis, je continue l'auto-formation sérieusement (et sans notre ami Google )
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
on me demande une solution pour vendredi au plus tard!

Euh ... ce n'est pas vraiment la vocation de ce forum
promis, je continue l'auto-formation sérieusement (et sans notre ami Google

Bravo, mais il est alors à craindre que tu auras déjà pris inconsciemment de mauvaises habitudes (et rien n'est plus difficile à se débarrasser que des mauvaises habitudes prises au départ).
Garde ce conseil en mémoire et tu auras des chances de devenir un vrai crack, bien différent (tous aspects confondus) de tous les faux cracks.
Voilà ! (tu sais quoi ? ===>> moi, je suis un vieux)
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
4
Date d'inscription
mercredi 11 janvier 2012
Statut
Membre
Dernière intervention
13 janvier 2012

En continuant mes recherches et à l'aide de divers forums, voici la réponse :

Sub Tri_Sommaire_Onglets_CAHT_BudFi()
Dim Ws As Worksheet
Dim i As Integer, j As Integer
 
Application.ScreenUpdating = False
With Worksheets("Sommaire")
    .Move Before:=Sheets(1)
    .UsedRange.Clear
    For Each Ws In ThisWorkbook.Worksheets
                If Len(Ws.Name) 9 Or Len(Ws.Name) 6 Then              'ici j'ai mis le test sur le nom des feuilles (je parcour les feuilles à 9 ou 6 lettres par exemple)
            i = i + 1
            .Hyperlinks.Add Anchor:=.Range("A" & i), Address:="", SubAddress:="'" & Ws.Name & "'!A1", TextToDisplay:=Ws.Name
            .Range("B" & i) = Ws.Range("A1")
            .Range("C" & i) = Ws.Range("B101")
        End If
    Next Ws
    If i > 0 Then
        .Range("A1:C" & i).Sort Key1:=.Range("C1"), Order1:=xlDescending, Header:=xlNo
 
        For j = i To 1 Step -1
            ThisWorkbook.Worksheets(CStr(.Range("A" & j))).Move After:=Worksheets(1)
        Next j
    End If
    .Activate
End With
End Sub


Suite à ce code j'ai observé que les valeurs "vide" et "0" n'étaient pas triées de la même manière les "vides" se retrouvant en début de tri.

J'ai également modifié le code par la suite pour obtenir un tri par couleurs d'onglet afin de trier au sein de 4 grands sous-groupes.

Merci encore pour votre aide.

XLtiti