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 :

Alimentation d'un tableau à 1 dimension et 5 colonnes [XL-2000]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut Alimentation d'un tableau à 1 dimension et 5 colonnes
    Bonjour,

    Je souhaite alimenter une listbox ayant 5 colonnes depuis 5 colonnes contenues dans 2 feuilles différentes.

    Ma listbox doit être triée suivant la première colonne. Il me faut donc passer par un tableau interne et en faire le tri.

    Je ne sais pas comment définir un tableau à 1 dimension avec 5 colonnes et le renseigner ?

    Comment le trier ?

    Julien.

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour,
    pour le tri il y a ce qu'il faut dans Excel et pour une variable tableau,
    Utiliser les variables tableaux en VBA Excel

    Et en prime pour le même prix : Conceptualisation des variables tableau en VBA !


    Mais il est plus simple, pour un débutant, de recopier toutes les données dans une feuille et
    de laisser donc Excel effectuer le tri puis d'alimenter directement la ListBox avec la plage de ces données …


    Et en bonus (même si je procéderais autrement, cela dépanne un débutant) :

    Comment remplir une ComboBox sans doublon et trié par ordre croissant ?

    Il y a donc tout ce qu'il faut sur le site, suffit de regarder dans les tutoriels et la FAQ ‼
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut
    Effectivement, je n'ai pas pensé à utiliser une nouvelle feuille excel.

    Merci beaucoup.

  4. #4
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Exemple en PJ

    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
     
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      a = f.Range("a2:c" & f.[A65000].End(xlUp).Row)
      Call Tri(a, 1, LBound(a), UBound(a))
      Me.ListBox1.list = a
    End Sub
     
    Sub Tri(a, ColTri, gauc, droi) ' Quick sort
      ref = a((gauc + droi) \ 2, ColTri)
      g = gauc: d = droi
      Do
        Do While a(g, ColTri) < ref: g = g + 1: Loop
        Do While ref < a(d, ColTri): d = d - 1: Loop
        If g <= d Then
           For k = LBound(a, 2) To UBound(a, 2)
             temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
           Next k
           g = g + 1: d = d - 1
        End If
      Loop While g <= d
      If g < droi Then Call Tri(a, ColTri, g, droi)
      If gauc < d Then Call Tri(a, ColTri, gauc, d)
    End Sub
     
    Private Sub CommandTriNom_Click()
      Dim a()
      a = Me.ListBox1.list
      Call Tri(a(), 1, LBound(a, 1), UBound(a, 1))
      Me.ListBox1.list = a
    End Sub
    Jacques Boisgontier
    Fichiers attachés Fichiers attachés

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    Bonjour juju5 et boisgontierjacques

    malgré que la discutions soit résolu je voudrais vous proposer une solution beaucoup plus simple

    pour faire ce genre de travaille sur un tri de tableau j'utilise une simple doubleboucle for next sur le meme tableau

    la boucle commencant par le 1er item la 2 eme boucle commence par l'item suivant et en comparant les deux
    si plus petit alors le suivant devient le premier et vis et versa
    quelque ligne suffisent

    le code dans le userform
    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
    Option Base 1
    Private Sub CommandButton1_Click()
        Dim tablo
        With Sheets("BD"): tablo = .Range("a2:c" & .[A65000].End(xlUp).Row): End With
        For i = 1 To UBound(tablo) - 1
            For E = i + 1 To UBound(tablo)
                If tablo(E, 2) < tablo(i, 2) Then
                    ' om memorise les valeur de la ligne sur 3 colonnes
                    temp1 = tablo(i, 1): temp2 = tablo(i, 2): temp3 = tablo(i, 3)
                    ' on inverse les lignes
                    tablo(i, 1) = tablo(E, 1): tablo(i, 2) = tablo(E, 2): tablo(i, 3) = tablo(E, 3)
                    'on met les valeurs memorisée dans la ligne de l'index e
                    tablo(E, 1) = temp1: tablo(E, 2) = temp2: tablo(E, 3) = temp3: End If
            Next
        Next
         UserForm1.ListBox1.List = tablo
    End Sub
    Private Sub UserForm_Activate()
          ' on rempli la liste avec la plage tel quel
            tablo = Sheets("BD").Range("a2:c" & Sheets("BD").[A65000].End(xlUp).Row)
        Me.ListBox1.List() = tablo
    End Sub
    si on enlève les ligne de commentaire vous pourrez constater que le code est très court et simple

    j'espère que le roi des tableaux et dictionnaire ne m'en voudra pas trops
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    En gros Patrick c'est un tri à bulles et c'est le plus lent !

    Par code, le plus rapide étant bien le QuickSort proposé par Jacques …
    Selon l'adaptation il est vrai … J'ai aussi une version non récursive !

    Quand il y a moins d'un millier d'éléments à trier, le CombSort plus simple s'avère aussi rapide mais s'effondre au delà.

    Mais le plus rapide étant quand même le tri interne à Excel …

    Sinon il m'arrive d'utiliser un dictionnaire triant automatiquement ses clefs, et oui il y a d'autres objets que Dictionary
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    salut marc L

    Sinon il m'arrive d'utiliser un dictionnaire triant automatiquement ses clefs, et oui il y a d'autres objets que Dictionary
    je veut bien le connaitre celui la un dico qui tri

    a regarder de plus prêt j'ai un peu de mal a croire que c'est plus rapide
    3 boucles dans une grande boucle avec 2 if en fin pour recommencer si c'est le contraire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Do
        Do While ...........;: Loop
        Do While ...........: Loop
        If g <= d Then
           For ...........;
             temp = .........
           Next k
               End If
      Loop While g <= d
      If g < droi Then Call Tri(a, ColTri, g, droi)
      If gauc < d Then Call Tri(a, ColTri, gauc, d)
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    Pour 8.000 items : 0,18s avec Quick sort contre 13 s

    ShellSort est également très rapide (non récursive)

    Jacques Boisgontier

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour Jacques
    les boucles "do loop" seraient plus rapide alors que les "for next"????
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    Ce n'est pas un problème de boucle mais d'algorithme.

    -Avec Quick-Sort, le temps de tri de 10.000 nombres aléatoires est de 0,04 secondes. Le temps de tri est proportionnel au nombre d'éléments n.
    -Avec Bubble-Sort, le temps de tri de 10.000 nombres aléatoires est de 15 secondes. Le temps de tri est proportionnel au carré du nombre d'éléments (n*n). Ce tri est utilisé essentiellement dans l'enseignement à des fins pédagogiques (à éviter).

    http://boisgontierjacques.free.fr/fi...CompareTri.xls
    http://boisgontierjacques.free.fr/fi.../TriDivers.xls

    Jacques Boisgontier

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bien

    je dormirais moins bete ce soir

    maitre .....

    Au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    je veux bien le connaitre celui-là un dico qui trie
    Il s'agit de SortedList, j'aurais voulu lui consacrer une contribution mais je n'ai pas encore eu ni le temps
    ni la discussion accompagnée d'un fichier joint en support …

    C'est comme pour la gestion des fichiers, je vois l'utilisation systématique de FSO qui pourtant rame bien
    par exemple pour la recherche des sous-répertoires alors qu'il n'y a pas que lui !
    Sans compter les fonctions internes au VBA, Dir en particulier …
    Mais à chaque fois, c'est comme si j'urinais face au vent ‼
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  13. #13
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    SortedList a 2 inconvénients

    -2 fois moins rapide qu'une Quick-Sort
    -Pas disponible sur toutes les versions de Windows

    On suppose qu'il n'y a pas de doublons.

    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
     
    Sub TriSortedList2Col() ' David 84
    tt = Timer()
    Dim oSortedList As Object
    Dim i As Long, T(), T2()
    Set oSortedList = CreateObject("System.Collections.Sortedlist")
    T = Range("A2:B" & [A65000].End(xlUp).Row).Value ' Liste à trier en colonnes A:B
    For i = LBound(T) To UBound(T)
       oSortedList.Add T(i, 1), T(i, 2)
    Next i
    ReDim T2(0 To oSortedList.Count, 1 To 2)
    For i = 0 To oSortedList.Count - 1
      T2(i, 1) = oSortedList.GetKey(i)
      T2(i, 2) = oSortedList.GetByIndex(i)
    Next
    [D2].Resize(UBound(T2), 2) = T2
    MsgBox Timer - tt
    End Sub
    S'il y a des doublons, il faut utiliser Contains qui ralentit (1.5s pour 10.000 items)


    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
     
    Sub TriSortedList2()     ' David 84
    tt = Timer()
    Dim oSortedList As Object
    Dim i As Long, T(), T2()
    Set oSortedList = CreateObject("System.Collections.Sortedlist")
    T = Range("A2:B" & [A65000].End(xlUp).Row).Value
    For i = LBound(T) To UBound(T)
        If Not oSortedList.Contains(T(i, 1)) Then oSortedList.Add T(i, 1), T(i, 2)
    Next i
    ReDim T2(0 To oSortedList.Count, 1 To 2)
    For i = 0 To oSortedList.Count - 1
        T2(i, 1) = oSortedList.GetKey(i)
        T2(i, 2) = oSortedList.GetByIndex(i)
    Next
      [D2].Resize(UBound(T2), 2) = T2
      MsgBox Timer - tt
    End Sub


    Dans le fichier ci dessous, on trouvera un module de classe Sliste (tableau 2D trié) qui remplace SortedList (Il est 2 fois +rapide :0,28s pour 10.000 lignes).
    En outre, il accepte les doublons. Si on veut supprimer ces derniers, on peut utiliser Dictionary qui est très rapide.

    http://boisgontierjacques.free.fr/fi...SortedList.xls

    http://boisgontierjacques.free.fr/fi...ollDavid84.xls

    Dans le fichier ci dessous, on trouvera un module de classe Dictionnaire (tableau 2D trié) qui remplace SortedList (temps tri 0,35s pour 10.000 lignes). En outre, il possède les propriétés de Dictionary.

    http://boisgontierjacques.free.fr/fi...nnaireDico.xls

    Jacques Boisgontier

  14. #14
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut Merci Jacques pour ces infos !

    Il est vrai que je n'ai jamais utilisé SortedList avec autant d'éléments et n'ai donc pas remarqué
    une différence notable avec un classique Dictionary
    Qui plus est, c'est dans un contexte de dénombrement sans avoir besoin d'utiliser Contains ou ContainsKey
    (pratique aussi l'existence de ContainsValue …) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        With CreateObject("System.Collections.SortedList")
            For L& = 1 To UBound(AR)
                If AR(L, 1) > "" Then .Item(AR(L, 1)) = .Item(AR(L, 1)) + 1
            Next
    Tant qu'on y est, j'ai utilisé pour d'autres besoins - là aussi sans atteindre les 10 000 éléments - ArrayList
    possédant sa propre méthode de tri, un avis ?
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  15. #15
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    ArrayList est moins performant que Quick-sort+dictionary . Pour éliminer les doublons, Contains ralenti (2,4 s contre 0,18s pour 10.000 items)
    La classe Aliste peut remplacer ArrayListe.

    Jacques Boisgontier
    Fichiers attachés Fichiers attachés

  16. #16
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    marc l et jacques

    jacques merci de ces précisions

    donc si j'ai bien compris ces objets ne font pas partie d'Excel ce sont des objet de Windows

    comme tu l'a précisé pour le sortedlist espérons qu'il ne disparaisse pas

    en tout cas chapeau bas l'artiste

    un grand merci


    PS:MarcL a tu essayé de te retourner pour pisser au moins

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] VBA alimenter et restituer un tableau à 2 dimensions
    Par totor2027 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/04/2010, 16h56
  2. [tableau à 2 dimensions] association String et float
    Par LoLoSS dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/07/2004, 10h53
  3. Tableau à n dimensions
    Par youb dans le forum MFC
    Réponses: 10
    Dernier message: 13/05/2004, 14h13
  4. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50
  5. Réponses: 23
    Dernier message: 21/08/2003, 07h16

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