• Initiateur de la discussion Initiateur de la discussion 2b7a
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

2b7a

XLDnaute Occasionnel
bonjour à toutes et tous,

j'ai un certain nombre de documents à consulter très rapidement (pdf)
je vais donc les scanner et les inclure un par un dans excel
dans chacune des feuilles excel, je vais inclure un mot-clé correspondant à l'objet principal du doc pdf

le but :

dans la première page, faire une sélection par mot-clé ... qui me dira quelle feuille je dois lire.

... je vous joins un exemple.

D'avance, merci

PS : excel 2010 at home, mais 2007 au boulot (c'est pour le boulot ce doc)
 

Pièces jointes

Re : tri des onglets

Bonjour 2b7a, bonjour le forum,

En pièce jointe ton fichier modifié et commenté. Comme je ne sais pas bien travailler avec les composants placés directement dans l'onglet je suis passé par une UserForm. J'espère que ça conviendra...
Le Ficher:
 

Pièces jointes

Re : tri des onglets

Bonjour 2b7a, bonjour le forum,

En pièce jointe ton fichier modifié et commenté. Comme je ne sais pas bien travailler avec les composants placés directement dans l'onglet je suis passé par une UserForm. J'espère que ça conviendra...
Le Ficher:

Bonjour Robert et merci pour ta réponse.
...ça fonctionne très bien .... mais je n'ai pas compris comment, dans le userform, apparait le nom des feuilles
tu peux m'expliquer ?
d'avance, merci

PS : dans la réalité, je vais avoir au moins 50 feuilles. Il faut que je comprenne comment ça fonctionne !!
 
Re : tri des onglets

Bonjour le fil, bonjour le forum,

Mon code est commenté pour te permettre de comprendre. Il y a trois parties.
• à l'initialisation de l'Userform
Code:
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim o As Object 'déclare la variable o (Onglet)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim temp() As Variant 'déclare la variable temp (tableau TEMPoraire)

Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
For Each o In Sheets 'boucle 1 sur tous les onglets du classeur
    If Not o.Name = "recap" Then 'condition : si le nom de l'onglet est différent de "recap"
        dl = o.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet o
        Set pl = o.Range("A1:A" & dl) 'définit la plage pl de l'onglet o
        For Each cel In pl 'boucle 2 sur toutes les cellules cel de la plage pl
            Me.ComboBox1.AddItem cel.Value 'ajoute la valeur de la cellule à la ComboBox1
        Next cel 'prochaine cellule de la boucle 2
    End If 'fin de la condition
Next o 'prochain onglet de la boucle 1
For x = 0 To Me.ComboBox1.ListCount - 1 'boucle sur tous les éléments de la ComboBox1
    dico(Me.ComboBox1.List(x)) = "" 'alimente le dictionnaire dico
Next x 'prochain élément de la boucle
temp = dico.keys 'récupère la liste des éléments sans doublon dans un tableau temporaire
Call tri(temp, LBound(temp), UBound(temp)) 'lance la pocédure de tri par ordre alphabétique
Me.ComboBox1.List = temp 'alimente la ComboBox1 d'une liste sans doublon triée
End Sub
Ensuite il y a du code pour le clic dans la ComboBox et un autre pour le clic dans la ListBox + la procédure de tri de Jacques BOISGONTIER.
J'ai regardé vite fait le fichier de Bruno et son code me semblait plus efficace que le mien. Mais je n'ai pas pu le testé à cause de sa version trop récente pour moi...
 
Re : tri des onglets

Bon j'avais en plus oublié des trucs alors voici pour 2000
Bruno

... je reviens vers toi car ... pas tout compris (!)

je n'arrive pas à trouver la liste qui alimente ta première liste déroulante (je veux changer les noms - qui sont fictifs dans cet exemple)

... mais où sont-ils cachés ? j'ai bien vu i = k ... ; pas de feuilles cachées .... ; j'ai changé les noms en colonne A sur plusieurs feuilles sans succès ...

tu peux m'éclairer ?

d'avance, merci
 
Re : tri des onglets

Explications:
Il n'y a pas de liste.
Dès l'ouverture et activation des macros cela déclenche la macro "listeville"en workbook_open
Tout comme Robert à l'ouverture de l'userform.
On passe sur tous les onglets (sauf "recap") on copie dans un dico tous les noms dans les colonnes A et cela sans doublons, on trie ensuite par ordre alphabétique et on alimente le combobox1.
Le click en combobox1 déclenche cette macro
Private Sub ComboBox1_Change()
Sheets("recap").ComboBox2.Clear
nom = Sheets("recap").ComboBox1
If nom = "" Then Exit Sub
For k = 1 To Sheets.Count
If Sheets(k).Name = "recap" Then GoTo saute:
With Sheets(k).[A1:A1000]
Set c = .Find(nom, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
Sheets("recap").ComboBox2.AddItem Sheets(k).Name
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
saute:
Next
End Sub

et le Click sur combobox2 est......
Private Sub ComboBox2_Click()
Sheets(Sheets("recap").ComboBox2.Value).Select
End Sub

Passer par un userform comme le fait Robert possède un avantage.
Si tu crées une nouvelle ville celle-ci est prise en compte dès l'affichage de l'userform tandis que moi il faut lancer la macro "listeville"
Nombre de feuilles ilimitées comme les noms de villes.
Possibilité de mettre un bouton intitulé "mise à jour Villes" et affecter la macro "listeville"
Voici la macro listville en workbook_open il suffit de mettre..... listeville
Pour le faire sur ton fichier en fentre des projets double click sur Thisworkbook ensuite choisit à gauche Workbook et à droite Open et mets entre les 2 lignes listeville
ca va donner cela
Private Sub Workbook_Open()
listeville
End Sub


Sub listeville()
Sheets("recap").ComboBox1 = ""
Sheets("recap").ComboBox2 = ""
Set dico = CreateObject("Scripting.Dictionary")
For k = 1 To Sheets.Count
With Sheets(k)
If .Name = "recap" Then GoTo saute
For Each c In .Range(.[a1], .Cells(Rows.Count, 1).End(xlUp))
dico.Item(c.Value) = dico.Item(c.Value)
Next
saute:
End With
Next
a = dico.keys 'Obtient les éléments
For k = 0 To UBound(a) - 1 'trie éléments
For b = k + 1 To UBound(a)
If a(b) < a(k) Then
temp = a(b)
a(b) = a(k)
a(k) = temp
End If
Next
Next
Sheets("recap").ComboBox1.List = a
End Sub

Espère t'avoir un peu éclairé
Bruno
 
Re : tri des onglets

Explications:
Il n'y a pas de liste.
Dès l'ouverture et activation des macros cela déclenche la macro "listeville"en workbook_open
Tout comme Robert à l'ouverture de l'userform.
On passe sur tous les onglets (sauf "recap") on copie dans un dico tous les noms dans les colonnes A et cela sans doublons, on trie ensuite par ordre alphabétique et on alimente le combobox1.
Le click en combobox1 déclenche cette macro
Private Sub ComboBox1_Change()
Sheets("recap").ComboBox2.Clear
nom = Sheets("recap").ComboBox1
If nom = "" Then Exit Sub
For k = 1 To Sheets.Count
If Sheets(k).Name = "recap" Then GoTo saute:
With Sheets(k).[A1:A1000]
Set c = .Find(nom, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
Sheets("recap").ComboBox2.AddItem Sheets(k).Name
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
saute:
Next
End Sub

et le Click sur combobox2 est......
Private Sub ComboBox2_Click()
Sheets(Sheets("recap").ComboBox2.Value).Select
End Sub

Passer par un userform comme le fait Robert possède un avantage.
Si tu crées une nouvelle ville celle-ci est prise en compte dès l'affichage de l'userform tandis que moi il faut lancer la macro "listeville"
Nombre de feuilles ilimitées comme les noms de villes.
Possibilité de mettre un bouton intitulé "mise à jour Villes" et affecter la macro "listeville"
Voici la macro listville en workbook_open il suffit de mettre..... listeville
Pour le faire sur ton fichier en fentre des projets double click sur Thisworkbook ensuite choisit à gauche Workbook et à droite Open et mets entre les 2 lignes listeville
ca va donner cela
Private Sub Workbook_Open()
listeville
End Sub


Sub listeville()
Sheets("recap").ComboBox1 = ""
Sheets("recap").ComboBox2 = ""
Set dico = CreateObject("Scripting.Dictionary")
For k = 1 To Sheets.Count
With Sheets(k)
If .Name = "recap" Then GoTo saute
For Each c In .Range(.[a1], .Cells(Rows.Count, 1).End(xlUp))
dico.Item(c.Value) = dico.Item(c.Value)
Next
saute:
End With
Next
a = dico.keys 'Obtient les éléments
For k = 0 To UBound(a) - 1 'trie éléments
For b = k + 1 To UBound(a)
If a(b) < a(k) Then
temp = a(b)
a(b) = a(k)
a(k) = temp
End If
Next
Next
Sheets("recap").ComboBox1.List = a
End Sub

Espère t'avoir un peu éclairé
Bruno



merci beaucoup pour tout, Bruno
je vais "décortiquer" ça ce soir ; pas eu le temps au bureau
bonne fin de journée
 
Re : tri des onglets

Encore une petite question Robert, si tu le veux bien

.... je voudrais que le userForm se positionne ailleurs que là où il est ; mais je ne sais pas où je dois changer les paramètres (!)
tu peux m'éclairer ?
(en fait, je voudrais qu'il soit sous le bouton car je vais mettre des indications sur la droite de mon fichier)
d'avance, merci
 
Re : tri des onglets

salut

encore avec des contrôles ActiveX, et pour simplifier la macro, la mise à jour et le tri se font manuellement
ComBoActiveX.jpg
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

C
Réponses
1
Affichages
1 K
Cattleya97
C
B
Réponses
2
Affichages
2 K
bastienb
B
A
Réponses
2
Affichages
1 K
alamo
A
C
Réponses
3
Affichages
1 K
christophedb
C
Retour