VBA_Suppression & addition_Doublons
Bonjour le forum!
Après quelques jours de recherches et d'essais non concluants, je viens poser ma question qui concerne un point précis de la gestion des doublons en VBA.
Mon problème est le suivant:
- je dois supprimer des doublons dans certaines colonnes et additionner les valeurs dans d'autres colonnes si les premières colonnes ont été détectées en tant que doublons,
- les données en double peuvent être à n'importe quelle ligne dans la feuille de calcul,
- seules les données en doublon d'une colonne (dans l'exemple ici la colonne A) sont déterminants pour déclencher l'action,
- cette opération doit être légère, car elle est intégrée à un autre code.
Mon cas donnerait ainsi à peu près cela (avant / après):
A |
B |
C |
D |
Donnée1 |
Donnée1.1 |
10 |
34 |
Donnée1 |
Donnée1.1 |
26 |
52 |
Donnée2 |
Donnée2.1 |
20 |
26 |
Donnée1 |
Donnée1.1 |
10 |
2 |
A |
B |
C |
D |
Donnée1 |
Donnée1.1 |
46 |
88 |
Donnée2 |
Donnée2.1 |
20 |
26 |
J'ai lu par exemple quelques fils faisant référence à la méthode Highlander développée par rdurupt, mais j'avoue ne pas avoir réussi à l'adapter à mon cas précis.
N'hésitez pas à me demander plus d'informations sur le cas si celui-ci n'est pas assez détaillé.
Bonne journée à tous!
Esculape.
1 pièce(s) jointe(s)
Sommer et eliminer doublons
Bonjour,
Je te suggère ce type de code pour traiter la liste... Tri sur colonne A puis 2 boucles imbriquées. Pas trop lourd !
Encore une fois, pour les pros VBA, y a bien sûr plus efficace mais l'objectif est aussi d'être pédagogue...
Cordialement.
Bruno
Pièce jointe 203391
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
Option Explicit
Sub SommeDoublons()
Dim Cumul1 As Long
Dim Cumul2 As Long
Dim Groupe As String
'Fige écran
Application.screenupdating=false
'Tri par Groupe
Range("A16").Select
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A15"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("A15:D" & Range("A15").End(xlDown).Row)
.Header = xlYes
.Apply
End With
'Traite doublons
Range("A16").Activate
Do While ActiveCell <> "" 'Parcours toute la liste
Groupe = ActiveCell
Cumul1 = ActiveCell.Offset(0, 2)
Cumul2 = ActiveCell.Offset(0, 3)
Do While ActiveCell.Offset(1, 0) = Groupe 'Tant qu'il existe un doublon sur Groupe
'Cumuler valeurs
Cumul1 = Cumul1 + ActiveCell.Offset(1, 2)
Cumul2 = Cumul2 + ActiveCell.Offset(1, 3)
'Supprimer le doublon
ActiveCell.Offset(1, 0).EntireRow.Delete
Loop
'Reporter cumuls sur ligne restante
ActiveCell.Offset(0, 2) = Cumul1
ActiveCell.Offset(0, 3) = Cumul2
'Passer au groupe suivant
ActiveCell.Offset(1, 0).Select
Loop
End Sub |
Variante fonctionnant aussi sur MAC !
Ici la feuille source est directement modifiée :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| Sub DemoC()
Dim cLig As New Collection, C As Byte, L&, R&, VA, VR
With Feuil1
VA = .Cells(1).CurrentRegion.Value
If UBound(VA, 2) < 5 Then Beep: Exit Sub
ReDim VR(1 To UBound(VA) - 1, 1 To 5)
For R = 2 To UBound(VA)
On Error Resume Next
L = cLig(VA(R, 2))
On Error GoTo 0
If L Then
VR(L, 4) = VR(L, 4) + VA(R, 4)
VR(L, 5) = VR(L, 5) + VA(R, 5)
Else
L = cLig.Count + 1
cLig.Add L, VA(R, 2)
For C = 1 To 5: VR(L, C) = VA(R, C): Next
End If
L = 0
Next
If cLig.Count < UBound(VR) Then
.[A2:E2].Resize(cLig.Count).Value = VR
.Rows(cLig.Count + 2 & ":" & UBound(VA)).Delete
End If
End With
Set cLig = Nothing
End Sub |
______________________________________________________________________________________________________
Merci de cliquer sur :plusser: pour chaque message ayant aidé puis sur :resolu: pour clore cette discussion …