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. #1
    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 Trouver l'index colonne du min dans une variable tableau
    Bonjour a tous
    j'avais vu ca quelques part mais je ne le trouve plus

    j'ai une variable tableau de 1 ligne sur X colonne

    je cherche a determiner l'index de colonne de la plus petie valeur
    en gros je veux trier dans une 2 eme variable tableau le premier mais je veux les index et non les valeurs dans la 2 eme variable tableau



    en gros
    j'ai une 1 ere variable dans la quelle il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tablo1=(array(30,12,49,56,37,89,53)
    et je voudrais obtenir dans mon tableau secondaire

    1,0,4,2,6,3,5
    ces chiffres etant les indexs (position) du premier tableau


    j'ai bien essayé comme ceci: mais ca ne fonctionne pas
    les deux variables tableau ayant bien entendu la meme dimention

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    For i = 0 To Val(Cells(5, "B"))
        old = 1000
         For a = 0 To UBound(tablo)
         If Val(tablo(0, a)) < old Then old = tablo(0, a): indexo = a
          Next
     
      e = e + 1
      tablo(0, Indexo) = 1000
      tablof(0, e - 1) = Indexo
     Next
    quelqu'un aurait une idée ??
    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. #2
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Petite idée rapide

    Tu as un tableau, tu fais un tableau de même longueur avec de 0 à x (juste les index)
    Ensuite pendant le tri c'est toujours un test et un switch de valeurs. Donc là tu test sur le tableau des données et tu switch de la même façon sur les deux tableaux
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  3. #3
    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 antoni
    soit je n'ai pas compris soit tu oublie quelque chose

    j'ai bien un 2 eme tablo de la meme dimention deja
    ce qu je veux dedans se sont les index des items mais dans l'ordre croissant par rapport a la valeurs des items du 1 er
    comme je l'ai montré dans mon ennoncé
    ta methode me donnerait un tableau avec les index dans le meme ordre
    c'est sans interet

    dans le 2 eme tableau il est pratiquement impossible sinon a 100% d'avoir(1,2,3,4,5,6,7,8,9,....)

    je ne sais pas si je me suis fait comprendre
    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

  4. #4
    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 bon finalement j'avais trouvé tout seul j'etais pas loin des le depart

    si quelqu'un a une autre methode je veux bien la voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For i = 0 To 15
            For e = 0 To Val(Cells(5, "B"))
                If Val(tablo(0, e)) = WorksheetFunction.Min(tablo) Then a = e: Exit For
            Next
            tablof(0, i) = a + 1
            tablo(0, a) = 1000
        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

  5. #5
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Coucou patricktoulon,

    Désolé j'ai voulu répondre rapidement avant de ne plus avoir de PC sous la main. Ça a rendu mon poste vraiment pas claire.
    Je reviens aujourd'hui avec l'intention d'être plus clair même si ton souci est résolu.

    En fait lorsqu'on tri un tableau, on test les valeurs entre elles et ensuite on permute en fonction du test. En répétant autant de fois qu'il le faut on a un tableau trié :
    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
    Sub tri()
        Dim tableau()
        Dim valeur_boucle&, i&, tempo_tableau&
        tableau = (Array(30, 12, 49, 56, 37, 89, 53))
        Do 'tri décroissant
            valeur_boucle = 0
            For i = 0 To UBound(tableau) - 1
                If tableau(i) < tableau(i + 1) Then
                    tempo_tableau = tableau(i)
                    tableau(i) = tableau(i + 1)
                    tableau(i + 1) = tempo_tableau
                    valeur_boucle = 1
                End If
            Next i
        Loop While valeur_boucle = 1
    End Sub
    Donc l'idée pour avoir un tableau avec les indices triés c'est d'avoir un autre tableau avec uniquement les indices et de faire les permutations dans les deux tableaux :
    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
    Sub tri2()
        Dim tableau(), indice()
        Dim valeur_boucle&, i&, tempo&
        tableau = (Array(30, 12, 49, 56, 37, 89, 53))
        indice = tableau
        For i = 0 To UBound(indice)
            indice(i) = i
        Next i
        Do 'tri décroissant
            valeur_boucle = 0
            For i = 0 To UBound(tableau) - 1
                If tableau(i) < tableau(i + 1) Then
                    tempo = tableau(i)
                    tableau(i) = tableau(i + 1)
                    tableau(i + 1) = tempo
                    tempo = indice(i)
                    indice(i) = indice(i + 1)
                    indice(i + 1) = tempo
                    valeur_boucle = 1
                End If
            Next i
        Loop While valeur_boucle = 1
    End Sub
    Avec ça tu as bien dans le tableau indice les valeurs {1,0,4,2,6,3,5}

    EDIT :
    J'ai utilisé le tri de ce Tuto sur les tableaux mais comme l'idée est de permuter des deux cotés, peu importe la méthode de tri.
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  6. #6
    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 antoni

    oui j'avais envisagé cette solution dans un code un peu plus simple

    en gardant la methode du tri de la faq et au niveau de la permutaion de i sur i+1 ajouter simplement la ligne indice de la meme maniere

    je cherchais des methodes un peu différentes

    notament avec
    application.large(tablo,X)

    ou
    min ou max

    j'aurais bien voulue faire quelque chose avec application.index aussi
    sur MSDN
    malgré avoir traduit la page je n'ai pas pu faire quoi que se soit
    WorksheetFunction.Index Méthode (Excel)
    Autres versions

    Retourne une valeur ou la référence à une valeur à partir d'un tableau ou d'une plage. Il existe deux formes de la fonction INDEX: la forme de tableau et la forme de référence.

    Syntaxe

    --------------------------------------------------------------------------------


    expression. Index (Arg1, Arg2, Arg3, Arg4)
    expression Une variable qui représente une WorksheetFunction objet.
    Paramètres

    Arg1 nécessaire Variante

    Matrice ou une référence - une plage de cellules ou une constante tableau. Pour des références, il est la référence à une ou plusieurs plages de cellules.

    Arg2 Nécessaire Double

    Row_num - sélectionne la rangée dans le réseau à partir de laquelle une valeur de retour. Si row_num est omis, no_col est nécessaire. Pour les références, le numéro de la ligne de référence à partir duquel retourner une référence

    Arg3 Optionnel Variante

    No_col - sélectionne la colonne dans le tableau à partir de laquelle une valeur de retour. Si no_col est omis, row_num est nécessaire. Pour référence, le numéro de la colonne dans laquelle de référence pour renvoyer une référence.

    Arg4 Optionnel Variante

    Area_num - utilisé uniquement lors du retour des références. Sélectionne une plage de référence à partir duquel retourner l'intersection de row_num et no_col. Le premier domaine sélectionné ou entré est le numéro 1, la deuxième est 2, et ainsi de suite. Si area_num est omis, INDEX utilise la zone 1.

    Valeur de retour est variante


    Remarques

    --------------------------------------------------------------------------------


    Sous forme de tableau

    Retourne la valeur d'un élément dans un tableau ou un tableau, choisi par les lignes et de colonnes numéro index.
    Utilisez le formulaire de tableau si le premier argument de INDEX est une constante tableau.

    Si les deux row_num et no_col arguments sont utilisés, INDEX renvoie la valeur dans la cellule à l'intersection de row_num et no_col.

    Si vous définissez row_num ou no_col à 0 (zéro), INDEX retourne le tableau de valeurs pour la colonne ou ligne entière, respectivement. Pour utiliser les valeurs renvoyées sous forme de tableau, entrez la fonction INDEX comme une formule de matrice dans une gamme de cellules horizontale pour une ligne, et dans une gamme verticale de cellules pour une colonne. Pour entrer une formule matricielle, appuyez sur CTRL + SHIFT + ENTRER.

    Row_num et no_col doivent pointer vers une cellule au sein de tableau; autrement, INDEX retourne le REF! valeur d'erreur.

    Forme de référence

    Renvoie la référence de la cellule à l'intersection d'une ligne et colonne particulière. Si la référence est constitué de sélections non adjacentes, vous pouvez choisir la sélection de regarder dans. Si chaque zone en référence ne contient qu'une seule ligne ou une colonne, l'row_num ou no_col argumentation, respectivement, est facultatif. Par exemple, pour une seule référence de ligne, utiliser INDEX (référence ,, no_col).

    Après référence et area_num ont sélectionné une gamme particulière, row_num et no_col sélectionner une cellule particulière: row_num 1 est la première ligne de la plage, no_col 1 est la première colonne, et ainsi de suite. La référence retournée par INDEX est l'intersection de row_num et no_col.

    Si vous définissez row_num ou no_col à 0 (zéro), l'indice retourne la référence pour la colonne ou ligne entière, respectivement.

    Row_num, no_col et area_num doit pointer vers une cellule au sein de référence; autrement, INDEX retourne le REF! valeur d'erreur. Si row_num et no_col sont omis, INDEX renvoie la surface en référence spécifiée par area_num.

    Le résultat de la fonction d'index est une référence et est interprété en tant que tel par d'autres formules. Selon la formule, la valeur de retour d'indice peut être utilisé comme référence ou comme une valeur. Par exemple, la cellule de formule ("largeur", INDEX (A1: B2,1,2)) est équivalent à CELLULE ("largeur", B1). La fonction de cellule utilise la valeur de retour d'index comme une référence de cellule. D'autre part, une formule telle que 2 * INDEX (A1: B2,1,2) traduit la valeur de retour de INDEX dans le nombre dans la cellule B1.
    tu aurais une idée ?
    merci pour le retour
    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. #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 exemple
    re
    exemple pour trier le tablo (croissant ou décroissant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub tri2()
        Dim tablo(), temp()
        tablo = (Array(30, 12, 49, 56, 37, 89, 53))
        temp= tablo
        For i = LBound(tablo) To UBound(tablo)
            'ordre decroisant
            temp(i) = Application.Large(tablo, i + 1)
            'ou ordre croissant
            'temp(UBound(temp) - i) = Application.Large(tablo, i + 1)
        Next
    tablo=temp
    End Sub
    le soucis c'est que je ne sais pas comment intercepter l'index
    je cherche et je trouverais
    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 émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Alors la desole mais tu m'as un peu perdu je dois dire.

    Si je reprends :
    je cherche a determiner l'index de colonne de la plus petite valeur
    Je pense que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
        Dim t(), mini&, indice_mini&
        t = (Array(30, 12, 49, 56, 37, 89, 53))
        With Application.WorksheetFunction
            mini = .Min(t)
            indice_mini = .Match(mini, t, 0)
        End With
    End Sub
    Fait ce que tu cherches non ?

    Pour les tris je me suis perdu avec ton Application.Index
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  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
    re

    oui je sais "index " est un peu compliqué a comprendre je me prend la tete avec

    "match" celle la je l'avais pas vu venir

    je vais examiner ta proposition

    le but tu l'aura compris est de faire autrement que de boucler et permuter l'item avec son suivant ou precedant selon le modele de la faq et d'utiliser les fonctions existantes

    avec Large regarde la fenetre d'execution
    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
    Sub tri3()
        Dim tablo(), indice()
        a = 0
        tablo = (Array(30, 12, 49, 56, 37, 89, 53))
        indice = tablo
        Do
            For i = LBound(tablo) To UBound(tablo)
                valeur = tablo(i) = Application.Large(tablo, a + 1)
                If valeur = True Then Debug.Print valeur & "   " & i & "   " & tablo(i)
            If valeur = True Then indice(UBound(tablo) - a) = i
            Next
            a = a + 1
        Loop Until a = UBound(tablo) + 1
     
    End Sub
    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
    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
    bon apres examen de min
    ca trouve bien le min mais sa implique de modifier le tablo dans une boucle

    tandis que large avec son 2 eme argument me permet de gerer les items
    large (tablo,1) 'donne le plus grand
    large(tablo,2) donne celui qui est juste plus petit que le 1 mais plus grand que les autres


    on pourrait coupler la fonction large et match tout simplement non?
    en attendant voila la mise en application de large
    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
    Sub tri4()
        Dim tablo(), indice()
     
        tablo = (Array(30, 12, 49, 56, 37, 89, 53))
        indice = tablo: a = 0
        Do
            For i = LBound(tablo) To UBound(tablo)
              If tablo(i) = Application.Large(tablo, a + 1) Then indice(UBound(tablo) - a) = i
            Next
            a = a + 1
        Loop Until a = UBound(tablo) + 1
    For Each elem In indice
    Debug.Print elem & vbCrLf
    Next
    End Sub
    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

  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 voila (Large couplé a match)
    re
    voila large et match dans une seule boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
        Dim t(), mini&, indice_mini&
        t = (Array(30, 12, 49, 56, 37, 89, 53))
        t2 = t
        For i = 0 To UBound(t)
            With Application.WorksheetFunction
                t2(UBound(t2) - i) = .Match(.Large(t, i + 1), t, 0) - 1
            End With
        Next
        For Each elem In t2
        Debug.Print elem & vbCrLf
        Next
     
    End Sub
    et pour l'ordre décroissant c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     t2( i) = .Match(.Large(t, i + 1), t, 0) - 1
    qu'en pense tu ?
    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
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    C’est vraiment sympa comme solution !

    J'étais parti sur un truc tordu comme tu les aimes :d
    Avec Rank mais le problème c'est qu'un des paramètres est un Range c'est un peu ennuyeux
    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 test_tri()
        Application.ScreenUpdating = False
        Rows("1:1").Insert
            Dim t(), t_trie(), i&, rg As Range, place&
            t = (Array(30, 12, 49, 56, 37, 89, 53))
            t_trie = t
            Set rg = Range(Cells(1, 1), Cells(1, UBound(t) + 1))
            rg = t()
            For i = 0 To UBound(t_trie)
                place = Application.WorksheetFunction.Rank(t(i), rg, 1) - 1
                t_trie(place) = t(i)
            Next i
    fin:
        Set rg = Nothing
        Rows("1:1").Delete
        Application.ScreenUpdating = True
    End Sub
    Nos solutions sont similaires dans l'idée mais toi tu ne touches pas à la feuille c'est mieux.
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  13. #13
    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
    et oui le but etant de maximizer la velocité sans perdre de la veracité avec un code le plus court possible et intelligible

    je crois que la on ne trouvera pas plus simple non?


    merci pour l'eguillage sur "match"

    etant un pure vbiste j'ai toujours opter pour du vb et depuis quelque temps je m'interesse aux fonctions natives

    il est vrai que cela simplifie quelques fois les choses
    en tout cas cette methode de trie dechire tout
    je me demande si elle fonctionne avec du string j'essaierais

    merci a toi
    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

  14. #14
    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
    Au lieu de Large, tu peux aussi utiliser Small
    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
    Sub Test()
    Dim N As Long, i As Long
    Dim T, Tf
     
    T = Array(2, 11, 45, 1)
    N = UBound(T)
    ReDim Tf(0 To N)
     
    For i = 0 To N
        With Application.WorksheetFunction
            Tf(i) = .Match(.Small(T, i + 1), T, 0) - 1
        End With
    Next i
     
    Debug.Print Join(T) & vbNewLine & Join(Tf)
    End Sub
    PS. Bémol: Pour les doublons, l'index du premier élément est donné.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  15. #15
    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 Mercatog

    purée je cherchais justement si ca existait


    en l'etat pour decroissant se sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t2( i) = .Match(.Large(t, i + 1), t, 0) - 1
    et pour croissant se sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t2 i) = .Match(.small(t, i + 1), t, 0) - 1

    pour les doublons je n'y ai pas pensé c'est vrai
    il va falloir que j'integre un dico dans le quel j'integre les indexs ca m'ennuie je veux simplifier au plus possible la procedure
    une idée?
    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

  16. #16
    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 résutat,suprenant!!
    bon voila
    avec un dico j'ai un résultat surprenant
    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 test()
        Dim t(), t2(), dico
        Set dico = CreateObject("Scripting.Dictionary")
        t = (Array(30, 12, 49, 56, 37, 56, 89, 53))
          t2 = t
        For i = 0 To UBound(t)
            With Application.WorksheetFunction
              inx = .Match(.Large(t, i + 1), t, 0) - 1
                If Not dico.exists(inx) Then t2(UBound(t2) - i) = .Match(.Large(t, i + 1), t, 0) - 1
            dico(inx) = ""
            End With
        Next
        For Each elem In t2
        Debug.Print elem & vbCrLf
        Next
     
    End Sub
    voila le resultat dans la fenetre d'execution
    1
    0
    4
    2
    7
    56
    3
    6
    j'avoue que la je suis perplexe

    la fonction match renvérait elle la valeur et non l'index en cas de 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

  17. #17
    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
    Voyons Patrick

    Tu as mis T2=T en ligne 5

    Et avec ton dico tu ne traite pas la seconde valeur en double (pour ton exemple la 56)

    Si tu ne veux pas garder ton tableau initial intact, pas besoin de la variable S ci-après
    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 Test()
    Dim N As Long, i As Long
    Dim T, S, Tf
     
    T = Array(30, 12, 49, 56, 37, 56, 89, 53)
    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
            S(Tf(i)) = .Min(S) - 1
        End With
    Next i
    Debug.Print "T: " & Join(T) & vbNewLine & "Tf: " & Join(Tf)
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  18. #18
    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

    Tu as mis T2=T en ligne 5
    la fleme d' ecrire "redim t2(ubound(t))"

    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

  19. #19
    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,
    peut-être comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub tri()Dim tablo(), temp()
      tablo = Array(30, 12, 49, 56, 37, 89, 53)
      ReDim temp(LBound(tablo) To UBound(tablo))
     
     
      For i = LBound(tablo) To UBound(tablo)
         temp(i) = Application.Match(Application.Large(tablo, i + 1), tablo, 0) - 1
      Next
      tablo = temp
    End Sub
    A+

  20. #20
    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 ca y est j'ai compris !!!!
    Re
    @Mercatog
    bon la je dis respect!!


    j'ai eu du mal avec tes 3 Variables tableau mais j'ai fini par comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 0 To UBound(T)
        With Application.WorksheetFunction
            Tf(i) = .Match(.Small(S, i + 1), S, 0) - 1
            S(Tf(i)) = .Min(S) - 1
        End With
    Next i
    en fait la vaiable TF sert d'iteration pour incrémenter S et de tableau final
    sans avopir fait de debug.print je suppose que S doit avoir une drole de tete a la fin non?
    il fallait y penser

    je le redis respect
    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 1 sur 4 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