XL 2016 : remplissage liste combobox

marc_proxi

XLDnaute Nouveau
Bonjour à tous,

J'ai trouvé et addapter un bout de code qui rempli une combobox liste. Elle fonctionne très bien mais elle est lente ( sur +- 7000 enregistrements).
Comment puis-je la rendre plus rapide?

Merci pour vos réponses.

test = Sheets(tonton).Range("A" & Rows.Count).End(xlUp).Row + 1 'dernière ligne de la colonne G

For Each c In Sheets(tonton).Range("G2:G" & test)

ComboBox1 = c
If ComboBox1.ListIndex = -1 And ComboBox1 <> "" Then ComboBox1.AddItem c
Next c
With ComboBox1
For i = 0 To .ListCount - 1
For k = 0 To .ListCount - 1
If .List(i) < .List(k) Then
temp = .List(i)
.List(i) = .List(k)
.List(k) = temp
End If
Next k
Next i
.ListIndex = -1
End With
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @marc_proxi , le Forum

Pour des gros volumes il vaut mieux passer par une "Array" comme suit :


VB:
Option Explicit


Private Sub UserForm_Initialize()
Dim PlageArray As Variant

With Sheets("Sheet1")
    PlageArray = .Range("A2:A" & .Range("A65536").End(xlUp).Row)
End With


Me.ComboBox1.List = PlageArray

End Sub

Résultat avec 31,.000 Lignes injectées en quelques ms...

Capture.JPG


Bien toi, à vous
@+Thierry
one-world-together-at-home.JPG >>> Cette nuit 2H00 sur France 2 ! Avec les Rolling Stones à la dernière minute !
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Marc, le Forum
Ben là il faut travailler sur un Tableau Séquentiel en mémoire en plus de l'array sur plage avant de l'injecter dans la ComboBox, ca peut se faire de manière assez optimisé, je vais voir... Mais bon pour des volumes énormes, Execel ne peut pas rivaliser avec SQL quand même...

Même si Excel à maintenant un Million de lignes, les Forms 6.0 datent de XL avec 65536 lignes...

A+Tard (j'ai le temps, avant le Mega Virtual Concert Live sur France à 2h00)
@+Thierry
one-world-together-at-home.JPG
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir

J'avais dit que je repasserai avant le mega concert virtuel cette nuit !

Bon je pense que c'est pas trop mal optimisé...

Capture.JPG


Bien à toi
@+Thierry
one-world-together-at-home.JPG
Je vous souhaite un moment si vous regardez France 2 dans 45 minutes !
 

Pièces jointes

  • XLD_marc_proxi_remplissage_liste_combobox.xlsm
    852.3 KB · Affichages: 13

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonjour,


Ne modifie pas la liste du tableur.

VB:
Liste sans doublons trié
Option Compare Text
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  Dim a()
  a = Application.Transpose(f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value)
  Me.ComboBox1.List = SansDoublonsTrié(a())
End Sub

Function SansDoublonsTrié(a())
   Set d = CreateObject("scripting.dictionary")
   For Each c In a
     If c <> "" Then d(c) = ""
   Next c
   b = d.keys
   Tri b, LBound(b), UBound(b)
   SansDoublonsTrié = Application.Transpose(b)
End Function

Sub Tri(a, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
   Do While a(g) < ref: g = g + 1: Loop
   Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call Tri(a, g, droi)
  If gauc < d Then Call Tri(a, gauc, d)
End Sub

Boisgontier
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @marc_proxi @BOISGONTIER , le Forum

Huum, il vaut mieux faire faire le tri par Excel avant traitement de l'USF, car, sur des quantités volumineuses, une méthode comme proposée si dessus risque de faire "exploser" les performances...

Quand j'aurai un moment je regarderai ceci...
Dommage que "Sort" n'existe pas comme dans SQL Server !

Bonne journée
@+Thierry
 

Discussions similaires

Réponses
4
Affichages
209
Réponses
11
Affichages
286
Réponses
15
Affichages
483

Statistiques des forums

Discussions
312 196
Messages
2 086 102
Membres
103 117
dernier inscrit
augustin.morille