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:
G

Guest

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

Bonjour,

J'ai rajouté des feuilles avec des nombres à 2 chiffres dans les noms de niveaux et séances: ceci fonctionne correctement.

Code:
Private Sub UserForm_Initialize()
    Dim sh As Worksheet
    Dim Niveau As String
    Dim i As Integer
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name Like "Niveau*" Then
            Niveau = Trim(Left(sh.Name, InStr(1, sh.Name, "Séance") - 1))
            If ComboBox1.ListCount = 0 Then
                ComboBox1.AddItem Niveau
            Else
                ComboBox1.Text = Niveau
                If ComboBox1.ListIndex = -1 Then
                    For i = 0 To ComboBox1.ListCount - 1
                        If CInt(Split(ComboBox1.List(i), " ")(1)) > CInt(Split(Niveau, " ")(1)) Then Exit For
                    Next
                    ComboBox1.AddItem Niveau, i
                End If
            End If
        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 Variant
    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) - 1))
                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 CInt(Split(ComboBox2.List(i), " ")(1)) > CInt(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

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

zuli3n

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

Bonjour Hasco, le Forum,

Effectivement, ça fonctionne beaucoup mieux avec:
Code:
If CInt(Split(ComboBox2.List(i), " ")(1)) > CInt(Split(Séance, " ")(1))

Je vais désormais, cherché à comprendre la fonction CInt (juste un F1 dans Excel, ne me suffit pas à capter :p )

J'avoue j'aurais dû mettre, dans mon fichier exemple, toutes les situations possible.
Je te remercie Hasco, bonne journée à toi.

++
Cordialement.
 

zuli3n

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

Salut Hasco, le Forum,

J'ai beaucoup hésité avant de poster ce message, car je pensais que tout était résolu grâce à ton aide Hasco ...
Mais je me suis trompé, car je me suis mal renseigner au début sur ce que je voulais faire avec mon fichier.
Je me suis rendu compte, en relisant mon livre, que je pouvais avoir des onglets avec comme nom:
Code:
Niveau 1b Séance 100
Niveau 1c Séance 100
Niveau 12 Séance 100
Niveau 12bis Séance 100
Niveau 12ter Séance 100

Possibilité de trois digits à "Séance", niveau 1 en deux parties via les lettres b & c et le niveau 12 en trois parties via bis & ter.

J'ai fais un fichier d'exemple avec TOUTES les possibilités possible et du coup j'ai une erreur "Incompatibilité de type" je suposes que c'est a cause de:

Code:
Dim i As Integer
car en faisant du "pas-à-pas" j'ai l'erreur sur:
Code:
If CInt(Split(ComboBox1.List(i), " ")(1)) > CInt(Split(Niveau, " ")(1))

J'avoue ca complique encore plus le code car je ne vois pas quel fonctions de conversion de types de données utiliser :(

++
Cordialement.
 

Pièces jointes

  • zuli3n.xlsm
    80.4 KB · Affichages: 61
  • zuli3n.xlsm
    80.4 KB · Affichages: 62
  • zuli3n.xlsm
    80.4 KB · Affichages: 66

zuli3n

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

Re,

En cherchant et en faisant des tests, en modifiant par:
Code:
Dim i As Variant
et
Code:
If CVar(Split(ComboBox1.List(i), " ")(1)) > CVar(Split(Niveau, " ")(1))
J'obtiens plus de message d'erreur avec ce changement, mais j'ai un doute ... car via F1 sur Variant me convient pas :)
En plus, les listes dans ComboBox1 et ComboBox2 ne sont plus dans l'ordre alphabétique, je veux bien une piste :)

++
Cordialement.
 
G

Guest

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

Bonsoir,

Je viens de voir tes derniers posts, avec les exemple, j'essaierai de regarder ça. Oui, dès le départ il faut faire une analyse exacte des besoins(cahier des charges). Cela permet de s'orienter vers les bonnes techniques des les premières lignes de code.

Je verrai ce que je peux faire quand j'aurais le temps.

A+
 
G

Guest

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

Bonsoir,

Voici une autre possibilité plus simple:
Création d'une feuille cachée "NiveauxSéances"
Création d'une macro qui décompose les noms de feuilles et place les élements séparés dans la feuille cachée
Création d'une macro de tri qui trie sur les éléments de la feuille cachée, cette macro ne fonctionne que sur Excel>=2007 mais peut facilement être adapter pour les versions inférieures.

Au chargement du userForm ces macros sont appelé et les niveaux (triés) chargés dans le combobox1 au moyen d'un Scription.Dictionary (je te laisse faire tes recherches la-dessus) le principal intérêt est d'avoir des niveaux uniques dans les combobox.

Combobox2 est chargé directement à partir de la feuille.

Bonne nuit et bon dimanche.
A+
 
Dernière modification par un modérateur:

zuli3n

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

Re Hasco,

MERCI, je vais regarder ton fichier, tu as fais beaucoup de changement et ça a du te prendre du temps, je t'en remercie.
A première vu, je crains ne pas pouvoir l'intégrer à mon fichier d'origine, je vais regarder cela ce soir (j'ai toute la nuit :p)
Je te tiens au courant, merci encore pour tout le temps passés.

++
Cordialement.
 

zuli3n

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

Re Hasco, le Forum,

Bon effectivement j'ai pu l'intégrer à mon fichier, je pensais que via ta nouvelle méthode les séances étaient écrites en dur dans la feuille "NiveauxSéances" mais ce n'est pas du tout le cas, c'est impressionnant :)

J’hallucine sur le travail que tu as pu faire, et j'en suis sur en très peu de temps. Le pire c'est que tu dis "Voici une autre possibilité plus simple" lol ^^

J'ai adapté un autre fichier d'exemple avec ta nouvelle méthode, j'ai détecté que la ComboBox2 listée toutes les séances de la feuille "NiveauxSéances" sauf le premier élément de liste par défaut de la ComboBox1.
Je vais donc chercher le pourquoi :)
Je te tiens au courant, j'ai du taff :)

Merci Hasco

++
Cordialement.
 

Pièces jointes

  • zuli3n.xlsm
    45.8 KB · Affichages: 35
  • zuli3n.xlsm
    45.8 KB · Affichages: 39
  • zuli3n.xlsm
    45.8 KB · Affichages: 33

zuli3n

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

Bonjour Hasco, le Forum,

Après pas mal de recherche et plusieurs test, je pense avoir trouvé la solution.

J'ai rajouté dans ComboBox1_Click:
Code:
ComboBox2.Clear
et désormais ça liste bien uniquement les séances du niveau choisi.

La seule chose qui fonctionne mal, et que je n'ai pas pu trouver, c'est que ça ne classe pas la ComboBox2 par ordre alphabétique alors que la ComboBox1 le fait, en faite quand je crée une séance 5 puis une 4 (bon j'avoue ça n'arrivera jamais, mais comme même ^^) ça liste dans l'ordre de création, contrairement pour les niveaux.

Je joins un fichier d'exemple.

++
Cordialement
 

Pièces jointes

  • zuli3n.xlsm
    50.7 KB · Affichages: 48
  • zuli3n.xlsm
    50.7 KB · Affichages: 48
  • zuli3n.xlsm
    50.7 KB · Affichages: 47
Dernière édition:
G

Guest

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

Bonjour,

J' avais oublié de mettre Combobox2.Clear entre deux appels à Combobox1_Change.

Code:
Private Sub ComboBox1_Click()
    Dim plg As Range 'Plage de cellules des colonnes FG de la feuille 'NiveauxSéances'
    Dim idx As Variant ' index de la première ligne du niveau dans la colonne
    Dim Niveau As String
    If ComboBox1.ListIndex > -1 Then
        ComboBox2.Clear
        Niveau = ComboBox1.Value
        Set plg = ThisWorkbook.Sheets("NiveauxSéances").Range("A1").CurrentRegion.Columns(6).Resize(, 2)
        'Fonction Excel Equiv:
        'recherche de la première apparition du niveau dans la colonne 1 dela plage
        idx = Application.Match(Niveau, plg.Columns(1), 0)
        If Not IsError(idx) Then
            Do
                ComboBox2.AddItem plg.Cells(idx, 2)
                idx = idx + 1
            Loop While plg.Cells(idx, 1) = Niveau
        End If
    End If
    'Premier élément de liste par défaut
    If ComboBox2.ListCount > 0 Then ComboBox2.ListIndex = -1
End Sub

Pour moi cela classe correctement par ordre numérique les séances.

A+
 

zuli3n

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

Re Hasco,

Oui, j'avais mis le "Combobox2.Clear" juste un dessous de "Private Sub ComboBox1_Click()" :)
Je te joins le fichier d'exemple à jour, regarde dans les séances du niveau 2, elles ne sont pas classées par ordre, ou c'est mon Excel qui déconne, ce qu'il m'étonnerai pas car souvent il bug...

++
Cordialement.
 

Pièces jointes

  • zuli3n.xlsm
    55.4 KB · Affichages: 39
  • zuli3n.xlsm
    55.4 KB · Affichages: 48
  • zuli3n.xlsm
    55.4 KB · Affichages: 41
Dernière édition:
G

Guest

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

Re,

Avec un minimum de recherche tu aurais pu trouver que le numéro de colonne de la troisième clef de tri dans la macro TriNiveauxSéances n'était pas la bonne. En remplaçant 3 par 4 tout rente dans l'ordre.

A+
 

Discussions similaires

Réponses
6
Affichages
246

Statistiques des forums

Discussions
312 216
Messages
2 086 351
Membres
103 195
dernier inscrit
martel.jg