Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 Plusieurs lignes avec mêmes donnés

Flochavignaud

XLDnaute Nouveau
Bonjour, je suis président d'une association nous avons un partenaire qui nous envoie un fichiers avec les donateurs de l'année 2023.
1 ligne = 1 don, mais un donateur peux faire plusieurs dons de même valeur le même jour, je souhaiterai regrouper tous les dons de la même date et du même utilisateur sur un seul et même ligne afin de pouvoir l'importé dans notre CRM et généré les reçu fiscaux.
Le tableau se présente sous cette forme :
Colone A = Date du don, Colone B = Montant du don, Colone C = email
Je ne peux malheureusement pas vous mettre le fichier car il contient des donnés perso des donateurs.
Je vous joint un fichiers reconstituer type afin d'avoir une idée.
Merci pour votre aide.
 

Pièces jointes

  • EX-Donnateurs-2023.xlsx
    10.3 KB · Affichages: 2
Solution
Bonjour à tous,
Pour une autre demande, j'ai écrit un code très similaire.
Voici une proposition, mais attention : j'ai remplacé les points de la colonne B par des virgules (mon excel est en Fr) via un simple Ctrl+H avant le traitement =>

P.

job75

XLDnaute Barbatruc
Bonjour Flochavignaud, bienvenue sur XLD,

Vous pouvez utiliser le Dictionary pour :

- lister dans les keys les emails sans doublons

- lister dans les items les sommes correspondantes.

Nombreux exemples sur le forum.

A+
 

p56

XLDnaute Occasionnel
Bonjour à tous,
Pour une autre demande, j'ai écrit un code très similaire.
Voici une proposition, mais attention : j'ai remplacé les points de la colonne B par des virgules (mon excel est en Fr) via un simple Ctrl+H avant le traitement =>

P.
 

Pièces jointes

  • EX-Donnateurs-2023.xlsm
    24.6 KB · Affichages: 2

job75

XLDnaute Barbatruc
Avec le Dictionary c'est assez simple :
VB:
Private Sub Worksheet_Activate()
Dim d As Object, tablo, resu(), i&, x$, n&, nn&
Set d = CreateObject("Scripting.Dictionary")
tablo = Sheets("BDD").[A1].CurrentRegion.Resize(, 3)
ReDim resu(1 To UBound(tablo), 1 To 3)
For i = 2 To UBound(tablo)
    x = tablo(i, 3)
    If x <> "" Then
        If Not d.exists(x) Then
            n = n + 1
            d(x) = n 'mémorise la ligne
            resu(n, 1) = tablo(i, 1) 'date
            resu(n, 3) = "=HYPERLINK(""mailto:" & x & """,""" & x & """)" 'formule
        End If
        nn = d(x) 'récupère la ligne
        resu(nn, 2) = resu(nn, 2) + Val(Replace(tablo(i, 2), ",", ".")) 'montant
    End If
Next
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2] '1ère cellule de destination
    If n Then .Resize(n, 3) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 3).ClearContents 'RAZ en dessous
End With
End Sub
La macro se déclenche automatiquement quand on active la feuille "Grouper".

On notera l'utilisation de la fonction LIEN_HYPERTEXTE.

Bonjour p56.
 

Pièces jointes

  • EX-Donnateurs-2023.xlsm
    20 KB · Affichages: 0
Dernière édition:

cp4

XLDnaute Barbatruc
Bonsoir @Flochavignaud , @job75 , @p56

@Flochavignaud : D'après ce que j'ai compris, voici ma participation
VB:
Sub CumulDonParEmail()
   Dim mondico As Object, c As Range, i As Integer
   Set mondico = CreateObject("Scripting.Dictionary")
   For Each c In Range("C2", [C65000].End(xlUp))
      mondico(c.Value) = mondico(c.Value) + c.Offset(, -1).Value
   Next c
   'restitution sur la même feuille
   [g1].CurrentRegion.ClearContents
   [g1] = "Email": [h1] = "Montant cumulé"
   [g2].Resize(mondico.Count, 1) = Application.Transpose(mondico.keys)
   [h2].Resize(mondico.Count, 1) = Application.Transpose(mondico.items)

   For i = 2 To Range("h" & Rows.Count).End(xlUp).Row
      Cells(i, "h") = Cells(i, "h") * 1   'convertir en chiffre
   Next i
End Sub
 

Cousinhub

XLDnaute Barbatruc
Inactif
Bonsoir,
Assez simple également avec Power Query
Ne nécessite pas de macro, un clic droit dans le tableau de restitution, "Actualiser" pour mettre à jour
Le code :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="T_Dons"]}[Content],
    ModType = Table.TransformColumnTypes(Source, {{"Date", type date},{"Montant", type number}}, "en-US"),
    Total = Table.Group(ModType, {"Email","Date"}, {{"Montant des dons", each List.Sum([Montant]), type nullable number}})
in
    Total
Le fichier
Bonne soirée
 

Pièces jointes

  • PQ_Donnateurs-2023.xlsx
    19.6 KB · Affichages: 0

Cousinhub

XLDnaute Barbatruc
Inactif
Re-,
Il est possible d'intégrer cette formule directement dans une requête, mais précédée d'une apostrophe
Puis au chargement, utilisation d'un code lors de la mise à jour de la requête pour supprimer l'apostrophe et valider cette formule
D'après un code de mon ami regretté Hasco
Le code M modifié :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="T_Dons"]}[Content],
    ModType = Table.TransformColumnTypes(Source, {{"Date", type date},{"Montant", type number}}, "en-US"),
    Total = Table.Group(ModType, {"Email","Date"}, {{"Montant des dons", each List.Sum([Montant]), type nullable number}}),
    Email = Table.ReplaceValue(Total,each [Email],each "'=LIEN_HYPERTEXTE(""" & [Email] & """;""" & [Email] & """)",Replacer.ReplaceText,{"Email"})
in
    Email
Et dans le code de la feuille :
VB:
Private WithEvents OQT As QueryTable

Private Sub OQT_AfterRefresh(ByVal Success As Boolean)
    Dim Cel As Range
    If Success Then
        For Each Cel In Me.Range("T_Final[Email]")
            Cel.Formula2Local = Replace(Cel.Value, "'=", "=")
        Next Cel
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If OQT Is Nothing Then Set OQT = Me.Range("T_Final").ListObject.QueryTable
End Sub

Le fichier exemple
Bonne journée
 

Pièces jointes

  • PQ_Donnateurs-2023_avec hyp actifs.xlsm
    26.6 KB · Affichages: 1

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…