IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Listbox et Combobox dans userform: problème de performance


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut Listbox et Combobox dans userform: problème de performance
    Bonjour à tous,

    le chargement de mon userform prend énormement de temps. il est constitué d'une listbox qui est alimentée par un fichier d'environ 2800 lignes, et de 3 combobox qui sont elles même alimentées par des colonnes de ce fichier source.

    le chargement de la listbox est instantanée. Quand je rajoute la 1ere combobox, là on tourne à environ 20 secondes de chargement.
    Avec la listbox et 2 combobox, là on passe allègrement la minute, et avec les 3 combobox cela prend plusieurs minutes.

    Les trois combobox sont liées entre elles: la sélection sur la première définit le contenu de la suivante et ainsi de suite.
    ci-dessous le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    Option Explicit
     
    Dim Ws As Worksheet
    Dim NbLignes As Integer
    Dim NoAction As Boolean
     
     
    Private Sub UserForm_Initialize()
        'Définit la feuille contenant les données
        Set Ws = Worksheets("Etat")
        'Définit le nombre de lignes dans la colonne A
        NbLignes = Ws.Range("A65536").End(xlUp).Row
     
        'Remplissage du ComboBox1
        Alim_Combo 1
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
        'Remplissage Combo2
        Alim_Combo 2, ComboBox1.Value
    End Sub
     
     
    Private Sub ComboBox2_Change()
        'Remplissage Combo3
        Alim_Combo 3, ComboBox2.Value
    End Sub
     
     
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
    Dim j As Integer
    Dim Obj As Control
     
        Set Obj = Me.Controls("ComboBox" & CbxIndex)
        Obj.Clear
        NoAction = True
     
        'alimentation 1ere combobox
        If CbxIndex = 1 Then
            For j = 5 To NbLignes
                Obj = Ws.Range("F" & j)
                If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("F" & j)
            Next j
        'alimentation 2eme combobox
        ElseIf CbxIndex = 2 Then
            For j = 5 To NbLignes
                If Ws.Range("F" & j) = Cible Then
                Obj = Ws.Range("G" & j)
                If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("G" & j)
                End If
            Next j
        'alimentation 3eme combobox
        ElseIf CbxIndex = 3 Then
            For j = 5 To NbLignes
               If Ws.Range("G" & j) = Cible Then
                Obj = Ws.Range("C" & j)
                If Obj.ListIndex = -2 Then Obj.AddItem Ws.Range("C" & j)
                End If
            Next j
     
        End If
        On Error Resume Next
        Obj.ListIndex = 0
        On Error GoTo 0
        NoAction = False
     
    End Sub
    je dois avouer que je tourne en rond.

    j'ai refait plusieurs fois le code source, pour finalement récupérer le code source trouvé sur le forum. Rien n'y fait, c'est toujours aussi lent.
    je pense que le problème vient de la source de données, mais je ne peux pas diminuer le nombre de lignes ni le nombre de colonnes.

    je souhaite bien sur que le userform s'affiche instantané au lancement et qu'il soit prêt à l'usage.

    Si quelqu'un a une idée, je suis preneur !

    Une bonne année à tous

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,


    C'est un bon exemple de ce qu'il ne faut pas faire:
    -Additem est lent
    -Le test doublon est lent
    En PJ , un exemple de combobox sans doublons avec 10.000 lignes dans la BD (0,015 sec).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Compare Text
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("A2:A" & f.[A65000].End(xlUp).Row)  ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
       If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
      Next i
      Me.ComboBox1.List = mondico.keys
    End Sub
    Avec Tri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("A2:A" & f.[A65000].End(xlUp).Row)  ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
       If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
      Next i
      '--avec tri
      temp = mondico.keys
      Tri temp, LBound(temp), UBound(temp)
      Me.ComboBox1.List = temp
    End Sub

    Boisgontier
    Fichiers attachés Fichiers attachés

  3. #3
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Bonjour BoisGontier,

    merci pour le code, je vais l'intégrer à mon programme et je reviens vers vous tous pour vous informer du gain de temps réalisé.

    Cdt,
    Frank

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Sous forme de fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Option Compare Text
    Dim f
    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 = SansDoublonsMAC(a())
    End Sub
     
    Function SansDoublonsMAC(a())
       Dim Maliste As New Collection
       On Error Resume Next
       For i = LBound(a) To UBound(a)
         Maliste.Add Item:=a(i), key:=a(i)
       Next i
       On Error GoTo 0
       Dim b(): ReDim b(1 To Maliste.Count)
       For i = 1 To Maliste.Count
         b(i) = Maliste(i)
       Next i
       SansDoublonsMAC = Application.Transpose(b)
    End Function

    Boisgontier
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [XL-2003] Pb avec les valeurs sortantes COmbobox dans Userform
    Par FrankCF dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/08/2011, 17h45
  2. Réponses: 3
    Dernier message: 30/09/2010, 13h06
  3. [XL-2003] Mise en forme ComboBox dans UserForm
    Par Lufia dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 22/10/2009, 20h59
  4. Combobox dans userform
    Par syllage dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/09/2009, 18h21
  5. (VBA-E) Problème combobox dans userform
    Par gringo69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/06/2006, 18h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo