Creer un ID unique via macro

Pouetpouet72

XLDnaute Nouveau
Bonjour a tous,

Je fait une nouvelle fois appelle à vous pour un probleme que je n'arrive pas à reseoudre après moulte recherches qui ne me conviennent pas :(

Je souhaiterai dans une colonne generer une valeur unique (correspondant à une sorte d'index) de la forme Uxxxx ou xxxx sont des chiffres.

La particularité c'est qu'il me faut integrer ceci dans une macro (dc via un bouton qui remplirai la cellule) et que l'argument utilisé NE SOIT PAS prendre la cellule du dessus et l'incrementer de 1 mais plutot lire toute la colonne, reperer la valeur maximum et l'incrementer de 1, ceci dans un souci de tri de la premiere colonne (les index bougeront donc).

Voici un exemple de ce que je souhaite mettre en place :



Dans mon image de gauche, le bouton m'a permis de creer les index. apres un tri (donc id dans le desordre) et l'ajout d'une valeur en dessous, le bouton a reperer la valeur maximale (U0004) et a donc creer U0005 pour le suivant.

Auriez-vous une solution pour moi ?

En vous remerciant par avance :cool:
 

ROGER2327

XLDnaute Barbatruc
Re : Creer un ID unique via macro

Suite...
(...) si l'utilisateur supprime toutes les infos de la ligne (cellule par cellule ou suppression de la selection des cellules rempli SAUF l'id en lui meme (ce qui peut arriver car la colonne id etant caché), alors cette id ne disparait pas et reste le meme pour la nouvelle saisie ce qui entraine des erreur apres mais bon en meme temps cela a de tres faible propabilité d'arriver. (...)
Comme vous l'avez remarqué, un identifiant ne peut être créé deux fois, ce qui est le moins qu'on puisse attendre d'un générateur d'identifiants uniques.
C'est pourquoi, comme vous le remarquez aussi, lorsqu'une ligne entière est supprimée, l'identifiant qu'elle portait ne peut être recréé.

Il est tout aussi vrai que si vous supprimez un nom, l'identifiant associé n'est pas effacé, et la saisie d'un nouveau nom ne modifiera pas l'identifiant.
J'ai choisi cette option pour permettre la correction d'une éventuelle erreur de saisie du nom, voire pour permettre la correction volontaire du nom. Par exemple, Mademoiselle DUPONT épouse Monsieur DURAND et adopte son nom (ça arrive encore...) Le cas échéant, vous pouvez remplacer le nom DUPONT par DURAND. Mademoiselle DUPONT devenue Madame DURAND conserve son identifiant.

Si j'avais choisi l'option inverse, savoir la création d'un nouvel identifiant dès que le nom est modifié, Madame DURAND se verrait dotée d'un nouvel identifiant.

Chacune de ces possibilités a ses avantages et ses inconvénients. Si vous préférez la deuxième, il vous suffit de remplacer la ligne
Code:
[COLOR="DarkSlateGray"][B]         If IsEmpty(oCel.Offset(0, IDn - Nom)) And Not IsEmpty(oCel) Then
[/B][/COLOR]
par celle-ci :
Code:
[COLOR="DarkSlateGray"][B]         If Not IsEmpty(oCel) Then[/B][/COLOR]
À vous de voir...
ROGER2327
#4156


Vendredi 13 Absolu 138 (Saint Cantarel, l'illuminateur, SQ)
4ème Sanculottide An CCXVIII
2010-W38-1T16:50:49Z
 
Dernière édition:

Pouetpouet72

XLDnaute Nouveau
Re : Creer un ID unique via macro

Bonjout ROGER2327,

Je ne saurais jamais assez te remercier pour l"exelente aide que tu m'a fournie !


un identifiant ne peut être créé deux fois, ce qui est le moins qu'on puisse attendre d'un générateur d'identifiants uniques.

Oui, et je le repete, cette solution est plus que top, c'est exactement ce qu'il me fallait


Si j'avais choisi l'option inverse, savoir la création d'un nouvel identifiant dès que le nom est modifié, Madame DURAND se verrait dotée d'un nouvel identifiant.

Exact je n'avais pas penser a cela, et le pire c'est qu'effectivement cela va arriver et je dirais meme qu'il s'agira de la principale modification qu'il sera amené a faire dans le classeur :cool:

Je pense donc qu'on ne peu faire plus parfait, si toutefois la 2eme option se produisait, une petit msgbox fera l'affaire a savoir si on souhaite ou non conserver l'ID lors de la modif du nom, j'utilisera alors dans ce cas soit ton code qui garde l'id soit celui qui le supprime en fonction de la reponse.

Donc un ENORME merci à toi de nouveau, ton aide m'a été d'un grand service ;)
 

ROGER2327

XLDnaute Barbatruc
Re : Creer un ID unique via macro

Re...
(...) si toutefois la 2eme option se produisait, une petit msgbox fera l'affaire a savoir si on souhaite ou non conserver l'ID lors de la modif du nom (...)
C'est une possibilité, d'autant qu'il n'y a presque rien à changer dans le code :
Code:
[COLOR="DarkSlateGray"][B]Private Sub Worksheet_Change(ByVal Target As Range)
Dim Champ_Nom$, Champ_IDn$, Nom%, IDn%, oCl&[COLOR="Red"], tf As Boolean[/COLOR]
Dim n&, oPlg As Object, oCel As Range, oColl As New Collection
'
   Champ_Nom = "NOM" 'intitulé de la colonne des Noms
   Champ_IDn = "ID" 'intitulé de la colonne des Identifiants
'
   oCl = Cells(1, Columns.Count).End(xlToLeft).Column
   With Range(Cells(1, 1), Cells(1, oCl))
      For Nom = 1 To oCl
         If .Cells(1, Nom) Like Champ_Nom Then Exit For
      Next
      For IDn = 1 To oCl
         If .Cells(1, IDn) Like Champ_IDn Then Exit For
      Next
   End With
   If Nom > oCl Or IDn > oCl Then GoTo W_C2
   n = FU9ONQ9HIFHSKNUQ.[A1].Value
   Set oPlg = Intersect(Target, Columns(Nom).Resize(Rows.Count - 1, 1).Offset(1, 0))
   If Not oPlg Is Nothing Then
      With Range(Cells(1, IDn), Cells(Rows.Count, IDn).End(xlUp))
         For Each oCel In .Cells
            If oCel.Value Like "U####" Then
               On Error Resume Next
               oColl.Add Item:=oCel.Value, Key:=CStr(oCel.Value)
               If Err.Number <> 0 Then GoTo E
               On Error GoTo 0
               n = WorksheetFunction.Max(n, Val(Right$(oCel.Value, 4)))
            End If
         Next oCel
      End With
      Application.Calculation = xlCalculationManual
      For Each oCel In oPlg.Cells
         If n = 9999 Then MsgBox "Tous les identifiants ont été attribués." & vbLf & "Désolé...": Exit For
         [COLOR="Red"]If Not IsEmpty(oCel.Offset(0, IDn - Nom)) And Not IsEmpty(oCel) Then tf = MsgBox("Voulez-vous remplacer l'ancien idendifiant ?", vbYesNo) = vbYes[/COLOR]
         If [COLOR="Red"]([/COLOR]IsEmpty(oCel.Offset(0, IDn - Nom)) [COLOR="Red"]Or tf)[/COLOR] And Not IsEmpty(oCel) Then
            n = n + 1
            Application.EnableEvents = False
            oCel.Offset(0, IDn - Nom).Value = "U" & Format(n, "0000")
            Application.EnableEvents = True
         End If
      Next oCel
      FU9ONQ9HIFHSKNUQ.[A1].Value = n
S:    Application.Calculation = xlCalculationAutomatic
   End If
   Set oPlg = Nothing
' Suite de la procédure Worksheet_Change
W_C2:
Exit Sub
E: MsgBox "L'identifiant " & oCel.Value & " n'est pas unique." & vbLf & "Vérifier la colonne " & IDn & "."
   Err.Number = 0
   Resume S
End Sub[/B][/COLOR]
Qu'en pensez-vous ?
ROGER2327
#4161


Samedi 14 Absolu 138 (Saint Sophrotatos l'Arménien, pataphysicien, SQ)
5ème Sanculottide An CCXVIII
2010-W38-2T09:34:38Z
 

Discussions similaires

Statistiques des forums

Discussions
312 502
Messages
2 089 023
Membres
104 007
dernier inscrit
Monvieux