Fonction rang dans un tableau
Bonjour à tous,
Malgré mes recherches sur le sujet, je ne trouve pas de réponse à mon problème.
J'ai dans la première colonne d'un tableau une liste de 5 nombres.
Dans la 2eme colonne de mon tableau, j'aimerais inscrire le rang du nombre de la ligne correspondante en fonction de sa valeur.
Ex:
Valeur - Rang
12 - 5
54 - 2
36 - 4
87 - 1
49 - 3
Je précise que je ne veux pas passer "par la feuille", c'est à dire que je ne veux pas inscrire mes valeurs dans des cellules pour venir les lire ensuite.
Je débute sur vba et je n'arrive pas à définir ma première colonne en tant que référence (arg2) de la fonction Rank_eq.
Merci de votre aide!
Bonjour
Pas compris : pourquoi ne pas utiliser la fonction rang tout simplement ?
Bonsoir Cookislander, 78chris,
Je suis tout à fait d'accord avec 78chris : c'est bien plus simple de passer par la fonction RANG() !
Je te retourne ton fichier Excel modifié :
À l'ouverture du fichier, note bien que la plage C4:D8 est vide ; Ctrl t ➯ travail effectué ... mais les apparences sont parfois trompeuses ! les 2 colonnes de résultats ne sont pas les mêmes !
Alt F11 pour voir le code VBA, puis revenir sur Excel
Si besoin, tu peux demander une adaptation.
Merci de me dire si ça te convient.
dhany
Merci de vos retours.
Je pense que je me suis mal exprimé.
Je veux bien entendu utiliser la fonction Rang() en VBA, mais en référence (arg2 de la fonction Rang) je veux utiliser une colonne d'un tableau qui lui n'est pas affiché sur la feuille. Je ne peux donc pas venir chercher les valeurs de la feuille en entrée (voir commentaire dans la macro de mon fichier initial.
Mon souci est que je n'arrive pas à définir une range en tant qu'Arg2 à partir d'une colonne de tableau. En gros j'aimerais lire la colonne de mon tableau est la définir en tant que range, afin de m'en servir dans : application.worksheetFunction.Rank_eq(arg1, arg2), où arg1 est la valeur à laquelle attribuer le rang et arg2 la plage de comparaison.
Bonjour Cookislander,
J'ai longuement cherché, mais ta demande semble bien impossible !
En VBA, on peut utiliser expression.WorksheetFunction.Rank() pour calculer le rang d'une liste de nombres, mais expression doit être obligatoirement une variable qui représente un objet WorksheetFunction ; c'est donc incompatible avec toute tentative d'utiliser les tableaux du VBA.
Comme j'ai Excel 2007, je n'ai pas les 2 fonctions dérivées .Rank_Eq() et .Rank_Avg() ; mais ça semble bien idem pour elles deux.
Pour plus d'infos, lire l'article de ce lien : https://msdn.microsoft.com/fr-fr/vba/excel-vba/articles/worksheetfunction-rank-method-excel
La seule solution purement VBA serait donc de balayer tous les éléments du tableau VBA pour générer le rang.
si un autre intervenant trouve une astuce pour utiliser .Rank() avec un tableau VBA, alors bravo à lui !
dhany
Merci dhany pour tes recherches.
Oui j'avais lu la page d'aide microsoft mais je n'avais pas saisi l'incompatibilité.
Ca me semble quand même fou qu'on ne puisse pas venir lire une colonne d'un tableau (array) en vba.
J'ai pensé à d'autres manières pour affecter un rang à ma liste via le balayage dont tu parles. Ou alors une solution consiste à écrire la colonne de mon tableau vba sur la feuille, utiliser la fonction rang, écrire les numéros de rang dans le tableau vba, puis effacer les cellules de la feuille.
Je laisse le sujet ouvert, si jamais quelqu'un parvient à utiliser la fonction rang dans un tableau vba...
Bonjour, Salut à tous !
J'arrive inopinément et indirectement sur ton sujet en traitant mes suivis en retard...
Le problème auquel tu te heurtes tient au fait que certaines fonctions Excel acceptent des matrices sous diverses formes, donc éventuellement autres que plages, et dans ce cas lors de leur utilisation en VBA tu pourras utiliser un tableau, mais il est des fonctions qui n'acceptent les matrices que sous forme de plages et alors pas question d'utiliser un tableau...
En principe, l'aide Excel permet de savoir ce qu'il en est pour chaque fonction, mais n'est au demeurant pas toujours précise : l'aide Excel sur RANG ne fait référence qu'à une matrice sans spécifier plage, mais l'expérience montre qu'elle refuse une matrice hors plage ; l'aide VBA sur la fonction Excel Rank est plus explicite en précisant une donnée de type Range. Et effectivement en essayant avec un tableau tu obtiens une incompatibilité de type...
Alors, si tu ne veux rien matérialiser sur la feuille mais utiliser WorksheetFunction.Rank [tu peux envisager de créer une fonction de calcul du rang en VBA mais cela tendrait à compliquer l'opération pour obtenir le résultat tel que le fournit la fonction Excel... pas très rentable donc !], tu commences par désactiver la mise à jour de l'affichage (de façon à ne rien voir), tu affectes ton tableau de valeur à une plage, ce qui te permet de calculer le rang de chaque valeur en utilisant la fonction, puis tu effaces...
En ersatz, en partant de ton fichier :
Sub test()
Dim tab1(1 To 5, 1), i%, plg As Range
Set plg = ActiveSheet.Range("B4:B8")
For i = 1 To 5
tab1(i, 0) = plg.Cells(i, 1)
tab1(i, 1) = WorksheetFunction.Rank(tab1(i, 0), plg)
Next i
plg.Resize(, 2).Value = tab1
End SubTes valeurs étant déjà dans une plage, on affecte la plage à une variable Range, on peut construire le tableau résultat (à 2 colonnes) avec les valeurs en 1re colonne et le rang calculé avec la fonction Excel en 2e colonne.
Pour vérification je réaffecte le tableau sur la feuille, mais tu peux t'en dispenser et au contraire effacer... Il te faut cependant soit poursuivre selon l'utilisation prévue pour ce tableau résultat dans la même procédure car les variables étant locales elles disparaîtront en fin de celle-ci, soit déclarer ton tableau résultat au niveau module pour le conserver et pouvoir le réutiliser par la suite.
Cordialement.
@MFerrand : merci pour ton complément d'infos très intéressant ! pour moi non plus, c'était pas clair de pouvoir utiliser ou non un tableau hors plage.
dhany
@MFerrand
Merci de ton retour!
Tes valeurs étant déjà dans une plage, on affecte la plage à une variable Range, on peut construire le tableau résultat (à 2 colonnes) avec les valeurs en 1re colonne et le rang calculé avec la fonction Excel en 2e colonne.
Justement mon exemple prête à confusion car la plage affichée est seulement une visualisation d'une colonne de mon tableau, mais n'a pas vocation à être affichée.
Enfin quoiqu'il en soit tu as répondu à ma question, je n'avais effectivement pas compris que la fonction Rang ne permettait pas une lecture dans un tableau directement.
J'ai résolu mon problème en écrivant la plage, puis en l'effaçant une fois mon calcul de rang terminé.
Cordialement,
CookIslander