Gestion des doublons

Re,

De rien,
Mais comme cela, cela permet de pourvoir visionner et comprendre le VBA d’après une formule.
Mais sache quand même que ta solution est la meilleure est plus rapide dans ce cas là.
Une formule est plus rapide que le VBA
A moins de le coder d’une autre façon en utilisant soit le “dictionnaire” ou les “tableaux”

Je vais regarder si je trouve le temps de faire le même montage avec les deux versions, juste pour info

2 « J'aime »

Re,

Une version avec l’ancienne macro,
et avec une version Dictionnaire

MACRO DICTIONNAIRE:

Sub DoublonsDictionnaire()
Dim i%, Dl%
Dim clé$
Dim Ws As Worksheet
Dim c As Variant
Dim MonDico

'**************************************************
'*  MODIFIER LE NOM DE LA FEUILLE DANS LE SET Ws  *
'**************************************************

Set Ws = Worksheets("131017_ABPREST_1-15") 'Initialisation feuille travail
Dl = Ws.Range("A" & Rows.Count).End(xlUp).Row 'Dernière ligne non vide
Ws.Range("J2:J" & Dl).Value = "" 'Efface les données colonne H

Ws.Range("A2:J" & Dl).Interior.Color = xlNone 'Remise en mode normal des couleurs,fonts et type police
Ws.Range("A2:J" & Dl).Font.Color = vbBlack
Ws.Range("A2:J" & Dl).Font.Bold = False

  Set MonDico = CreateObject("Scripting.Dictionary") 'Création dictionnaire
  For Each c In Range("a2:a" & Dl) 'boucle sur les lignes
    If c.Offset(, 4).Value <> "" Then 'Si la cellule NOM n'est pas vide
      clé = c.Offset(, 4).Value & c.Offset(, 5) & c.Offset(, 6) 'la clé est = à la cellule des colonnes 5,6,7
      MonDico.Item(clé) = MonDico.Item(clé) + 1 'place la clé en mémoire
    End If
  Next c
  For Each c In Range("a2", [a65000].End(xlUp)) 'à la fin de la recherche, boucle sur les clé
      clé = c.Offset(, 4).Value & c.Offset(, 5) & c.Offset(, 6)
      If MonDico.Item(clé) > 1 Then 'si la clé est Sup à 1 (donc doublons)
      c.Offset(, 9).Value = "Doublon" 'il inscrit doublons en colonne 8
      c.Resize(, 10).Interior.Color = vbYellow 'colore la ligne en jaune
      c.Resize(, 10).Font.Color = vbRed 'Couleur police Rouge
      c.Resize(, 10).Font.Bold = True 'police en gras
  End If
  Next c
End Sub

Ghaby V2 Dictionnaire.xlsm (120,3 Ko)

2 « J'aime »

Re @Mimimathy,

Bien vu et bien plus rapide avec le dico, merci d’jack :wink:.

Par contre peux-tu me dire pourquoi tu n’utilise pas:

Ws.Range("J2:J" & Dl).ClearContents 'Efface les données colonne J

au lieu de

Ws.Range("J2:J" & Dl).Value = "" 'Efface les données colonne J

Quels sont les avantages et inconvénients ?

@+
Cdlt.

Re,

Aucune différence
Dés fois quand tu montes un code et que lance, le CLEARCONTENTS bug
alors en plus il n’y a que deux parenthèses à mettre ( donc des bytes en moins sur le poids, mais c’est minime)

Re @Mimimathy,

Ok, merci pour ses explications.

Cdlt.