Tri Combobox à l'envers

Bonsoir à tous,

J'ai une combobox qui va se remplir d'items intitulés chacun "Bilan X" avec X étant un nombre.

Comment dois-je effectuer mon tri pour avoir les bilans triés des plus récents au plus ancients (par ex Bilan 4, puis Bilan 3, puis bilan 2, puis Bilan 1), et lui dire de sélectionner automatiquement le plus récent par défaut ?

Merci beaucoup !

Bonjour Arnnaud

Peux-tu nous mettre le fichier Excel sur lequel tu veux que la communauté t'aide?

Parce que des combobox il y en a de plusieurs types, donc on voudrait voir l'orientation de ton projet Combo dans un Userform ou l'une des deux combo controle ActiveX, ou controle de formulaire?

Ensuite je pense que tu sais extraire les données numériques d'une colonne qui contient une chaine suivi d'un espace blanc et fin de nombres.

Si en A1 : j'ai "Bilan 4" et si je mets en B1 la formule : =STXT(A1;TROUVE(" ";A1); NBCAR(A1)-TROUVE(" ";A1)+1) j'obtiens 4

Il restera alors à trier les nombres de la colonne B. Je ne sais pas si c'est faisable avec des formules. C'est peut être faisable en appliquant un format Numérique à la colonne B, puis de faire un tri/ Est-ce que cela te convient?

Pour compléter ton jeu d'essai

Si tu as

  • Bilan 12
  • Bilan 2
  • Bilan 3
  • Bilan 4
  • Bilan 1

Je pense que tu veux dans ta combo

  • Bilan 12
  • Bilan 4
  • Bilan 3
  • Bilan 2
  • Bilan 1

A confirmer?

Bonjour Arnnaud, scraper

Un exemple tout simple

17arnnau-exemple.xlsm (18.67 Ko)

A+

Bonjour Bruno45

Ta solution ne fait pas de tri, mais si le système a affecté les numéros de manière chronologique, cela fonctionne parfaitement.

bonjour, BrunoM45, Scraper, Arnnaud, le fil,

avec une option de tri

Private Sub UserForm_Initialize()
     Dim aA, SCA, i

     Set SCA = CreateObject("system.collections.arraylist")
     aA = Sheets("Params").ListObjects("tableau1").DataBodyRange.Value2
     For i = 1 To UBound(aA)
          SCA.Add aA(i, 1)
     Next
     SCA.Sort     'sorter ascendant
     SCA.Reverse     'reverse = descendant

     Me.ComboBox1.List = SCA.toarray
     Me.ComboBox1.ListIndex = 0
End Sub
13arnnau-exemple.xlsm (25.09 Ko)

Bonjour à tous, BsAlv, scraper, BrunoM45,

Merci pour vos propositions, j'ai du mal à les adapter à mon projet, que j'hésite à vous envoyer car il commence à être très volumineux et ce serait long de vous plonger dedans je pense.

J'essaye juste avec le code de remplissage de ma combobox (ListePatients), si besoin je vous envoie tout le fichier avec le userform:

 Private Sub RemplissageListeBilans()
  Dim ws As Worksheet, NomPatient, Trouve

    ListeBilans.Clear
    NomPatient = ChoixPatients.Value
    For Each ws In Worksheets
      If ws.Name Like "Bilan *" Then
        Set Trouve = ws.Columns(2).Cells.Find(what:=NomPatient, LookAt:=xlWhole)
          If Trouve Is Nothing Then
          Else
            ListeBilans.AddItem ws.Name
          End If
        End If
      Next
 End Sub

En fait pour chaque patient sélectionné, je viens vérifier les feuilles bilanX et voir s'il a son nom dedans. Le patient qui a trois bilans aura son nom dans Bilan1, Bilan2 et Bilan3. Dans ce cas ListeBilans doit se remplir des 3 bilans, du plus récent au plus ancient, et sélectionner le plus ancient.

A noter que si pour une raison improbable, un utilisateur décale les feuilles entre elles dans le classeur et met "Bilan4, Bilan1, Bilan2, Bilan3" il faut que la combobox continue à afficher dans le bon ordre les bilans...

bonjour, sans fichier et en supposant que "bilan 9" et plus récent que "bilan 1"

Private Sub RemplissageListeBilans()
     Dim ws    As Worksheet, NomPatient, Trouve

     ListeBilans.Clear
     NomPatient = ChoixPatients.Value
     For i = 9 To 1 Step -1     '"bilan 9" est plus récent que "bilan 1"
          Set ws = Nothing
          On Error Resume Next
          Set ws = Sheets("Bilan " & i)
          On Error GoTo 0
          If Not ws Is Nothing Then
               Set Trouve = ws.Columns(2).Cells.Find(what:=NomPatient, LookAt:=xlWhole)
               If Trouve Is Nothing Then
               Else
                    ListeBilans.AddItem ws.Name
               End If
          End If
     Next
End Sub

Re BsAlv, ça marche nickel, par contre c'est limité par le nombre de bilan prévu dans le code...

Pas moyen de passer par un for each ?

Ou sinon je mets for i = 100 au lieu de for i =9 (je pense pas que quelqu'un aura + de 100 bilans ^^), est-ce que c'est correct ou ça va ralentir le code?

bonjour,

9 ou 100 ou 1.000, la différence sera inférieur, si la feuille n'existe pas, le "IF...END IF" n'est pas parcouru.

Faitez le teste avec 10, 100, 1000

Private Sub RemplissageListeBilans()
     Dim ws    As Worksheet, NomPatient, Trouve, t

     t = Timer
     listebilans.Clear
     NomPatient = ChoixPatients.Value
     For i = 1000 To 1 Step -1     '"bilan 9" est plus récent que "bilan 1"
          Set ws = Nothing
          On Error Resume Next
          Set ws = Sheets("Bilan " & i)
          On Error GoTo 0
          If Not ws Is Nothing Then
               Set Trouve = ws.Columns(2).Cells.Find(what:=NomPatient, LookAt:=xlWhole)
               If Trouve Is Nothing Then
               Else
                    listebilans.AddItem ws.Name
               End If
          End If
     Next
     MsgBox Format(Timer - t, "0.00\s")'<<<<<<< durée
End Sub

Exact c'est sensiblement pareil :)

Je clôture, merci beaucoup !

Rechercher des sujets similaires à "tri combobox envers"