Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2012, 10h26   #1
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Par défaut Tri d'après sommaire des onglets d'un classeur XL

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 :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Ajout_Sommaire_NomsFeuilles() <blockquote>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</blockquote>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) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
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 !
XLtiti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 10h45   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Alors déjà, le premier code que tu as trouvé, il est vraiment pas beau. Comme on le dit souvent, il faut éviter les Select ou Activate à répétition.

Je m'intéresse plutôt au 2ème donc. Le problème qui se pose, c'est que tu appelles les feuilles par leur numéro, mais que ce numéro change dès que tu bouges une feuilles.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 10h49   #3
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par ZebreLoup Voir le message
Le problème qui se pose, c'est que tu appelles les feuilles par leur numéro, mais que ce numéro change dès que tu bouges une feuilles.
Merci pour ta réponse !

Je note pour le second code (qui de toute façon me convient plus) mais alors quelle syntaxe utiliser?

Je suis plus débutante que débutante en VBA (3 jours...) et j'apprends vraiment sur le tas. Merci donc par avance de ta patience et de tes explications.
XLtiti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 10h53   #4
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Qu'est-ce que tu appelles l'intitulé de la feuille ? la cellule A1, le nom de l'onglet ?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 10h58   #5
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Bonjour,

Intitulé de la feuille : nom de l'onglet.

La cellule A1 correspond à une donnée interne, soit le nom d'une entité (chaque entité a une nomenclature dans la base de données - normal - et A1 correspond à son nom).

Merci.
XLtiti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 11h10   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je pense que ça devrait marcher en faisant
Code :
Sheets(Sheets("Sommaire").Cells(I, 1).Value).Move after:=Sheets(Sheets.Count)
Vu que tu les as dans l'ordre, si tu les rajoutes à la fin à chaque fois, ce sera bon
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 11h14   #7
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Après test : j'ai toujours la même erreur au même niveau...
XLtiti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 11h32   #8
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Un exemple à adapter
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 Then                 'ici j'ai mis le test sur le nom des feuilles (je parcour les feuilles à 9 lettre 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
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 11h46   #9
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Le tri s'est bien passé ? Il y a bien toujours le nom d'une feuille existante dans la colonne A entre la ligne 2 et la ligne Worksheets.Count ?

Le problème apparait au début de la boucle, à la fin ? (Quelle est la valeur de I ?)
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 12h00   #10
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par mercatog Voir le message
Un exemple à adapter
J'ai testé et cela a l'air de marché à peu près : l'ordre des onglets a l'air particulier avec les valeur "0" en premier, puis les valeurs décroissantes et enfin les valeurs "vides".

Y a-t-il possibilité d'adapter la syntaxe pour avoir quelque chose comme LEN(Ws.Name) = 9 or 6 afin de s'adapter aux deux types de nomenclatures?

Citation:
Envoyé par ZebreLoup Voir le message
Le tri s'est bien passé ? Il y a bien toujours le nom d'une feuille existante dans la colonne A entre la ligne 2 et la ligne Worksheets.Count ?

Le problème apparait au début de la boucle, à la fin ? (Quelle est la valeur de I ?)
1. le tri au sein du sommaire se passe mais pas de tri au sein des onglets
2. je ne comprends pas la question (j'ai dit débutante... )
3. idem

Merci encore de votre aide à tous.
XLtiti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 12h08   #11
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Code :
        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)
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2012, 15h03   #12
Invité de passage
 
Femme
Inscription : janvier 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : janvier 2012
Messages : 6
Points : 1
Points : 1
Merci ! C'est effectivement ce que j'avais fait de mon côté et qui fonctionne très bien. Désormais cette solution fonctionne (presque) parfaitement, je ferai le reste.

Merci à tous pour votre aide, vous m'avez bien permis d'avancer.
XLtiti est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h47.


 
 
 
 
Partenaires

Hébergement Web