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
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
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
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
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" <Patrednef@discussions.microsoft.com> a écrit dans le message
de news: FFE95881-1120-46B1-B51E-3E7315625B45@microsoft.com...
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
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
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
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" <Patrednef@discussions.microsoft.com> a écrit dans le
message
de news: FFE95881-1120-46B1-B51E-3E7315625B45@microsoft.com...
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
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
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
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" <Patrednef@discussions.microsoft.com> a écrit dans le message
de news: 321F095A-50CA-4889-99AC-F6E4B6B9ED5F@microsoft.com...
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" <Patrednef@discussions.microsoft.com> a écrit dans le
message
de news: FFE95881-1120-46B1-B51E-3E7315625B45@microsoft.com...
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
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
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
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" <Patrednef@discussions.microsoft.com> a écrit dans le message
de news: 321F095A-50CA-4889-99AC-F6E4B6B9ED5F@microsoft.com...
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" <Patrednef@discussions.microsoft.com> a écrit dans le
message
de news: FFE95881-1120-46B1-B51E-3E7315625B45@microsoft.com...
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
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