XL 2019 Lenteur pour charger une ComboBox à l'ouverture d'un classeur

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 !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonsoir,

Tout est dans le titre.

Sur une feuille j'ai une ComboBox qui affiche une liste de nombres (1 jusqu'à 409 par pas de 0,5 : les tailles possibles des polices de caractères).
Cette ComboBox se charge à chaque ouverture du classeur dans Workbook_Open(). Néanmoins son chargement est très long, alors que si je vide la ComboBox et qu'ensuite je la charge, l'opération est quasi instantanée. À quoi est-ce dû ? Une lenteur avec les ActiveX ?
 
Bonjour @Magic_Doctor🙂, @dysorthographie😉,

Avec une ComboBox1 sur Feuil1, l'ouverture du classeur est instantanée.
VB:
Private Sub Workbook_Open()
Dim v#
   Feuil1.ComboBox1.Clear: v = 0.5
   Do: Feuil1.ComboBox1.AddItem v: v = v + 0.5: Loop Until v > 409
End Sub

Sinon, il faudrait joindre votre propre classeur avec le défaut.
 

Pièces jointes

Bonsoir dysorthographie, mapomme,

La solution de mapomme marche très bien.
La ComboBox se trouve bien sur une feuille.
En fait, il y en a 2 qui recueillent exactement les mêmes données. Aussi, ai-je écrit ceci :

VB:
    With Feuil1
        v = 0.5
        .ComboBox1.Clear
        .ComboBox2.Clear
        Do: .ComboBox1.AddItem v: v = v + 0.5: Loop Until v > 409
        Do: .ComboBox2.AddItem v: v = v + 0.5: Loop Until v > 409
    End With

Ça marche bien pour la première ComboBox, en revanche la seconde ne se charge pas.
Où me serais-je encore planté ?
 
Re @Magic_Doctor😉,

On peut simplifier ton code pour ComboBox2 en se servant du travail qu'on a fait pour ComboBox1 :
VB:
Private Sub Workbook_Open()
Dim v#
   Feuil1.ComboBox1.Clear: v = 0.5
   Do: Feuil1.ComboBox1.AddItem v: v = v + 0.5: Loop Until v > 409
   Feuil1.ComboBox2.List = Feuil1.ComboBox1.List
End Sub
 
Bonjour
VB:
Private Sub Workbook_Open()
    Dim v As Double
    Dim i As Long
    Dim n As Long
    Dim arr()

    ' Nombre total d’entrées : (409 - 0.5) / 0.5 + 1
    n = (409# - 0.5) / 0.5 + 1
    ReDim arr(1 To n, 1 To 1)

    ' Remplir le tableau en mémoire (beaucoup plus rapide)
    v = 0.5
    For i = 1 To n
        arr(i, 1) = v
        v = v + 0.5
    Next i

    ' Charger directement la liste dans les 2 ComboBox
    With Feuil1
        .ComboBox1.Clear
        .ComboBox2.Clear
        .ComboBox1.List = arr
        .ComboBox2.List = arr
    End With
End Sub
 
Bonjour laurent950, le fil,

On peut éviter toute boucle en utilisant simplement :
VB:
Private Sub Workbook_Open()
Dim a
a = Evaluate("ROW(1:818)/2")
Feuil1.ComboBox1.List = a
Feuil1.ComboBox2.List = a
End Sub
Cela dit chez moi ta macro et la mienne s'exécutent toutes deux en 0,42 ms.

Edit : j'ai retesté en enlevant les .ComboBox1.Clear qui sont inutiles, la macro de Laurent s'exécute en 0,38 ms.

Quant à la macro de mapomme avec AddItem elle s'exécute en 55 ms.

A+
 
Dernière édition:
bonsoir
ouias .. pas mal
j'ai plus dingue si vous voulez
excel all version
ComboBox1.List = Application.Transpose(Evaluate("ROW(1:" & 409 / 0.5 & ")*0.5"))
excel version moderne avec sequence
ComboBox1.List = Application.WorksheetFunction.Sequence(409 / 0.5, 1, 0.5, 0.5)

@job75 Nous nous sommes croisés
 
Bonjour à tous,

Merci pour vos réponses.

Maintenant, en y regardant de plus près, puisqu'il s'agit en fait de la liste de toutes les tailles possibles de polices de caractères, qui va de 1 à 409 (par pas de 0,5), en toute rigueur il faudrait que la liste commence par 1 et non pas 0,5 ; car si on sélectionne par la suite 0,5, on a fatalement un message d'erreur.
 
- 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
Retour