OVH Cloud OVH Cloud

manque un Index/Equiv à mon code VBA ?

5 réponses
Avatar
Pat rednef
Bonjour à vous les fameux contributeurs..

Voilà en qqs mots mon petit problème:
J'ai une feuille avec plusieurs colonnes en A le code client en B le nom en
C la ville et à Partir de D 3 colonnes avec 3 CA différents par client
(suivant le réseau de distribution).

Je souhaite finaliser mon code, ce code sert à afficher dans une msgbox une
liste de X clients classés par ordre décroissant de CA

Je peux choisir la colonne en selectionnant la première cellule (ce qui
permet de choisir le réseau) et ensuite je saisi le nombre des X premiers que
je souhaite voir (par exemple 10 pour le top 10)

Voici mon code:
Sub ChercherlesXPremiersCA()

Dim Plg As Range, MABOx, Nbb As Double

Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)

Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

For i = 1 To Nbb
result = Application.WorksheetFunction.Large(Range(Plg.Address,
Range(Plg.Address).End(xlDown)(0)), i)
MABOx = MABOx & "result" & i & vbTab & Format(result, "# ###,00") & vbNewLine
Next

MsgBox MABOx

End Sub

Comment remplacer "result" & i dans ma boite de dialogue par le nom du
client concerné qui se trouve en colonne B ???
Je ne trouve pas, manque t'il un Index/Equiv ou plus simple lors du calcul
de Large ?

Je vous remercie d'avance pour cette précieuse aide

Question Numéro 2 , j'ai en colonne J sur cette même feuille un code secteur
qui représente le délégué en charge du client (code secteur 120 à 129) peut
on faire la même chose avec en plus un choix du secteur, en sachant que je ne
souhaite rien écrire dans le fichier Excel, juste faire des calculs VBA et
afficher une boite de dialogue avec les résultats.
Peut on afficher les X premiers clients du secteur 122 ??????

Bien à vous tous,
Au plaisir de vous lire et d'échanger

Pat rednef

5 réponses

Avatar
Quetzalcoatl
Bonsoir,

1/ La fonction EQUIV peut être utilisée ici (son équivalent anglais VBA :
Application.WorksheetFunction.Match).

Dim Mon_Tableau As Variant
Dim CA_Range As Range
Dim CA As Variant
Mon_Tableau = ActiveSheet.UsedRange.Value ' tu retrouves dans Mon_Tableau
toute la partie utile de ta feuille EXCEL
Set CA_Range = Range(Plg.Address, Range(Plg.Address).End(xlDown)(1))
' note le 1 à la place du 0, sinon, tu ne tiens pas compte de la dernière
valeur de ton tableau
' ou bien
Set CA_Range = Intersect(ActiveSheet.UsedRange,
Range(Plg.Address).EntireColumn)
CA = CA_Range.Value ' tu retrouves dans CA toute la partie utile de la
colonne Chiffre d'Affaire que tu as sélectionnée

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
MABOx = MABOx & Mon_Tableau(Application.WorksheetFunction.Match(Result,
CA, 0), 2) & vbTab & Format(result, "# ###,00") & vbNewLine
' le 2 représente la 2ème colonne de Mon_Tableau, soit la colonne des
noms de client et EQUIV donne la ligne
Next

La fonction EQUIV présente cependant un inconvénient, c'est qu'elle ne
permettra pas de gérer le cas où on a le même chiffre d'affaire pour
plusieurs clients.
Pour gérer ce cas, on peut utiliser la fonction RANG (son équivalent anglais
VBA : Application.WorksheetFunction.Rank), qui présente l'avantage de
prendre en compte les ex-aequo en attribuant le même rang aux nombres en
double :

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
: on affiche tous les clients concernés
For j = LBound(CA) To UBound(CA)
If CA(j, 1) = Result Then MABOx = MABOx & Mon_Tableau(j, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
End If
Next

2/ Pour afficher les X premiers clients du secteur Y, pourquoi pas demander
la saisie du paramètre Y, puis utiliser la fonction filtrage automatique ?

ActiveSheet.Range("A1").AutoFilter field:=9, Criteria1:= Y ' 9 = colonne
J

ActiveSheet.AutoFilterMode = False

A+


"Pat rednef" a écrit dans le message
de news:
Bonjour à vous les fameux contributeurs..

Voilà en qqs mots mon petit problème:
J'ai une feuille avec plusieurs colonnes en A le code client en B le nom
en
C la ville et à Partir de D 3 colonnes avec 3 CA différents par client
(suivant le réseau de distribution).

Je souhaite finaliser mon code, ce code sert à afficher dans une msgbox
une
liste de X clients classés par ordre décroissant de CA

Je peux choisir la colonne en selectionnant la première cellule (ce qui
permet de choisir le réseau) et ensuite je saisi le nombre des X premiers
que
je souhaite voir (par exemple 10 pour le top 10)

Voici mon code:
Sub ChercherlesXPremiersCA()

Dim Plg As Range, MABOx, Nbb As Double

Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)

Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

For i = 1 To Nbb
result = Application.WorksheetFunction.Large(Range(Plg.Address,
Range(Plg.Address).End(xlDown)(0)), i)
MABOx = MABOx & "result" & i & vbTab & Format(result, "# ###,00") &
vbNewLine
Next

MsgBox MABOx

End Sub

Comment remplacer "result" & i dans ma boite de dialogue par le nom du
client concerné qui se trouve en colonne B ???
Je ne trouve pas, manque t'il un Index/Equiv ou plus simple lors du calcul
de Large ?

Je vous remercie d'avance pour cette précieuse aide

Question Numéro 2 , j'ai en colonne J sur cette même feuille un code
secteur
qui représente le délégué en charge du client (code secteur 120 à 129)
peut
on faire la même chose avec en plus un choix du secteur, en sachant que je
ne
souhaite rien écrire dans le fichier Excel, juste faire des calculs VBA et
afficher une boite de dialogue avec les résultats.
Peut on afficher les X premiers clients du secteur 122 ??????

Bien à vous tous,
Au plaisir de vous lire et d'échanger

Pat rednef





Avatar
Pat rednef
Bonjour et tout d'abord un grand merci cette solution est bien commentée et
en plus elle fonctionne parfaitement

Une question complémentaire, je suis d'accord avec le filtre sur la plage
mais je pense me souvenir qu'il faut alors utiliser un "quelquechose.visible"
pour les cellules, sinon il continue à faire les X plus gros CA sans tenir
compte du filtre ???

Comment alors finaliser ce joli code en incluant une demande de secteur +
l'application de ce code sur la zone filtrée ???

Je te remerci vivement, ta première réponse m'a permi en plus de comprendre
le code, pas simplement d'obtenir la solution

Bravo pour cette pédagogie !

Bien sincèrement

Pat

Ps: y a t'il moyen de le raccourcir sensiblement ce bout de code ou non ?


Bonsoir,

1/ La fonction EQUIV peut être utilisée ici (son équivalent anglais VBA :
Application.WorksheetFunction.Match).

Dim Mon_Tableau As Variant
Dim CA_Range As Range
Dim CA As Variant
Mon_Tableau = ActiveSheet.UsedRange.Value ' tu retrouves dans Mon_Tableau
toute la partie utile de ta feuille EXCEL
Set CA_Range = Range(Plg.Address, Range(Plg.Address).End(xlDown)(1))
' note le 1 à la place du 0, sinon, tu ne tiens pas compte de la dernière
valeur de ton tableau
' ou bien
Set CA_Range = Intersect(ActiveSheet.UsedRange,
Range(Plg.Address).EntireColumn)
CA = CA_Range.Value ' tu retrouves dans CA toute la partie utile de la
colonne Chiffre d'Affaire que tu as sélectionnée

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
MABOx = MABOx & Mon_Tableau(Application.WorksheetFunction.Match(Result,
CA, 0), 2) & vbTab & Format(result, "# ###,00") & vbNewLine
' le 2 représente la 2ème colonne de Mon_Tableau, soit la colonne des
noms de client et EQUIV donne la ligne
Next

La fonction EQUIV présente cependant un inconvénient, c'est qu'elle ne
permettra pas de gérer le cas où on a le même chiffre d'affaire pour
plusieurs clients.
Pour gérer ce cas, on peut utiliser la fonction RANG (son équivalent anglais
VBA : Application.WorksheetFunction.Rank), qui présente l'avantage de
prendre en compte les ex-aequo en attribuant le même rang aux nombres en
double :

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
: on affiche tous les clients concernés
For j = LBound(CA) To UBound(CA)
If CA(j, 1) = Result Then MABOx = MABOx & Mon_Tableau(j, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
End If
Next

2/ Pour afficher les X premiers clients du secteur Y, pourquoi pas demander
la saisie du paramètre Y, puis utiliser la fonction filtrage automatique ?

ActiveSheet.Range("A1").AutoFilter field:=9, Criteria1:= Y ' 9 = colonne
J

ActiveSheet.AutoFilterMode = False

A+


"Pat rednef" a écrit dans le message
de news:
Bonjour à vous les fameux contributeurs..

Voilà en qqs mots mon petit problème:
J'ai une feuille avec plusieurs colonnes en A le code client en B le nom
en
C la ville et à Partir de D 3 colonnes avec 3 CA différents par client
(suivant le réseau de distribution).

Je souhaite finaliser mon code, ce code sert à afficher dans une msgbox
une
liste de X clients classés par ordre décroissant de CA

Je peux choisir la colonne en selectionnant la première cellule (ce qui
permet de choisir le réseau) et ensuite je saisi le nombre des X premiers
que
je souhaite voir (par exemple 10 pour le top 10)

Voici mon code:
Sub ChercherlesXPremiersCA()

Dim Plg As Range, MABOx, Nbb As Double

Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)

Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

For i = 1 To Nbb
result = Application.WorksheetFunction.Large(Range(Plg.Address,
Range(Plg.Address).End(xlDown)(0)), i)
MABOx = MABOx & "result" & i & vbTab & Format(result, "# ###,00") &
vbNewLine
Next

MsgBox MABOx

End Sub

Comment remplacer "result" & i dans ma boite de dialogue par le nom du
client concerné qui se trouve en colonne B ???
Je ne trouve pas, manque t'il un Index/Equiv ou plus simple lors du calcul
de Large ?

Je vous remercie d'avance pour cette précieuse aide

Question Numéro 2 , j'ai en colonne J sur cette même feuille un code
secteur
qui représente le délégué en charge du client (code secteur 120 à 129)
peut
on faire la même chose avec en plus un choix du secteur, en sachant que je
ne
souhaite rien écrire dans le fichier Excel, juste faire des calculs VBA et
afficher une boite de dialogue avec les résultats.
Peut on afficher les X premiers clients du secteur 122 ??????

Bien à vous tous,
Au plaisir de vous lire et d'échanger

Pat rednef










Avatar
Quetzalcoatl
Bonsoir,

1/ Erratum
Le code suivant gère correctement les ex-aequo (les ex_aequo comptent pour
1)
i = 1
While i <= Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
: on affiche tous les clients concernés
For j = LBound(CA) To UBound(CA)
If CA(j, 1) = Result Then MABOx = MABOx & Mon_Tableau(j, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
Else
Nbb = Nbb + 1
End If
i = i + 1
Wend

2/ Filtrage et 1ère simplification du code
- Dans la suite, je fais l'hypothèse qu'il y a une ligne de titre.
- On n'est pas obligé de passer par des tableaux.

Dim Plg As Range, MABOx, Nbb As Double
Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)
Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

Dim CA_Range As Range
Dim i, Result, Rang, cel

ActiveSheet.Range("A1").AutoFilter field:, Criteria1:="121" ' active
le filtre : 10 = colonne J, exemple donné avec code 121
Set CA_Range Intersect(ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible),
Range(Plg.Address).EntireColumn) ' valeurs visibles seulement

i = 1
While i <= Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
: on affiche tous les clients concernés
For Each cel In CA_Range
If cel.Value = Result Then _
MABOx = MABOx & ActiveSheet.UsedRange.Item(cel.Row, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
Else
Nbb = Nbb + 1
End If
i = i + 1
Wend

ActiveSheet.AutoFilterMode = False ' désactive le filtre
MsgBox MABOx

Nous dire.
A+


"Pat rednef" a écrit dans le message
de news:
Bonjour et tout d'abord un grand merci cette solution est bien commentée
et
en plus elle fonctionne parfaitement

Une question complémentaire, je suis d'accord avec le filtre sur la plage
mais je pense me souvenir qu'il faut alors utiliser un
"quelquechose.visible"
pour les cellules, sinon il continue à faire les X plus gros CA sans tenir
compte du filtre ???

Comment alors finaliser ce joli code en incluant une demande de secteur +
l'application de ce code sur la zone filtrée ???

Je te remerci vivement, ta première réponse m'a permi en plus de
comprendre
le code, pas simplement d'obtenir la solution

Bravo pour cette pédagogie !

Bien sincèrement

Pat

Ps: y a t'il moyen de le raccourcir sensiblement ce bout de code ou non ?


Bonsoir,

1/ La fonction EQUIV peut être utilisée ici (son équivalent anglais VBA :
Application.WorksheetFunction.Match).

Dim Mon_Tableau As Variant
Dim CA_Range As Range
Dim CA As Variant
Mon_Tableau = ActiveSheet.UsedRange.Value ' tu retrouves dans
Mon_Tableau
toute la partie utile de ta feuille EXCEL
Set CA_Range = Range(Plg.Address, Range(Plg.Address).End(xlDown)(1))
' note le 1 à la place du 0, sinon, tu ne tiens pas compte de la dernière
valeur de ton tableau
' ou bien
Set CA_Range = Intersect(ActiveSheet.UsedRange,
Range(Plg.Address).EntireColumn)
CA = CA_Range.Value ' tu retrouves dans CA toute la partie utile de la
colonne Chiffre d'Affaire que tu as sélectionnée

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
MABOx = MABOx &
Mon_Tableau(Application.WorksheetFunction.Match(Result,
CA, 0), 2) & vbTab & Format(result, "# ###,00") & vbNewLine
' le 2 représente la 2ème colonne de Mon_Tableau, soit la colonne des
noms de client et EQUIV donne la ligne
Next

La fonction EQUIV présente cependant un inconvénient, c'est qu'elle ne
permettra pas de gérer le cas où on a le même chiffre d'affaire pour
plusieurs clients.
Pour gérer ce cas, on peut utiliser la fonction RANG (son équivalent
anglais
VBA : Application.WorksheetFunction.Rank), qui présente l'avantage de
prendre en compte les ex-aequo en attribuant le même rang aux nombres en
double :

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste
d'ex-aequo
: on affiche tous les clients concernés
For j = LBound(CA) To UBound(CA)
If CA(j, 1) = Result Then MABOx = MABOx & Mon_Tableau(j, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
End If
Next

2/ Pour afficher les X premiers clients du secteur Y, pourquoi pas
demander
la saisie du paramètre Y, puis utiliser la fonction filtrage automatique
?

ActiveSheet.Range("A1").AutoFilter field:=9, Criteria1:= Y ' 9 =
colonne
J

ActiveSheet.AutoFilterMode = False

A+


"Pat rednef" a écrit dans le
message
de news:
Bonjour à vous les fameux contributeurs..

Voilà en qqs mots mon petit problème:
J'ai une feuille avec plusieurs colonnes en A le code client en B le
nom
en
C la ville et à Partir de D 3 colonnes avec 3 CA différents par client
(suivant le réseau de distribution).

Je souhaite finaliser mon code, ce code sert à afficher dans une msgbox
une
liste de X clients classés par ordre décroissant de CA

Je peux choisir la colonne en selectionnant la première cellule (ce qui
permet de choisir le réseau) et ensuite je saisi le nombre des X
premiers
que
je souhaite voir (par exemple 10 pour le top 10)

Voici mon code:
Sub ChercherlesXPremiersCA()

Dim Plg As Range, MABOx, Nbb As Double

Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)

Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

For i = 1 To Nbb
result = Application.WorksheetFunction.Large(Range(Plg.Address,
Range(Plg.Address).End(xlDown)(0)), i)
MABOx = MABOx & "result" & i & vbTab & Format(result, "# ###,00") &
vbNewLine
Next

MsgBox MABOx

End Sub

Comment remplacer "result" & i dans ma boite de dialogue par le nom du
client concerné qui se trouve en colonne B ???
Je ne trouve pas, manque t'il un Index/Equiv ou plus simple lors du
calcul
de Large ?

Je vous remercie d'avance pour cette précieuse aide

Question Numéro 2 , j'ai en colonne J sur cette même feuille un code
secteur
qui représente le délégué en charge du client (code secteur 120 à 129)
peut
on faire la même chose avec en plus un choix du secteur, en sachant que
je
ne
souhaite rien écrire dans le fichier Excel, juste faire des calculs VBA
et
afficher une boite de dialogue avec les résultats.
Peut on afficher les X premiers clients du secteur 122 ??????

Bien à vous tous,
Au plaisir de vous lire et d'échanger

Pat rednef












Avatar
Pat rednef
Bonsoir,

Désolé mais j'étais en congés pendant ces 2 jours et donc pas d'internet
En tout cas merci à nouveau pour cette réponse
Je viens de prendre connaissance de votre deuxième code, je vais l'essayer
ce soir et bien sur revenir vers vous pour commenter,
a première lecture cela me parait OK
Je plonge ce soir dans le dur
D'avance merci pour votre aide précieuse, c'est extrememnt bien documenté ce
qui permet de comprendre et donc de moins venir sur le forum, voir de pouvoir
partager et aider les autres,

A tout à l'heure

pat


Bonsoir,

1/ Erratum
Le code suivant gère correctement les ex-aequo (les ex_aequo comptent pour
1)
i = 1
While i <= Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
: on affiche tous les clients concernés
For j = LBound(CA) To UBound(CA)
If CA(j, 1) = Result Then MABOx = MABOx & Mon_Tableau(j, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
Else
Nbb = Nbb + 1
End If
i = i + 1
Wend

2/ Filtrage et 1ère simplification du code
- Dans la suite, je fais l'hypothèse qu'il y a une ligne de titre.
- On n'est pas obligé de passer par des tableaux.

Dim Plg As Range, MABOx, Nbb As Double
Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)
Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

Dim CA_Range As Range
Dim i, Result, Rang, cel

ActiveSheet.Range("A1").AutoFilter field:, Criteria1:="121" ' active
le filtre : 10 = colonne J, exemple donné avec code 121
Set CA_Range > Intersect(ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible),
Range(Plg.Address).EntireColumn) ' valeurs visibles seulement

i = 1
While i <= Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
: on affiche tous les clients concernés
For Each cel In CA_Range
If cel.Value = Result Then _
MABOx = MABOx & ActiveSheet.UsedRange.Item(cel.Row, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
Else
Nbb = Nbb + 1
End If
i = i + 1
Wend

ActiveSheet.AutoFilterMode = False ' désactive le filtre
MsgBox MABOx

Nous dire.
A+


"Pat rednef" a écrit dans le message
de news:
Bonjour et tout d'abord un grand merci cette solution est bien commentée
et
en plus elle fonctionne parfaitement

Une question complémentaire, je suis d'accord avec le filtre sur la plage
mais je pense me souvenir qu'il faut alors utiliser un
"quelquechose.visible"
pour les cellules, sinon il continue à faire les X plus gros CA sans tenir
compte du filtre ???

Comment alors finaliser ce joli code en incluant une demande de secteur +
l'application de ce code sur la zone filtrée ???

Je te remerci vivement, ta première réponse m'a permi en plus de
comprendre
le code, pas simplement d'obtenir la solution

Bravo pour cette pédagogie !

Bien sincèrement

Pat

Ps: y a t'il moyen de le raccourcir sensiblement ce bout de code ou non ?


Bonsoir,

1/ La fonction EQUIV peut être utilisée ici (son équivalent anglais VBA :
Application.WorksheetFunction.Match).

Dim Mon_Tableau As Variant
Dim CA_Range As Range
Dim CA As Variant
Mon_Tableau = ActiveSheet.UsedRange.Value ' tu retrouves dans
Mon_Tableau
toute la partie utile de ta feuille EXCEL
Set CA_Range = Range(Plg.Address, Range(Plg.Address).End(xlDown)(1))
' note le 1 à la place du 0, sinon, tu ne tiens pas compte de la dernière
valeur de ton tableau
' ou bien
Set CA_Range = Intersect(ActiveSheet.UsedRange,
Range(Plg.Address).EntireColumn)
CA = CA_Range.Value ' tu retrouves dans CA toute la partie utile de la
colonne Chiffre d'Affaire que tu as sélectionnée

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
MABOx = MABOx &
Mon_Tableau(Application.WorksheetFunction.Match(Result,
CA, 0), 2) & vbTab & Format(result, "# ###,00") & vbNewLine
' le 2 représente la 2ème colonne de Mon_Tableau, soit la colonne des
noms de client et EQUIV donne la ligne
Next

La fonction EQUIV présente cependant un inconvénient, c'est qu'elle ne
permettra pas de gérer le cas où on a le même chiffre d'affaire pour
plusieurs clients.
Pour gérer ce cas, on peut utiliser la fonction RANG (son équivalent
anglais
VBA : Application.WorksheetFunction.Rank), qui présente l'avantage de
prendre en compte les ex-aequo en attribuant le même rang aux nombres en
double :

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste
d'ex-aequo
: on affiche tous les clients concernés
For j = LBound(CA) To UBound(CA)
If CA(j, 1) = Result Then MABOx = MABOx & Mon_Tableau(j, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
End If
Next

2/ Pour afficher les X premiers clients du secteur Y, pourquoi pas
demander
la saisie du paramètre Y, puis utiliser la fonction filtrage automatique
?

ActiveSheet.Range("A1").AutoFilter field:=9, Criteria1:= Y ' 9 =
colonne
J

ActiveSheet.AutoFilterMode = False

A+


"Pat rednef" a écrit dans le
message
de news:
Bonjour à vous les fameux contributeurs..

Voilà en qqs mots mon petit problème:
J'ai une feuille avec plusieurs colonnes en A le code client en B le
nom
en
C la ville et à Partir de D 3 colonnes avec 3 CA différents par client
(suivant le réseau de distribution).

Je souhaite finaliser mon code, ce code sert à afficher dans une msgbox
une
liste de X clients classés par ordre décroissant de CA

Je peux choisir la colonne en selectionnant la première cellule (ce qui
permet de choisir le réseau) et ensuite je saisi le nombre des X
premiers
que
je souhaite voir (par exemple 10 pour le top 10)

Voici mon code:
Sub ChercherlesXPremiersCA()

Dim Plg As Range, MABOx, Nbb As Double

Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)

Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

For i = 1 To Nbb
result = Application.WorksheetFunction.Large(Range(Plg.Address,
Range(Plg.Address).End(xlDown)(0)), i)
MABOx = MABOx & "result" & i & vbTab & Format(result, "# ###,00") &
vbNewLine
Next

MsgBox MABOx

End Sub

Comment remplacer "result" & i dans ma boite de dialogue par le nom du
client concerné qui se trouve en colonne B ???
Je ne trouve pas, manque t'il un Index/Equiv ou plus simple lors du
calcul
de Large ?

Je vous remercie d'avance pour cette précieuse aide

Question Numéro 2 , j'ai en colonne J sur cette même feuille un code
secteur
qui représente le délégué en charge du client (code secteur 120 à 129)
peut
on faire la même chose avec en plus un choix du secteur, en sachant que
je
ne
souhaite rien écrire dans le fichier Excel, juste faire des calculs VBA
et
afficher une boite de dialogue avec les résultats.
Peut on afficher les X premiers clients du secteur 122 ??????

Bien à vous tous,
Au plaisir de vous lire et d'échanger

Pat rednef

















Avatar
Pat rednef
Re bonjour,

Après quelques petites modifications voici le code final:
Dim Plg As Range, MABOx, Nbb As Double, Secteur$
Dim CA_Range As Range
Dim i, Result, Rang, cel

Set Plg = Application.InputBox("Analyse des Ca de quelle division ???", _
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)

Nbb = Application.InputBox("Top x des CA", , , , , , , 1)
Secteur = Application.InputBox("Sur quel secteur ?" & vbNewLine & _
vbNewLine & "Pour voir le classement France sasir 0 (zéro)", "Choix d'un
secteur", , , , , , 1)
If Secteur <> 0 Then
ActiveSheet.Range("A1").AutoFilter Field:=6, Criteria1:=Secteur
Else
Secteur = "France"
ActiveSheet.Range("A1").AutoFilter Field:=6
End If

'ActiveSheet.Range("A1").AutoFilter Field:=6, Criteria1:=Secteur ' active
'le filtre : 10 = colonne J, exemple donné avec code 121
'Set CA_Range = Range(Plg.Address, Range(Plg.Address).End(xlDown)(1))

Set CA_Range =
Intersect(ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible), _
Range(Plg.Address, Range(Plg.Address).End(xlDown)(1))) ' valeurs visibles
seulement

i = 1
While i <= Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
': on affiche tous les clients concernés
For Each cel In CA_Range
If cel.Value = Result Then
MABOx = MABOx & i & vbTab &
ActiveSheet.UsedRange.Item(cel.Row, 2) & _
vbTab & Format(Result, "# ###,00") & vbNewLine

Else
End If
Next
End If

i = i + 1
Wend

ActiveSheet.AutoFilterMode = False ' désactive le filtre


Y = MsgBox(MABOx, , "Top " & Nbb & " des clients du secteur " & Secteur)


End Sub

J'ai changé la colonne des secteurs de place + faire saisir le code secteur
C'est parfait
Merci de m'avoir expliqué
Au plaisir de te revoir ici

Un grand merci
Pat


Bonsoir,

1/ Erratum
Le code suivant gère correctement les ex-aequo (les ex_aequo comptent pour
1)
i = 1
While i <= Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
: on affiche tous les clients concernés
For j = LBound(CA) To UBound(CA)
If CA(j, 1) = Result Then MABOx = MABOx & Mon_Tableau(j, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
Else
Nbb = Nbb + 1
End If
i = i + 1
Wend

2/ Filtrage et 1ère simplification du code
- Dans la suite, je fais l'hypothèse qu'il y a une ligne de titre.
- On n'est pas obligé de passer par des tableaux.

Dim Plg As Range, MABOx, Nbb As Double
Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)
Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

Dim CA_Range As Range
Dim i, Result, Rang, cel

ActiveSheet.Range("A1").AutoFilter field:, Criteria1:="121" ' active
le filtre : 10 = colonne J, exemple donné avec code 121
Set CA_Range > Intersect(ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible),
Range(Plg.Address).EntireColumn) ' valeurs visibles seulement

i = 1
While i <= Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste d'ex-aequo
: on affiche tous les clients concernés
For Each cel In CA_Range
If cel.Value = Result Then _
MABOx = MABOx & ActiveSheet.UsedRange.Item(cel.Row, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
Else
Nbb = Nbb + 1
End If
i = i + 1
Wend

ActiveSheet.AutoFilterMode = False ' désactive le filtre
MsgBox MABOx

Nous dire.
A+


"Pat rednef" a écrit dans le message
de news:
Bonjour et tout d'abord un grand merci cette solution est bien commentée
et
en plus elle fonctionne parfaitement

Une question complémentaire, je suis d'accord avec le filtre sur la plage
mais je pense me souvenir qu'il faut alors utiliser un
"quelquechose.visible"
pour les cellules, sinon il continue à faire les X plus gros CA sans tenir
compte du filtre ???

Comment alors finaliser ce joli code en incluant une demande de secteur +
l'application de ce code sur la zone filtrée ???

Je te remerci vivement, ta première réponse m'a permi en plus de
comprendre
le code, pas simplement d'obtenir la solution

Bravo pour cette pédagogie !

Bien sincèrement

Pat

Ps: y a t'il moyen de le raccourcir sensiblement ce bout de code ou non ?


Bonsoir,

1/ La fonction EQUIV peut être utilisée ici (son équivalent anglais VBA :
Application.WorksheetFunction.Match).

Dim Mon_Tableau As Variant
Dim CA_Range As Range
Dim CA As Variant
Mon_Tableau = ActiveSheet.UsedRange.Value ' tu retrouves dans
Mon_Tableau
toute la partie utile de ta feuille EXCEL
Set CA_Range = Range(Plg.Address, Range(Plg.Address).End(xlDown)(1))
' note le 1 à la place du 0, sinon, tu ne tiens pas compte de la dernière
valeur de ton tableau
' ou bien
Set CA_Range = Intersect(ActiveSheet.UsedRange,
Range(Plg.Address).EntireColumn)
CA = CA_Range.Value ' tu retrouves dans CA toute la partie utile de la
colonne Chiffre d'Affaire que tu as sélectionnée

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
MABOx = MABOx &
Mon_Tableau(Application.WorksheetFunction.Match(Result,
CA, 0), 2) & vbTab & Format(result, "# ###,00") & vbNewLine
' le 2 représente la 2ème colonne de Mon_Tableau, soit la colonne des
noms de client et EQUIV donne la ligne
Next

La fonction EQUIV présente cependant un inconvénient, c'est qu'elle ne
permettra pas de gérer le cas où on a le même chiffre d'affaire pour
plusieurs clients.
Pour gérer ce cas, on peut utiliser la fonction RANG (son équivalent
anglais
VBA : Application.WorksheetFunction.Rank), qui présente l'avantage de
prendre en compte les ex-aequo en attribuant le même rang aux nombres en
double :

For i = 1 To Nbb
Result = Application.WorksheetFunction.Large(CA_Range, i)
Rang = Application.WorksheetFunction.Rank(Result, CA_Range)
If Rang = i Then ' pas d'ex-aequo ou bien 1er d'une liste
d'ex-aequo
: on affiche tous les clients concernés
For j = LBound(CA) To UBound(CA)
If CA(j, 1) = Result Then MABOx = MABOx & Mon_Tableau(j, 2) &
vbTab & Format(Result, "# ###,00") & vbNewLine
Next
End If
Next

2/ Pour afficher les X premiers clients du secteur Y, pourquoi pas
demander
la saisie du paramètre Y, puis utiliser la fonction filtrage automatique
?

ActiveSheet.Range("A1").AutoFilter field:=9, Criteria1:= Y ' 9 =
colonne
J

ActiveSheet.AutoFilterMode = False

A+


"Pat rednef" a écrit dans le
message
de news:
Bonjour à vous les fameux contributeurs..

Voilà en qqs mots mon petit problème:
J'ai une feuille avec plusieurs colonnes en A le code client en B le
nom
en
C la ville et à Partir de D 3 colonnes avec 3 CA différents par client
(suivant le réseau de distribution).

Je souhaite finaliser mon code, ce code sert à afficher dans une msgbox
une
liste de X clients classés par ordre décroissant de CA

Je peux choisir la colonne en selectionnant la première cellule (ce qui
permet de choisir le réseau) et ensuite je saisi le nombre des X
premiers
que
je souhaite voir (par exemple 10 pour le top 10)

Voici mon code:
Sub ChercherlesXPremiersCA()

Dim Plg As Range, MABOx, Nbb As Double

Set Plg = Application.InputBox("Analyse des Ca de quelle division ???",
"Cliquer sur la première cellule de la colonne concernée", , , , , , 8)

Nbb = Application.InputBox("Top x des CA", , , , , , , 1)

For i = 1 To Nbb
result = Application.WorksheetFunction.Large(Range(Plg.Address,
Range(Plg.Address).End(xlDown)(0)), i)
MABOx = MABOx & "result" & i & vbTab & Format(result, "# ###,00") &
vbNewLine
Next

MsgBox MABOx

End Sub

Comment remplacer "result" & i dans ma boite de dialogue par le nom du
client concerné qui se trouve en colonne B ???
Je ne trouve pas, manque t'il un Index/Equiv ou plus simple lors du
calcul
de Large ?

Je vous remercie d'avance pour cette précieuse aide

Question Numéro 2 , j'ai en colonne J sur cette même feuille un code
secteur
qui représente le délégué en charge du client (code secteur 120 à 129)
peut
on faire la même chose avec en plus un choix du secteur, en sachant que
je
ne
souhaite rien écrire dans le fichier Excel, juste faire des calculs VBA
et
afficher une boite de dialogue avec les résultats.
Peut on afficher les X premiers clients du secteur 122 ??????

Bien à vous tous,
Au plaisir de vous lire et d'échanger

Pat rednef