Recherche et tri complexe sur les noms des feuilles. [Résolu]

zuli3n

XLDnaute Occasionnel
Bonjour le Forum,

J'ai une fois de plus besoin de vous, et j'espère vous expliquer correctement mon problème, j'avoue ce n'est pas évidant ... :rolleyes:

Je voudrais pouvoir, via un UserForm puis deux ComboBox, faire une recherche des noms de feuilles qui se trouvent dans mon classeur et y accéder.

Chaque feuilles à comme format de nom "Niveau X Séance Y" (X correspond au numéro des niveaux et Y correspond au numéro des séances.)

J'aimerais pouvoir lister dans la ComboBox1 "Niveau X" des feuilles, et dans la ComboBox2 "Séance X" des feuilles, sans avoir de doublons dans les ComboBox.

Dans l'exemple que je vous joins, j'ai pu via un bout de code faire 60% :)
Mais je n'arrive pas couper, comme je désir, le nom des feuilles et faire le trie puis l'affichage ....

Dans mon fichier d'exemple, mes feuilles qui servent de test sont cachées, mais via la ComboBox une fois sélectionnées le code VBA les rend accessibles. :p

Pourriez-vous s'il vous plait m'aider à faire ce tri dans mes deux ComboBox.

UserForm:
Code:
Private Sub UserForm_Initialize()
Dim i As Integer
For i = 2 To Sheets.Count
ComboBox1.AddItem Sheets(i).Name
Next
End Sub

Private Sub ComboBox1_Click()
Dim Sh As Worksheet
On Error Resume Next
Set Sh = Sheets(ComboBox1.Value)
If Err Then MsgBox "Feuille introuvable", 48: ComboBox1.DropDown: Exit Sub 'en cas d'entrée manuelle incorrecte
On Error GoTo 0
Sh.Visible = True 'en cas de feuille masquée
Sh.Activate
'--------------suite du code de validation
End Sub

Private Sub CommandButton1_Click()
Unload UserForm1
End Sub

Private Sub CommandButton2_Click()
Unload UserForm1
End Sub

En vous remerciant,
Cordialement.
 

Pièces jointes

  • zuli3n.xls
    94.5 KB · Affichages: 72
Dernière édition:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Bonjour Hasco, re le Forum,

Merci beaucoup pour ta proposition, je viens d'y jetter un coup d'oeil et c'est vraiment super.
Cependant serait-il possible à ton avis, de pouvoir lister uniquement les séances existant par niveau ?
J'explique: je sais pas si tu l'a remarqué mais dans mon fichier exemple il n'y a pas de feuille "Niveau 1 Séance 1" mais le ComboBox2 le liste comme même en se mettant "Niveau 1" sur le ComboBox1.

Je te remercie Hasco,
Cordialement.
 
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Bonjour,

Je pensais avoir corrigé. Alors dans Combobox1_Click change la première ligne sous la boucle For pour celle-ci:

Code:
         If sh.Name Like ComboBox1.Value & "*" Then

Tu devrais avoir:

Code:
  ComboBox2.Clear
        For Each sh In ThisWorkbook.Worksheets
            If sh.Name Like ComboBox1.Value & "*" Then

A+
 

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Re Hasco, le Forum,

Via ta modification, ça fonctionne :) Merci. J'avoue j'en reviens toujours pas :eek:
J'aimerais te demander deux petites choses pour finaliser la UserForm.

A l'ouverture de l'UserForm, la ComboBox1 est rempli automatique et tu coup la ComboBox2 est vide, il faut modifier la ComboBox1 pour que la ComboBox2 se remplisse.

En Faisant "OK" (CommandButton1) aller directement sur la feuille choisi avec l'UserForm, car rien ne se passe en cliquant sur "Ok"


Mille merci Hasco,
Cordialement.
 
Dernière édition:
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Re,

Dernière intervention pour moi sur ce fil.

Voici le code complet du userForm.

Mais petite remarque quand même, je trouve que tu n'y a pas mis beaucoup du tien dans cette histoire. Tu n'as rien proposé comme solution à tes propres question. Le but du forum n'est pas d'être une usine à macros.

Alors la prochaine fois essaie de faire tes propres efforts de compréhension.

Code:
Private Sub ComboBox1_Change()
    CommandButton1.Enabled = ComboBox1.ListIndex > -1 And ComboBox2.ListIndex > -1
End Sub
Private Sub ComboBox2_Change()
'Autorise le bouton ok uniquemment si les 2 combobox ont une sélection
    CommandButton1.Enabled = ComboBox1.ListIndex > -1 And ComboBox2.ListIndex > -1
End Sub
Private Sub UserForm_Initialize()
    Dim sh As Worksheet
    Dim Niveau As String
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name Like "Niveau*" Then
            Niveau = Left(sh.Name, InStr(1, sh.Name, "Séance") - 2)
            ComboBox1.Text = Niveau
            If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Niveau
        End If
    Next
    'Premier élément de liste pas défaut
    If ComboBox1.ListCount > 0 Then ComboBox1.ListIndex = 0
    'CommandButton1.Enabled = ComboBox1.ListIndex > -1 And ComboBox2.ListIndex > -1
End Sub
Private Sub ComboBox1_Click()
    Dim sh As Worksheet
    Dim Séance As String, tmp As String
    Dim i As Integer
    If ComboBox1.ListIndex > -1 Then
        ComboBox2.Clear
        For Each sh In ThisWorkbook.Worksheets
            If sh.Name Like ComboBox1.Value & "*" Then
            
                'Extraction de la séance dans le nom
                Séance = Trim(Right(sh.Name, Len(sh.Name) - Len(ComboBox1.Value)))
                
                '
                ComboBox2.Text = Séance
                
                'En changeant la propriété .Text du combobox si l'item exite déjà .listIndex sera >-1
                If ComboBox2.ListIndex = -1 Then
                    If ComboBox2.ListCount > 0 Then
                        'Boucle à la recherche de la bonne position
                        'déterminée par la valeur du numéro de séance
                        For i = 0 To ComboBox2.ListCount - 1
                            If Split(ComboBox2.List(i), " ")(1) > Split(Séance, " ")(1) Then Exit For
                        Next
                    End If
                    ComboBox2.AddItem Séance, i
                End If
            End If
        Next
    End If
    'Premier élément de liste par défaut
    If ComboBox2.ListCount > 0 Then ComboBox2.ListIndex = 0
End Sub
Private Sub CommandButton1_Click()
    Dim sh As Worksheet
    'Parcourt les feuilles, cachent celles dont le nom de correspond pas aux combobox et affiche celle qui correspond
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name Like "Niveau*" Then
            sh.Visible = sh.Name = Trim(ComboBox1.Value) & " " & Trim(ComboBox2.Value)
            If sh.Visible Then sh.Activate
        End If
    Next
    Unload UserForm1
End Sub
Private Sub CommandButton2_Click()
    Unload UserForm1
End Sub

A+
 
Dernière modification par un modérateur:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Re Hasco,

Oui je comprends, que ce forum n'est pas une usine à macro.
Merci pour la modification, je vais tester cela des que possible. (Quand mon monstre de 3ans sera couchée) :D

En effet je suis vraiment loin de pouvoir donner mes propres propositions, mes compétences sont vraiment au plus bas, j'en apprends tous les jours et cela grâce à ce forum.
Quand je me suis inscris sur le forum, je n'avais jamais utilisé Excel, sauf pour lire un fichier ...

Et la je t'avoue ce que je voulais faire c'était vraiment pas de mes compétences, ni même dans mon imagination, d'ailleurs j'en suis toujours autant surpris que tu as réussi à faire cela en très peu de temps, pour moi ce n'étais pas possible ....

Je vais étudier ton code, afin de mieux comprendre, comme je le fais à chaque fois qu'on m'aide ou qu'on me donne un bout de VBA. J'en apprends tous les jours, en me faisant des fichiers qui me sont utiles.

Je suis désolé Hasco.
Je te remercie vraiment de m'avoir aidé, merci.

Cordialement.
 
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Bonjour,

Ne sois pas désolé. Sur les parties de code qui te paraissent difficiles essaie de faire des recherches, et testes le fruit de tes recherches dans de petites macros.

Par exemple si tu ne comprends pas la ligne:

Split(ComboBox2.List(i), " ")(1) > Split(Séance, " ")(1)

Tu peux faire une macro avec:

Code:
Sub MacroTest()
  Dim Chaine1 As String, Chaine2 As String
  Dim t1 As Variant, t2 As Variant 'Tableau qui recevra l'éclatement d'une chaine sur le caractère espace
  Chaine1 = "Séance 3"
  Chaine2 = "Séance 2"
  t1 = Split(Chaine1, " ") 't1(0) contient "Séance", t(1) contient "2"
  t2 = Split(Chaine2, " ") 'idem, t2(1) contient "3"
  If t1(1) > t2(1) Then
       MsgBox Chaine1 & " plus grand que " & Chaine2
  End If
End Sub

En faisant une exécution Pas-à-pas (F8) tu pourras voir l'évolution de tes variables(Menu Affichage/Fenêtre variable locales) et ainsi mieux comprendre.

A+
 

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Salut Hasco, le forum

Effectivement, je ne connaissais pas ce "pas-à-pas" et j'avoue c'est très pratique pour comprendre, je viens de tester ta petite macro.

Je vais faire de même pour bien comprendre tout ton code donné hier.
J'ai déjà pu faire une correction, hier soir tard, sur une chose que j'ai remarqué et apparemment ça fonctionne, après de nombreux nombreux essais. :) (Quand il y a "Niveau 10 Séance 1") En se positionnant sur "Niveau 1" via la ComboBox1, ComboxBox2 liste "0 Séance 1").
J'ai rectifier en remplaçant :
Code:
Niveau = Left(sh.Name, InStr(1, sh.Name, "Séance") - 2)
par
Code:
Niveau = Left(sh.Name, InStr(1, sh.Name, "Séance") - 1)

J'ai détecté du coup un autre soucis que j'essaie de rectifier, en scrutant XDL et le site de BOISGONTIER.

Merci pour le conseil Hasco.

++
Cordialement.
 
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Re,

Oui, dans l'exemple il n'y avait ni niveau à deux chiffres ni séance à deux chiffres. Je m'étais posé la question mais apparament tu y as répondu tout seul. Tant mieux. Par contre avec left et instr fait gaffe à la gestion des espaces finaux des chaines de caratères. Soit tu décides de les conserver dans les combox "Niveau 10 " soit avec trim(Left(..., inst(....))) tu décides de les supprimer.

L'essentiel étant de faire toujours la même chose pour les comparaisons et d'être cohérent partout dans le code.

Split("Niveau 10 "," ") contiendra alors 3 valeurs:

"Niveau"
"10"
" " 'un espace

A+

P.S. As-tu vu que j'avais un peu changé le code dans le post #6 Boucle For en lieu et place de Do...While
 
Dernière modification par un modérateur:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Re,

Ok, merci Hasco.
Ce soir je vais me focaliser sur le dernier petit souci détecté pour le régler, je te tiens au courant de l'évolution.

++
Cordialement.

Edit: Je viens de voir ton edit, oui j'ai vu ta modif dans le post #6 -> "Boucle For en lieu et place de Do...While " merci.
 
Dernière édition:

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Bonsoir Hasco, le Forum,

Après avoir cherché toute la soirée je n'arrive pas à comprendre:

Code:
For i = 0 To ComboBox2.ListCount - 1
If Split(ComboBox2.List(i), " ")(1) > Split(Séance, " ")(1) Then Exit For
Je pense que le souci que j'ai viens du .ListCount -1 (après le "pas-à-pas), en effet la ComboBox2 tri bizarrement:
Code:
Séance 1
Séance 10
Séance 11
Séance 2
Séance 3
Séance 4
Séance 5
Séance 6
Séance 7
Séance 8
Séance 9

En faisant quelque test, en modifiant .ListCount - 1 ça tri autrement, je n'ose pas trop toucher, ayant pas encore tout capté ... :(

Je suis un fatigué je regarderai demain.

++
Cordialement
 
G

Guest

Guest
Re : Recherche et tri complexe sur les noms des feuilles.

Bonjour,

je ne vois pas en quoi le listCount changerait quelquechose à part que tu risquerai d'avoir un élément manquant ou en trop. Vois l'aide excel sur Listcount. Les index de combobox vont de 0 à listCount-1.

Tu peux essayer:

If Val(Trim(Split(Combobo2.List(i), " "))) > Val(Trim(Split(Séance, " ")(1)))

Qui éliminera tout espace trainant en bout de chaine " 10" ou " 10 " et qui convertira les chaine en leur valeur.

A+
 

zuli3n

XLDnaute Occasionnel
Re : Recherche et tri complexe sur les noms des feuilles.

Re Hasco, bonsoir le forum,

Décidément je n'arrive à rien ... j'ai beau cherché.
En essayant :
Code:
If Val(Trim(Split(ComboBox2.List(i), " "))) > Val(Trim(Split(Séance, " ")(1)))
Il me met une erreur "Incompatibilité de type".
En faisant du "pas-à-pas" je m’aperçois qu'il bloque sur la ComboBox2 à "Séance 2"
Je vais continué mes recherches, je te tiens au jus.

++
Cordialement.
 

Discussions similaires

Réponses
6
Affichages
202