Gérer les doublons avec notion de dates (Résolu)

ralph45

XLDnaute Impliqué
RESOLU [VBA] Gérer les doublons avec notion de dates

Bonjour à toutes et tous,

Dans le fichier joint, vous trouverez les colonnes de départ et ensuite le résultat voulu.
Je sais gérer les doublons de manière brute de décoffrage mais je voudrai une macro me permettant d'éliminer les doublons sur l'intitulé CHAMP 1 pour conserver la valeur contenue dans le CHAMP 2, par rapport à la date la plus récente contenue dans le CHAMP 3.

Je vous remercie de votre aide future. A bientôt !
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Gérer les doublons avec notion de dates

Bonsoir ralph45
Essayez
Code:
=MAX((B4:B17=F4)*(D4:D17))
en H4, formule matricielle, et
Code:
=SOMMEPROD((B$4:B$17=F4)*(D$4:D$17=H4)*C$4:C$17)
en G4, puis recopiez vers le bas.​
ROGER2327
#5119


Mercredi 25 Pédale 138 (Saint Peligraf Poligrafovitch, chien, SQ)
29 Ventôse An CCXIX
2011-W11-6T23:02:03Z
 

ralph45

XLDnaute Impliqué
Re : Gérer les doublons avec notion de dates

Merci ROGER2327,

... mais ce que je voulais c'était une macro me filtrant "sur place" les données.

Je reçois chaque semaine un fichier ".txt" bien pourri que je corrige automatiquement déjà avec des macros (mise en forme, suppression d'infos inutiles, etc.). Le nombre de colonnes est fixe, mais le nombre de lignes va de 1 à n. L'exemple joint plus haut est le tableau déjà expurgé. Ce qu'il me faudrait, c'est le complément de code me permettant d'avoir la ligne dédoublonnée de la référence CHAMP 1 avec la date la plus récente (CHAMP 3) et la valeur contenue dans le CHAMP 2 à la manière d'un filtre élaboré ++.

Ce nouveau tableau me servant de base pour une synthèse automatique (de ce côté, je maîtrise, il n'y a pas de souci... :))

Merci !!
 

pierrejean

XLDnaute Barbatruc
Re : Gérer les doublons avec notion de dates

Bonjour ralph45

Heureux de vous croiser ROGER

En supposant que le tableau soit filtré par ordre decroissant des dates (comme dans l'exemple)

VB:
Sub test()
For n = Range("B65536").End(xlUp).Row To 5 Step -1
  If Range("B" & n) = Range("B" & n - 1) Then
    Range("B" & n & ":D" & n).Delete
  End If
Next n
End Sub
 

pierrejean

XLDnaute Barbatruc
Re : Gérer les doublons avec notion de dates

Re

Version pour ordre de depart quelconque

VB:
Sub test1()
Application.ScreenUpdating = False
Columns("A:A").Insert Shift:=xlToRight
x = Range("C65536").End(xlUp).Row
For n = 4 To x
  Range("B" & n) = n
Next
Range("B3:E" & x).Sort Key1:=Range("C4"), Order1:=xlAscending, Key2:=Range("E4") _
        , Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom
For n = x To 5 Step -1
  If Range("C" & n) = Range("C" & n - 1) Then
    Range("B" & n & ":E" & n).Delete
  End If
Next n
x = Range("C65536").End(xlUp).Row
Range("B3:E" & x).Sort Key1:=Range("B4"), Order1:=xlAscending, Key2:=Range("E4") _
        , Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom
Columns("B:B").Delete Shift:=xlToLeft
Application.ScreenUpdating = True
End Sub
 

ROGER2327

XLDnaute Barbatruc
Re : Gérer les doublons avec notion de dates

Bonjour ralph45, pierrejean
Une proposition paramétrée :
VB:
Private Sub CommandButton1_Click()
Dim kID&, kDT&, DAT()
  With Me.Range("PLG")
    DAT = .Value 'Tableau des données à traiter.
     kID = 1 'Clef d'identification (Colonne CHAMP 1).
     kDT = 3 'Clef de sélection (Colonne CHAMP 3).
     DAT = tutu(DAT, kID, kDT)
    .ClearContents
    .Resize(UBound(DAT, 1), UBound(DAT, 2)).Value = DAT
  End With
End Sub

Private Function tutu(DAT(), kID&, kDT&)
'La bibliothèque Microsoft Scripting Runtime (scrrun.dll) doit être référencée.
Dim i&, j&, ChC&, KTmp$, CLR(), oID As New Scripting.Dictionary
  ChC = UBound(DAT, 2)
  ReDim CLR(1 To ChC)
  For i = 1 To UBound(DAT, 1)
    KTmp = CStr(DAT(i, kID))
    If KTmp <> "" Then
      If oID.Exists(KTmp) Then
        If oID(KTmp)(kDT) < DAT(i, kDT) Then
          For j = 1 To ChC: oID(KTmp)(j) = DAT(i, j): Next
        End If
      Else
        For j = 1 To ChC: CLR(j) = DAT(i, j): Next
        oID(KTmp) = CLR
      End If
    End If
  Next
  If oID.Count Then
    CLR = oID.Keys
    ReDim DAT(1 To oID.Count, 1 To ChC)
    For i = 1 To oID.Count
      For j = 1 To ChC: DAT(i, j) = oID(CLR(i - 1))(j): Next
    Next
  End If
  Set oID = Nothing
  Erase CLR
  tutu = DAT
End Function
ROGER2327
#5121


Jeudi 26 Pédale 138 (Saint Pâle, mineur, SQ)
30 Ventôse An CCXIX
2011-W11-7T11:22:02Z

MODIFICATION DU CODE DU BOUTON et du classeur à 16h18.
 

Pièces jointes

  • Nettoyage_160082_2.xls
    25 KB · Affichages: 55
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Gérer les doublons avec notion de dates

Suite…
Je me suis trompé de code pour le bouton dans l'envoi précédent. Je viens de rectifier…​
ROGER2327
#5123


Jeudi 26 Pédale 138 (Saint Pâle, mineur, SQ)
30 Ventôse An CCXIX
2011-W11-7T16:15:30Z
 

ralph45

XLDnaute Impliqué
Re : Gérer les doublons avec notion de dates

Bonjour,

J'ai pris un peu plus de temps que voulu, mais je tenais à vous informer que vous avez résolu mon problème. Je prends le 1er petit bout de code de pierrejean pour le fichier incriminé (et qui fonctionne nickel), mais je vais tester les 2 autres sur d'autres fichiers moins réguliers, mais plus pointus.

Encore une fois, merci à vous 2, ROGER2327 et pierrejean.
 

Discussions similaires