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

Incrémenter des doublons

  • Initiateur de la discussion Initiateur de la discussion cybergui77
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

C

cybergui77

Guest
Bonjour,
Je suis sur excel 2003.
Je suis en train de créer des login pour des personnes afin qu'elles puissent se connecter à un domaine. Pour créer ce login je colle les 3 premières lettres du nom et du prénom (ex: "DUPONT Catie" donne "dupcat").
Le problème, c'est que sur plusieurs milliers de login, j'ai des doublons, parfois 3 ou 4 occurrences identiques.
Je voudrais dans un premier temps que chacun des doublons trouvés soient automatiquement incrémenté d'un chiffre 1,2,3, etc. (Ex: "DUPONT Catie" donne "dupcat1" et "DUPRES Catherine" donne "dupcat2", etc.)
Je voudrais dans un deuxième temps que cette macro s'applique sur une colonne et que les modifications soient écrit dans une autre colonne.
Piouf, j'ai eu beau chercher je n'ai rien trouvé sur la toile....
Donc un grand merci d'avance !
 
Re : Incrémenter des doublons

Bonjour cybergui77 et bienvenue sur le forum,

Voici une proposition par macro que tu devras adapter à ton cas.
Dans cet exemple, la liste des login (avec doublons) commence en C2 et on veut inscrire le login corrigé dans la colonne D.

Code:
Sub IncrementerDoublons()
'Permet d'incrémenter des doublons en ajoutant un chiffre (1,2,3...) au bout
'Grand Chaman Excel -  2011-09-24

    Dim rg As Range, rg2 As Range, rg3 As Range, c As Range
    Dim i As Integer
    Dim login As String, newlogin As String
    Dim bExist As Boolean
    
    Application.ScreenUpdating = False

    Set rg = Range("C2:C" & Range("C65000").End(xlUp).Row)  'plage contenant les login (avec doublons)
    
    For Each c In rg
        Set rg2 = Range("C2:C" & c.Offset(-1, 0).Row).Offset(0, 1)  'plage contenant les login corrigés (1 colonne à côté)
        login = c.Text
        newlogin = login
        i = 1
        Do
        Set rg3 = rg2.Find(what:=newlogin, LookIn:=xlValues, lookat:=xlWhole) 'on cherche si newlogin existe déjà
        bExist = True
        If Not rg3 Is Nothing Then  'il existe, alors on ajoute 1,2,3,... au bout
            newlogin = login & i
            bExist = True
            i = i + 1
        Else
            bExist = False
        End If
        Loop Until Not bExist
    c.Offset(0, 1) = newlogin
    Next c
    
    Application.ScreenUpdating = True
End Sub

A+
 
Re : Incrémenter des doublons

Bonjour cybergui77

Salut Grand Chaman

Une autre solution a base de dictionnaire (liste d'origine a partir de A1)

Code:
Sub test()
'ligne et colonne de debut d'ecriture
ligne = 1
colonne = 2
'mise sous forme de tableau de la liste
Tablo = Range("A1:A" & Range("A65536").End(xlUp).Row) ' a adapter pour la liste d'origine
'creation d'un dictionnaire contenant les noms et le nombre par nom
Set d = CreateObject("Scripting.dictionary")
For n = LBound(Tablo) To UBound(Tablo)
 x = Tablo(n, 1)
 d(x) = d(x) + 1
Next n
'ecriture du resultat
a = d.keys
b = d.items
For n = LBound(a) To UBound(a)
 For m = 1 To b(n)
  If b(n) > 1 Then
   Cells(ligne, colonne) = a(n) & m
  Else
   Cells(ligne, colonne) = a(n)
  End If
  ligne = ligne + 1
 Next m
Next n
End Sub
 
Re : Incrémenter des doublons

Bonjour cybergui, Bonjour Grand Chaman, Bonjour Pierre-Jean 🙂

Pas sûr d'avoir tout compris, mais si tes login initiaux sont en colonne A de A2 à A200 par exemple, tu pourrais essayer la formule là en B2

Code:
=A2&SI(NB.SI($A$1:$A$200;A2)>1;NB.SI($A$1:$A2;A2);"")
 
Re : Incrémenter des doublons

Bonjours à toutes et tous,

Une variante à pierrejean mais aussi avec un dico :
Code:
Sub Logins()
    
    Dim Plage As Range
    Dim Cel As Range
    Dim Dico As Object
    Dim ListeCle As Variant
    Dim Cle As Variant
    Dim I As Integer
    
    'défini la plage des logins en colonne A à partir de A2
    With Worksheets("Feuil1")
     
        Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
    
    End With
    
    'crée le dictionnaire
    Set Dico = CreateObject("Scripting.Dictionary")
    
    'parcour les cellules et ajoute au dico si le nom n'existe pas
    'dans le cas contraire, l'incrémente
    For Each Cel In Plage
               
        If Dico.exists(Cel.Value) = False Then
            
            Dico.Add Cel.Value, 0
            
        Else
            
            'incrément la valeur de la clé
            Dico.Item(Cel.Value) = Dico.Item(Cel.Value) + 1
            'et crée la nouvelle clé avec l'incrémentation
            Dico.Add Cel.Value & Dico.Item(Cel.Value), 0

        End If
        
    Next Cel
       
    'récupère les clés
    ListeCle = Dico.Keys
    
    'colle les nouveaux logins dans la colonne B
    For I = 0 To Dico.Count - 1
    
        Plage(I + 1).Offset(0, 1) = ListeCle(I)
        
    Next I
    
    Set Dico = Nothing

End Sub

Hervé.
 
Re : Incrémenter des doublons

Bonjour à tous,

Par formule, la solution de tototiti est très simple et c'est celle qu'il faut utiliser.

Elle suppose cependant une colonne intermédiaire.

Alors pour le fun, cette solution dans le fichier joint.

Contrainte : le tableau doit être trié comme indiqué.

A+
 

Pièces jointes

Re : Incrémenter des doublons

Re,

Toujours pour le fun, avec SOMMEPROD cette fois.

Cela évite de trier le tableau et évite la validation matricielle.

Fichier (2).

Edit : je pense que les vbaistes ont raison : il ne faut pas numéroter le 1er login.

Prendre alors le fichier (3).

A+
 

Pièces jointes

Dernière édition:
Re : Incrémenter des doublons

Re,

Pour finir, une autre solution VBA, mais c'est une fonction :

Code:
Function LOGIN(nom$, prenom$, plage)
Dim i&
LOGIN = LCase(Left(nom, 3)) & LCase(Left(prenom, 3))
If plage.Count = 1 Then Exit Function
plage = Application.Transpose(plage) 'matrice => plus rapide
For i = UBound(plage) To 2 Step -1
  If Left(plage(i), 6) = LOGIN Then _
    LOGIN = LOGIN & Val(Mid(plage(i), 7, 9 ^ 9)) + 1: Exit Function
Next
End Function
La formule en C2 utilise cette fonction.

Fichier joint.

A+
 

Pièces jointes

Re : Incrémenter des doublons

Bonjour,
d'abord un grand merci à tous, je ne m'attendais pas a autant d'engouement pour mon problème, c'est super. Il faut que je fasse des essais. Je vous tiens au courant.
A++
 
Re : Incrémenter des doublons

Bonjour à tous,

J'ai testé les solutions de mes posts #9 et #10 en tirant A2:C2 vers le bas sur 1000 lignes :

- la 1ère - Login(4).xls - est quasi immédiate.

- la solution par fonction VBA met un temps fou : 1 min 40 s sur Excel 2010.

L'une et l'autre me surprennent.

A+
 
Re : Incrémenter des doublons

salut

nécessitant une colonne suplémentaire, réactualistion de la liste créée (en C) à la saisie , suppression, du nom ou du prénom (en A et B) :
Code:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim l As Long, dl As Long, n As Long, P As Range
  Dim T
  l = Target.Row: dl = Cells(Rows.Count, 1).End(xlUp).Row
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  If Range("A" & l) = "" Or Range("B" & l) = "" Then
    'réactualisation de toutes les lignes en cas de suppression d'une donnée
    For n = 2 To dl
    Range("C" & n & ":D" & n) = ""
    Next
  End If
  '3 & 3
  Set P = Range("A" & l & ":B" & l)
  If Intersect(Target, P) Is Nothing Then Exit Sub
  T = Range("A2" & ":C" & dl)
  For n = 1 To dl - 1
    T(n, 3) = Left(T(n, 1), 3) & Left(T(n, 2), 3)
  Next
  'réécriture
  For l = 2 To dl
  Cells(l, "D") = T(l - 1, 3)
  n = Application.CountIf(Range("D2:D" & l), Cells(l, "D"))
  If Cells(l, "D") <> "" Then Cells(l, "C") = Cells(l, "D") & IIf(n = 1, "", n - 1)
  Next
  Application.EnableEvents = True
End Sub
 
Re : Incrémenter des doublons

Bonjour,
J'ai testé votre solution Grand chamane excel et elle me satisfait. J'ai testé les autres qui fonctionnent bien aussi.
A vrai dire vu que je ne suis pas très doué, je n'ai pas réussi à adapter les autres solutions à mon tableau excel :-/

Je rajouterais une contrainte supplémentaire, je m'explique:
j'ai une macro qui colorie les cases des doublons détectés. Cependant elle n'est pas très pratique puisqu'il faut la lancer manuellement et ensuite choisir une plage d'application. De plus, tous les doublons se colorient en vert au lieu de mettre une couleur par groupe de doublons.

Serait-il possible qu'en plus d'incrémenter les doublons, leurs cases soient soient colorées de différent couleur (ex: tous les "DUPONT1", "DUPONT2", "DUPONT3", etc. en bleu, les "DUPRES1", "DUPRES2", etc. en rouge) et ne pas avoir à rentrer manuellement la plage?

Voici la macro:

Sub MarqueLesDoublons()
Dim Plage As Range, i&, Cell As Range, Rng As Range

On Error Resume Next
Set Plage = Application.InputBox("Plage à examiner", Type:=8)
If IsEmpty(Plage) Then Exit Sub

Application.ScreenUpdating = False

For Each Cell In Plage
For i = 1 To Plage.Count
Set Rng = Cell.Offset(i)
If Rng <> "" And Rng = Cell Then
Cell.Interior.ColorIndex = 43
Rng.Interior.ColorIndex = 43
Exit For
End If
Next i
Next Cell

End Sub



Je vous joint ci-dessous une partie de mon fichier excel, j'ai enlever une grande partie de mes colonnes et le nom et le prénom des utilisateurs pour une question de confidentialité...

http://cjoint.com/?AIBchF9W2Qd

PS: si en voyant mon fichier vous avez une solution pour simplifier mon tableau, je suis preneur mais ce n'est pas là la priorité ^^

Merci par avance
 
Re : Incrémenter des doublons

Bonjour,

Toujours en partant de ma proc :
Code:
Sub IncrementerDoublons()
   
    Dim Plage As Range
    Dim Cel As Range
    Dim Dico As Object
    Dim ListeCle As Variant
    Dim Cle As Variant
    Dim I As Integer
    Dim J As Long
    
    'défini la plage des logins en colonne A à partir de A2
    With Worksheets("Feuil1")
     
        Set Plage = .Range(.Cells(2, 7), .Cells(.Rows.Count, 7).End(xlUp))
   
    End With
   
    'crée le dictionnaire
    Set Dico = CreateObject("Scripting.Dictionary")
    
    'parcour les cellules et ajoute au dico si le nom n'existe pas
    'dans le cas contraire, l'incrémente
    For Each Cel In Plage
               
        If Dico.exists(Cel.Value) = False Then
            
            J = J + 1000
            
            Dico.Add Cel.Value, 0 & ";" & J
           
        Else
           
            'incrément la valeur de la clé (1er élément du tableau retourné par Split)
            Dico.Item(Cel.Value) = CInt(Split(Dico.Item(Cel.Value), ";")(0)) + 1 & ";" & Split(Dico.Item(Cel.Value), ";")(1)
            
            'et crée la nouvelle clé avec l'incrémentation
            Dico.Add Cel.Value & Split(Dico.Item(Cel.Value), ";")(0), 0
            
            'colorie la cellule (avec la valeur du 2éme élément du tableau retourné par Split donc la valeur de J)
            Cel.Interior.Color = Split(Dico.Item(Cel.Value), ";")(1)
        
        End If
    
    Next Cel
       
    'récupère les clés
    ListeCle = Dico.Keys
   
    'colle les nouveaux logins dans la colonne à droite
    For I = 0 To Dico.Count - 1
   
        Plage(I + 1).Offset(0, 1) = ListeCle(I)
       
    Next I
   
    Set Dico = Nothing

End Sub

Hervé.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
85
Affichages
8 K
É
Réponses
0
Affichages
976
ÉtienneB
É
N
Réponses
0
Affichages
916
Nananinanana
N
N
Réponses
0
Affichages
904
Nananinanana
N
P
Réponses
7
Affichages
2 K
P
C
Réponses
3
Affichages
2 K
C
C
Réponses
3
Affichages
995
C
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…