Regrouper les valeurs d'une colonne et faire le total des valeurs d'une autre colonne

pioul

XLDnaute Nouveau
Bonjour à tous,

Voila, j'ai une question toute bête mais je ne trouve pas la solution ....

En fait, je vous explique la situation :

En simplifiant, J'ai 3 colonne , la colonne A qui contient un code , la colonne B qui
contient un montant et la colonne C qui contient une description.

Les codes peuvent évoluer dans le temps

Ma question est la suivante :
Je voudrais, dans une autre feuille ou dans une autre colonne retrouver mes codes de ma colonne A avec à coté la somme des montant de la colonne B qui correspond à ce code.

Je pense que je ne suis pas le seul à avoir eu ce problème mais j'ai chercher sur internet mais j e n'ai pas réussit à trouver une solution ! ( je ne dois pas m'exprimer correctement .... )

J’espère que vous allez pouvoir m'aider cela me ferai gagner énormément de temps.

Merci à tous,

Paul
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Regrouper les valeurs d'une colonne et faire le total des valeurs d'une autre co

Je n'ai plus le message d'erreur mais , ma nouvelle valeur se place dans la derniére ligne de mon tableau ... et efface celle présente précédent.
Dans votre cas particulier peut être: C'est que le nouveau code est inférieur à celui qui était auparavant en dernier.
N'est il pas possible de faire le calcul du nombre de valeur différente dans ma colonne et de mettre ce nombre en variable pour le nombre de ligne de mon tableau ?
S'il fallait réécrire du code qui dimensionne convenablement la formule matricielle, autant passer à une autre solution, mais on perdrait en simplicité. Dans la mesure où cette fonction est validée par la combinaison de touches appuyées simultanément Contrôle, Majuscule et Entrée, il est inutile de lui passer le nombre de lignes à renseigner: celui ci est connu dans la fonction dès que l'instruction
Set PlgA = Application.Caller a été exécutée: c'est l'expression PlgA.Rows.Count. PlgA est la plage matricielle qui appelle une seule fois la fonction.

Par contre j'ai remanié toute la fin de la fonction derrière Loop Until Fini
VB:
Rem. —— Épilogue
If Ls - 1 > PlgA.Rows.Count Then
   MsgBox "Attention: il manque " & Ls - 1 - PlgA.Rows.Count & _
      " ligne(s) pour calculer" & vbLf & "le récapitulatif dans '" & PlgA.Worksheet.Name & "'!" & PlgA.Address, _
      vbExclamation, "Fonction Récap"
   Récap = CVErr(xlErrRef): Exit Function
   End If
While Ls <= UBound(TRés, 1)
   TRés(Ls, 1) = CVErr(xlErrNA)
   For P = 2 To UBound(TSrcS): TRés(Ls, P) = "": Next P
   Ls = Ls + 1: Wend
Récap = TRés
Exit Function
Erreur: MsgBox Err.Description: Stop: Resume
End Function
 

pioul

XLDnaute Nouveau
Re : Regrouper les valeurs d'une colonne et faire le total des valeurs d'une autre co

Merci ...donc si j'ai bien compris le code donne ca : ( ca ne fonctionne pas --> Erreur Do sans boucle ... )

Code:
Option Explicit
'

Function Récap(ByVal PlgK As Range, ParamArray PV() As Variant) As Variant
Dim PlgA As Range, K As Variant, TbIndex() As Long, P As Long, Ls As Long, N As Long, Le As Long, _
   TSrcS() As Variant, Nbr As Long, Fini As Boolean ', TSom() As Double, TRés() As Variant
On Error GoTo Erreur

Rem. —— Indexation
K = PlgK.Value
With New Indexeur: .Init TbIndex, 1, UBound(K, 1): While .Actif: .ASupB = K(.A, 1) > K(.B, 1): Wend: End With


Set PlgA = Application.Caller
ReDim TRés(1 To PlgK.Rows.Count, 1 To PlgA.Columns.Count) As Variant

Rem. —— Paramètres supplémentaires
ReDim TSrcS(2 To UBound(TRés, 2)) As Variant
ReDim TSom(2 To UBound(TRés, 2)) As Double
For P = 0 To UBound(PV)
   Select Case TypeName(PV(P))
      Case "String": TSrcS(P + 2) = "N"
      Case "Range": TSrcS(P + 2) = Intersect(PV(P).EntireColumn, PlgK.EntireRow).Value
      Case Else: MsgBox "Paramètre " & P + 2 & " non géré", vbExclamation, "Récap"
      End Select
   Next P
   
Rem. —— Parcours par ordre croissant
Ls = 1: N = 1: Le = TbIndex(1)
Do: TRés(Ls, 1) = K(Le, 1): Nbr = 1
   For P = 2 To UBound(TSrcS)
      If IsArray(TSrcS(P)) Then If IsNumeric(TSrcS(P)(Le, 1)) Then TSom(P) = TSrcS(P)(Le, 1) Else TSom(P) = 0
      Next P
   Do: N = N + 1: Fini = N > UBound(TbIndex): If Fini Then Exit Do
      Le = TbIndex(N): If K(Le, 1) <> TRés(Ls, 1) Then Exit Do
      For P = 2 To UBound(TSrcS)
         If IsArray(TSrcS(P)) Then If IsNumeric(TSrcS(P)(Le, 1)) Then TSom(P) = TSom(P) + TSrcS(P)(Le, 1)
         Next P
      Nbr = Nbr + 1
      Loop
   Rem. —— Épilogue
If Ls - 1 > PlgA.Rows.Count Then
   MsgBox "Attention: il manque " & Ls - 1 - PlgA.Rows.Count & _
      " ligne(s) pour calculer" & vbLf & "le récapitulatif dans '" & PlgA.Worksheet.Name & "'!" & PlgA.Address, _
      vbExclamation, "Fonction Récap"
   Récap = CVErr(xlErrRef): Exit Function
   End If
While Ls <= UBound(TRés, 1)
   TRés(Ls, 1) = CVErr(xlErrNA)
   For P = 2 To UBound(TSrcS): TRés(Ls, P) = "": Next P
   Ls = Ls + 1: Wend
Récap = TRés
Exit Function
Erreur: MsgBox Err.Description: Stop: Resume
End Function
 

Dranreb

XLDnaute Barbatruc
Re : Regrouper les valeurs d'une colonne et faire le total des valeurs d'une autre co

Non vous en avez enlevé trop.
Vous avez tout enlevé après le premier Loop le plus interne sans condition.
Il y en avait un autre derrière.
remettez:
VB:
 For P = 2 To UBound(TSrcS)
      If IsArray(TSrcS(P)) Then TRés(Ls, P) = TSom(P) Else TRés(Ls, P) = Nbr
      Next P
   Ls = Ls + 1: Loop Until Fini
mais ça prouve un peu que vous n'avez pas du tout cherché à comprendre ne serait-ce qu'en gros comment ça marche... Je ne vous demandais pas le plus pointu (l'indexation qui tient sur 2 lignes seulement !) mais quand même...
À+
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
315 087
Messages
2 116 083
Membres
112 654
dernier inscrit
SADIKA