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 :

Trouver l'index colonne du min dans une variable tableau [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #21
    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 Davido

    ca faisait longtemps

    non c'est pas bon ca ne gere pas les doublons
    cette proposition a été vu plus haut dans le post

    @mercatog
    j'ai quand meme fait un debug.print sur S a chaque tour
    ca n'est pas le résultat au quel je m'attendais

    S=30 11 49 56 37 56 89 53
    S=10 11 49 56 37 56 89 53
    S=10 11 49 56 9 56 89 53
    S=10 11 8 56 9 56 89 53
    S=10 11 8 56 9 56 89 7
    S=10 11 8 6 9 56 89 7
    S=10 11 8 6 9 5 89 7
    S=10 11 8 6 9 5 4 7
    T: 30 12 49 56 37 56 89 53
    Tf: 1 0 4 2 7 3 5 6
    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

  2. #22
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Re patrick

    Pour rendre S drôle
    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
    Sub Test()
    Dim N As Long, i As Long
    Dim T, S, Tf
     
    T = Array(30, 12, 53, 56, 37, 56, 53, 14, 53)
    Debug.Print "T: " & Join(T)
     
    N = UBound(T)
    ReDim Tf(0 To N)
    S = T
     
    For i = 0 To N
        With Application.WorksheetFunction
            Tf(i) = .Match(.Small(S, i + 1), S, 0) - 1
        End With
        S(Tf(i)) = -9 ^ 9
    Debug.Print "S: " & Join(S)
    Next i
    Debug.Print "Tf: " & Join(Tf)
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #23
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonsoir Patrick,
    non c'est pas bon ca ne gere pas les doublons
    Au moment où j'ai regardé la question (juste avant d'aller déjeuner) je n'avais pas vu cette histoire de doublon et comme j'ai traité ta demande de retour du déjeuner j'ai posté sans raffraîchir...désolé.
    Si tu reprends ton exemple, par exemple avec un Array(30, 12, 53, 56, 37, 56, 53, 14, 53) quel résultat attends-tu ?
    A+

  4. #24
    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 Davido

    Mercatog y a parfaitement repondu dans le post 14 et 22

    sur un array
    (45,37,49,21,85,49,51,24)

    je dois me retrouver avec
    3,7,1,0,2,5,6,4
    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

  5. #25
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    tu peux également passer par MIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub tri2()
    Dim tablo(), temp()
      tablo = Array(45, 37, 49, 21, 85, 49, 51, 24)
      ReDim temp(LBound(tablo) To UBound(tablo))
      For i = LBound(tablo) To UBound(tablo)
         temp(i) = Application.Match(Application.Min(tablo), tablo, 0) - 1
         tablo(temp(i)) = ""
      Next
      Debug.Print "Temp: " & Join(temp)
    End Sub
    A+

  6. #26
    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
    bravo davido
    belle demo aussi

    mais en gros tu utilise presque la meme methode que Mercatog
    a savoir l'utilisation de la valeur de temp(i) pour index du tablo
    astucieux aussi

    respect +1 aussi
    et c'est quand meme mieux que 2 boucles imbriquée non?


    voila deux exemple a mettre dans les contributions car c'est bien utile
    on a cela nulle part dans DVP

    Merci encore a tous les deux
    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

  7. #27
    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 petit detail
    ah!!!! davido petit detail qui peut avoir son importance
    je viens de faire le test avec Max
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub tri3()
    Dim tablo(), temp()
      tablo = Array(45, 37, 49, 21, 85, 49, 51, 24)
      ReDim temp(LBound(tablo) To UBound(tablo))
      For i = LBound(tablo) To UBound(tablo)
         temp(i) = Application.Match(Application.Max(tablo), tablo, 0) - 1
         tablo(temp(i)) = 0
      Next
      Debug.Print "Temp: " & Join(temp)
    End Sub
    (decroissant/croissant)
    le résultat avec min etait
    Temp: 3 7 1 0 2 5 6 4
    le resultat avec max
    est
    Temp: 4 6 2 5 0 1 7 3
    les deux item identique sont inversés

    maintenant un peu plus compliqué
    je voudrais faire la meme chose mais avec un tablo a 2 ligne

    ligne1 du tablo=7, 3, 2, 6, 5, 1, 4,8
    ligne2 du tablo= 45, 37, 49, 21, 85, 49, 51, 24
    a la place des indexs dans temp je voudrais la ligne du haut

    en gros c'est comme un tri avec etiquette sur une plage
    je sais c'est tordu mais c'est moi

    il devient fort le petit davido quand meme hein!!
    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. #28
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Si j'ai bien compris ce que tu veux (je suis parti du principe que tu partais de 2 array) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub tri3()
    Dim tablo1(), tablo2(), temp()
      tablo1 = Array(7, 3, 2, 6, 5, 1, 4, 8)
      tablo2 = Array(45, 37, 49, 21, 85, 49, 51, 24)
      ReDim temp(LBound(tablo1) To UBound(tablo1))
      With Application.WorksheetFunction
      For i = LBound(temp) To UBound(temp)
         temp(i) = .Index(tablo1, .Match(.Min(tablo2), tablo2, 0))
         tablo2(.Match(.Min(tablo2), tablo2, 0) - 1) = ""
      Next
      End With
      Debug.Print "Temp: " & Join(temp)
    End Sub
    A+

  9. #29
    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
    re
    ouii comme ca c'est simple mais non je parle bien d'un tableau de x colonnes sur 2 ligne et non de 2 arrays

    ta méthode serait un paliatif en considérant que l'on scinde le tabeau en 2 pour en faire 2 arrays

    mais ca m'ennuie un peu en fait j'utilise les fonction natives (match,large,min,small,etc......)
    pour reduire le code et d'en ameliorer la velocité

    mais j'aurais préféré un tableau

    dur dur de sortir de VB
    en gros j'ai un tableau
    7, 3, 2, 6, 5, 1, 4, 8
    45, 37, 49, 21, 85, 49, 51, 24
    et je voudrais obtenir

    6 8 3 7 2 5 4 1
    21 24 37 45 49 49 51 85
    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. #30
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    il faut que tu me dises de quelle manière tu charges ton tableau pour que je puisse te répondre.
    Charges-tu un tableau à partir de la feuille de calcul (je crois comprendre que non mais...) ou bien directement en dur dans ton code, du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim tablo1()
    ReDim tablo(1 To 2, 1 To 8)
    tablo(1, 1) = 7: tablo(2, 1) = 45
    tablo(1, 2) = 3: tablo(2, 2) = 37
    tablo(1, 3) = 2: tablo(2, 3) = 49
    tablo(1, 4) = 6: tablo(2, 4) = 21
    tablo(1, 5) = 5: tablo(2, 5) = 85
    tablo(1, 6) = 1: tablo(2, 6) = 49
    tablo(1, 7) = 4: tablo(2, 7) = 51
    tablo(1, 8) = 8: tablo(2, 8) = 24
    par exemple ?
    A+

  11. #31
    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 Davido

    ca n'a aucunne importance

    soit comme tu viens de le montrer soit par une plage


    la question dans ce cadre c'est comment boucler sur les item d'une ligne et faire correspondre l'argument (tablo) dans les fonctions

    puisque max,min ,large,small prend encompte tout le tablo
    je pense que scinder le tablo en 2 arrays est la seule solution
    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. #32
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Si le but est de travailler avec des WorksheetFunction je ne vois pas d'autres moyens que de scinder le tabeau VBA multicolonne en 2 Arrays.
    Par contre si le but est de faire correspondre une valeur à sa clé tu peux très bien trier ton tableau VBA multicolonne (en utilisant un Quick Sort par exemple) avec comme critère de tri les valeurs.
    Une fois ton tableau trié tu peux ramener dans 2 Arrays différents (un pour les clés et un autre pour les valeurs) les données triées comme tu le souhaites :
    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
    Sub TriMultiCol()
    Dim tablo(), temp(), temp2()
     
    ReDim tablo(1 To 2, 1 To 8)
     
    tablo(1, 1) = 7: tablo(2, 1) = 45
    tablo(1, 2) = 3: tablo(2, 2) = 37
    tablo(1, 3) = 2: tablo(2, 3) = 49
    tablo(1, 4) = 6: tablo(2, 4) = 21
    tablo(1, 5) = 5: tablo(2, 5) = 85
    tablo(1, 6) = 1: tablo(2, 6) = 49
    tablo(1, 7) = 4: tablo(2, 7) = 51
    tablo(1, 8) = 8: tablo(2, 8) = 24
     
    Call Quick(tablo, LBound(tablo, 2), UBound(tablo, 2))
     
    ReDim temp(LBound(tablo, 2) To UBound(tablo, 2)): ReDim temp2(LBound(tablo, 2) To UBound(tablo, 2))
     
    For i = LBound(tablo, 2) To UBound(tablo, 2)
      temp(i) = tablo(1, i): temp2(i) = tablo(2, i)
    Next i
     
    Debug.Print Join(temp, " "): Debug.Print Join(temp2, " ")
    End Sub
     
     
    Private Sub Quick(a, gauc, droi)
      ref = a(2, (gauc + droi) \ 2)
      g = gauc: d = droi
      Do
        Do While a(2, g) < ref: g = g + 1: Loop
        Do While ref < a(2, d): d = d - 1: Loop
         If g <= d Then
           temp = a(1, g): a(1, g) = a(1, d): a(1, d) = temp
           temp = a(2, g): a(2, g) = a(2, d): a(2, d) = temp
           g = g + 1: d = d - 1
         End If
       Loop While g <= d
       If g < droi Then Call Quick(a, g, droi)
       If gauc < d Then Call Quick(a, gauc, d)
    End Sub
    A+

  13. #33
    Membre habitué Avatar de Klin89
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 119
    Points : 178
    Points
    178
    Par défaut
    Bonsoir à tous,

    Patrick, tu peux aussi voir du côté de Sortedlist
    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
    Option Explicit
     
    Sub Index_Colonne()
    Dim i As Long, tablo1, tablo2()
        tablo1 = Array(30, 12, 49, 56, 37, 89, 53)
        With CreateObject("System.Collections.Sortedlist")
            For i = 0 To UBound(tablo1)
                If Not .Contains(tablo1(i)) Then .Add tablo1(i), i
            Next
            ReDim tablo2(1 To .Count)
            For i = 0 To .Count - 1
                tablo2(i + 1) = .GetByIndex(i)
                'Sheets("Feuil1").Cells(i + 1, "a").Value = .GetByIndex(i)
            Next
        End With
        Sheets("Feuil1").Cells(1).Resize(UBound(tablo2)).Value = Application.Transpose(tablo2)
    End Sub
    Je découvre le fil, je n'ai pas poussé plus loin.

    klin89

  14. #34
    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 klin89

    je connais la methode de tri sort on a d'ailleur quelques exemple sur le forum
    mais je ne savais pas qu'il y avais un object sortedlist

    mais la on est en dehors du context
    car le but de cet exercice etait de:

    1 utilisation d'une seul boucle for ou do comme tu veux
    2 supprimer le besoins de condition"if"
    en utilisant les fonctions natives de vba excel

    mais ca m'a l'air tres interéssant ton object je vois deja qu'il y a une propriété .getbyindex c'est deja une bonne chose

    je vais me documenter
    merci pour ton intervention


    edit:
    bon je viens de tester finalement on est pas bon car l'object collection n'accepte pas les doublons hors je veux garder tout les items

    mais pour d'autre besoins c'est un bon compromis
    pour une liste sans doublons et dans l'ordre

    tres interéssant
    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

  15. #35
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    et oui l'objet SortedList n'accepte pas les doublons...si tu veux garder tous les items utilise plutôt l'objet ArrayList qui possède une méthode Sort :
    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
    Sub TriArrayList()
    Dim T, AL As Object, c
      T = Array(3, 5, 3, 1, 2, 5, 4, 8, 9, 1)
      Set AL = CreateObject("System.Collections.ArrayList")
     
      For i = LBound(T) To UBound(T)
        AL.Add T(i)
      Next i
     
      AL.Sort 'on trie
     
      For Each c In AL
        Debug.Print c
      Next c
     
      Set AL = Nothing
    End Sub
    Attention toutefois car ces objets ne fonctionnent que sur des Arrays unidimentionnels, or ce n'est pas le cas dans ta dernière demande.

    A+

  16. #36
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Plus simple pour ramener les items dans le Debug.Print :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TriArrayList()
    Dim T, AL As Object, c, i&
      T = Array(3, 5, 3, 1, 2, 5, 4, 8, 9, 1)
      Set AL = CreateObject("System.Collections.ArrayList")
     
      For i = LBound(T) To UBound(T)
        AL.Add T(i)
      Next i
     
      AL.Sort 'on trie
      Debug.Print Join(AL.toarray())
      Set AL = Nothing
    End Sub
    A+

  17. #37
    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
    purée ils sont fort ces petits

    bon j'en conclut donc que j'avais fait une erreur de comprehention

    cet object ne supprime pas les doublons

    Ok davido on a tout notre array trié , et les indexs comment les récupérer avec cet object

    ils sont vraiment fort

    comment ce fait il que je n'ai jamais vu cet object dans le forum ou la faq hein.....

    est le meme que as new collection en late binding

    @Davido
    Attention toutefois car ces objets ne fonctionnent que sur des Arrays unidimentionnels, or ce n'est pas le cas dans ta dernière demande.
    de toute facon je n'ai pas trouver autre methode que de scinder le tableau multi ligne par le nombre de lignes pour pouvoir utiliser notre methode

    purré j'allucine encore pourquoi on a pas ca dans les sources ou faq on trouve pourtant bien des exemples avec la methode sort mais sur un tablo classique

    en trois ligne cela fait ce que fait le meilleur exemple que j'ai trouvé en 15 lignes enfin bref


    bon reprenons ...!!!...les indexs
    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

  18. #38
    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 677
    Points
    18 677
    Par défaut

    Salut !

    Citation Envoyé par patricktoulon Voir le message
    comment ce fait il que je n'ai jamais vu cet object dans le forum ou la faq hein.....
    Tu ne l'as pas vu mais déjà évoqué dans des discussions …
    (Comme du reste ton autre question pour l'ouverture directe en mémoire d'un fichier texte …)

    Cependant à grande échelle , cet objet est moins rapide que l'objet Dictionary même suivi par un tri QuickSort.

    Sinon pour cette discussion, il doit y avoir moyen sans boucle via une fonction de feuille de calculs matricielle ou via Evaluate
    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)

  19. #39
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour Marc,

    @Patrick :
    bon j'en conclut donc que j'avais fait une erreur de comprehention

    cet object ne supprime pas les doublons
    SortedList ne permet pas les doublons mais pas de problème avec ArrayList
    Ok davido on a tout notre array trié , et les indexs comment les récupérer avec cet object
    Comme on a affaire à un array à une dimension on en revient donc aux possibilités déjà exposées.
    On peut par exemple faire comme cela
    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
    Sub TriArrayList()
    Dim T, T2, AL As Object, c, i&, j&, temp()
      T = Array(7, 3, 2, 6, 5, 1, 4, 8)
      T2 = Array(45, 37, 49, 21, 85, 49, 51, 24)
      Set AL = CreateObject("System.Collections.ArrayList")
     
      For i = LBound(T) To UBound(T): AL.Add T2(i): Next i
     
      AL.Sort 'on trie
     
      ReDim temp(LBound(T) To UBound(T))
     
      For i = LBound(temp) To UBound(temp)
        j = Application.Match(AL.Item(i), T2, 0) - 1
        temp(i) = T(j): T2(j) = ""
      Next i
     
      Debug.Print Join(temp): Debug.Print Join(AL.toarray())
      Set AL = Nothing
    End Sub
    ou autrement.

    @Marc :
    Cependant à grande échelle , cet objet est moins rapide que l'objet Dictionary même suivi par un tri QuickSort
    oui mais Patrick veut garder les doublons donc pas besoin de Dictionary et utiliser effectivement un Quik Sort (ou une autre fonction de ce type) qui permet de trier un Arrays à 2 dimensions très rapidement, ce que ne permet pas la méthode Sort de ArrayList comme exposé dans un message antérieur.
    Sinon pour cette discussion, il doit y avoir moyen sans boucle via une fonction de feuille de calculs matricielle ou via Evaluate
    Concernant les fonctions il ne veut utiliser que des WorksheetFunction si j'ai bien compris.

    A+

  20. #40
    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
    Concernant les fonctions il ne veut utiliser que des WorksheetFunction si j'ai bien compris
    c'est tout a fait cela du moins toute fonction object ou native d'exel qui me permetrais de reduire le code a une seule boucle comme on l'a deja vu

    @MarcL
    oui je sis que excel a une fonction tri qui fonctionne parfaitement bien avec etiquette (deplacement conjoint de la cellule d'a coté ou du dessous/dessus)

    en gros je veux faire la meme chose mais sur une variable tableau car ma source est issue d'une table html est n'est donc pas dans un sheets

    Alors oui le sujet est ésolu mais ayant decouvert cet object j'examine en detail ces possibilités (ca mange pas de pain )

    quand au fait que ces objects ont été deja cités dans des discutions c'est tellement enfoui dans les post que meme quand je tape

    1° "System.Collections.Sortedlist

    2°"System.Collections.arraylist

    3°"System.Collections.stack

    4"System.Collections.Queue

    et bien Google ne me propose meme pas une page de DVP

    ce qui est dommage dans l'object "arraylist" c'est qu'il n'est pas comme sortedlist ou meme encore un dictionnaire (cle/valeur) ca resoudrait tout le boulot

    avec sortedlist j'ai fait un exemple qui fonctionne parfaitement bien mais mal heureusement il supprime les doublons
    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.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. [PHP 5.3] Récupérer tous les index d'un array dans une variable
    Par BLJ.CHAUVIN dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2011, 16h36
  2. Réponses: 2
    Dernier message: 12/10/2010, 09h35
  3. Réponses: 13
    Dernier message: 09/08/2008, 14h04
  4. recherche dans une variable tableau
    Par le petit nicolas dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/05/2007, 12h41
  5. [VBA-E]Recherche dans une variable tableau
    Par illight dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/12/2006, 17h50

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