Création formule Rang en macro
Bonjour à tous,
Je vous joint la pièce jointe dans le message ^^
J'ai pour projet de faire dans la colonne A une colonne rang qui me donnerait l'ordre des actions avec le pourcentage le plus élevé,
J'ai créer 3 boutons sur le coté et j'aimerai en faite qu'en cliquant sur l'un des 3 boutons que celà me donne le rang sur la colonne A
Est-ce que c'est réalisable ? Merci d'avance !
Bonjour Clemdu08, le forum,
J'ai pour projet de faire dans la colonne A une colonne rang qui me donnerait l'ordre des actions avec le pourcentage le plus élevé
A tester:
Option Explicit
Dim i As Integer, dl As Integer
Dim plage As Range
Sub Tri3jours()
Application.ScreenUpdating = False '..........................................................désactive le rafraichissement de l'écran
With Sheets("Feuil1") '......................................................................agit "Feuil1"
dl = .Range("J" & Rows.Count).End(xlUp).Row '..............................................dernière ligne de la colonne J (à adapter)
Set plage = .Range("G2:G" & dl) '..........................................................plage de recherche
For i = 2 To dl '.........................................................................boucle de la ligne 2 à la dernière
.Range("A" & i).Value = Application.WorksheetFunction.Rank(.Range("G" & i), plage, 0) '..fonction rang colonne G
Next i '..................................................................................ligne suivante
End With
End Sub
Sub Tri15jours()
Application.ScreenUpdating = False '..........................................................désactive le rafraichissement de l'écran
With Sheets("Feuil1") '......................................................................agit "Feuil1"
dl = .Range("J" & Rows.Count).End(xlUp).Row '..............................................dernière ligne de la colonne J (à adapter)
Set plage = .Range("H2:H" & dl) '..........................................................plage de recherche
For i = 2 To dl '.........................................................................boucle de la ligne 2 à la dernière
.Range("A" & i).Value = Application.WorksheetFunction.Rank(.Range("H" & i), plage, 0) '..fonction rang colonne H
Next i '..................................................................................ligne suivante
End With
End Sub
Sub Tri30jours()
Application.ScreenUpdating = False '..........................................................désactive le rafraichissement de l'écran
With Sheets("Feuil1") '......................................................................agit "Feuil1"
dl = .Range("J" & Rows.Count).End(xlUp).Row '..............................................dernière ligne de la colonne J (à adapter)
Set plage = .Range("I2:I" & dl) '..........................................................plage de recherche
For i = 2 To dl '.........................................................................boucle de la ligne 2 à la dernière
.Range("A" & i).Value = Application.WorksheetFunction.Rank(.Range("I" & i), plage, 0) '..fonction rang colonne I
Next i '..................................................................................ligne suivante
End With
End Sub
Cordialement,
Merci beaucoup je vais tester tout ca ^^
Sub Tri3jours()
Application.ScreenUpdating = False '
With Sheets("Feuil1") '
dl = .Range("J16" & Rows.Count).End(xlUp).Row '
Set plage = .Range("G2:G16" & dl) '
For i = 2 To dl '
Range("A" & i).Value = Application.WorksheetFunction.Rank(Range("G" & i), plage, 0) '
Next i '
End With
End Sub
Si j'utilise cette formule comme ca, celà ne fonctionne pas, la colonne A ne se met pas en ordre par rapport "au 3 derniers jours"
Est-ce que c'est possible d'ordonner les actions du plus performant en haut en décroissant ? C'est à dire d'avoir le 1er plus performant ensuite le deuxième et que la page se "range toute seule ?
Re,
As-tu tester le fichier que je t'ai joint ?
Obtiens-tu le résultat souhaité ?
Sub Tri3jours()
Application.ScreenUpdating = False '..........................................................désactive le rafraichissement de l'écran
With Sheets("Feuil1") '......................................................................agit "Feuil1"
dl = .Range("J" & Rows.Count).End(xlUp).Row '..............................................dernière ligne de la colonne J (à adapter)
Set plage = .Range("G2:G" & dl) '..........................................................plage de recherche
For i = 2 To dl '.........................................................................boucle de la ligne 2 à la dernière
.Range("A" & i).Value = Application.WorksheetFunction.Rank(.Range("G" & i), plage, 0) '..fonction rang colonne G
Next i '..................................................................................ligne suivante
.Range("A1").CurrentRegion.Sort key1:=Range("G1"), order1:=xlDescending '................tri colonne G ordre decroissant
End With
End SubPour inversé l'ordre du rang, remplace 0 par 1.
Cordialement,
Bonjour,
Quand je l'adapte sur mon document complet je ne sais pas pourquoi il me met une erreur :/
Pas de cases vides dans les colonnes "% 3derniers jours", "% 15derniers jours" et" % 30derniers jours" ?
dl est-il bien défini ? Dans le code, dl est défini à partir de la colonne J ("%annuel"), est-ce le cas dans ton fichier ?
dl correspond bien à la dernière ligne remplie de ces 4 colonnes ?
Cordialement,
Re,
Nouvel essai en mettant tes données sous forme de tableau structuré.....nommé Tableau1....
Sub Tri3jours()
Application.ScreenUpdating = False '......................................................désactive le rafraichissement de l'écran
With Sheets("Feuil1") '..................................................................agit sur "Feuil1"
.ListObjects("Tableau1").DataBodyRange(1, 1).FormulaR1C1 = _
"=RANK([@[% 3 derniers jours]],[% 3 derniers jours],0)" '................fonction rang dans première cellule/première colonne du tableau
.ListObjects("Tableau1").DataBodyRange(1, 1).AutoFill _
Destination:=Range("Tableau1['#]"), Type:=xlFillDefault '................étire la formule sur toute la colonne
.ListObjects("Tableau1").Range.Sort key1:=Range("Tableau1[% 3 derniers jours]"), _
order1:=xlDescending '...................................................tri ordre decroissant par rapport à la colonne
End With
End SubSub Tri15jours()
Application.ScreenUpdating = False
With Sheets("Feuil1")
.ListObjects("Tableau1").DataBodyRange(1, 1).FormulaR1C1 = _
"=RANK([@[% 15 derniers jours]],[% 15 derniers jours],0)"
.ListObjects("Tableau1").DataBodyRange(1, 1).AutoFill _
Destination:=Range("Tableau1['#]"), Type:=xlFillDefault
.ListObjects("Tableau1").Range.Sort key1:=Range("Tableau1[% 15 derniers jours]"), _
order1:=xlDescending
End With
End SubSub Tri30jours()
Application.ScreenUpdating = False
With Sheets("Feuil1")
.ListObjects("Tableau1").DataBodyRange(1, 1).FormulaR1C1 = _
"=RANK([@[% 30 derniers jours]],[% 30 derniers jours],0)"
.ListObjects("Tableau1").DataBodyRange(1, 1).AutoFill _
Destination:=Range("Tableau1['#]"), Type:=xlFillDefault
.ListObjects("Tableau1").Range.Sort key1:=Range("Tableau1[% 30 derniers jours]"), _
order1:=xlDescending
End With
End Sub
Cordialement,
Bonjour Clemdu08,
Ton tableau se nomme bien "Tableau1" ? L'intitulé des colonnes correspond bien à l'intitulé du code (pas d'espace superflu où manquant) ?
Je crains de ne pouvoir t'aider d'avantage,
Ci-joint un fichier test, dis-moi si ça fonctionne chez toi...
Dans mon fichier test, j'ai mis des données bidon, dans ton fichier réel, il s'agit de formules...
Cordialement,
Bonjour à toi,
J'ai trouvé d'où venait l'erreur, il y a en faite certaine case du tableau qui ne possède pas de chiffres précis mais ce genre de message :
#VALEUR!
#N/A
Tout simplement parce que les données ne sont pas toujours à jour sur les petites actions,
Serait-il possible de rajouter une ligne de code pour que ces messages mettent les actions à la fin tout en bas ?
Je rejoins un doc :
Bonjour Clemdu08,
Peut-être qu'en supprimant ces #VALEUR! et #N/A , cela fonctionnera.
Il te faut modifier tes formules...
=SIERREUR(TaFormule;"")
https://www.excel-pratique.com/fr/fonctions/sierreur
Cordialement,
Merci beaucoup ^^

