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

Numéro ID unique

eagleyes90

XLDnaute Nouveau
Bonjour,

beaucoup de posts sur le sujet mais je n'ai pas trouvé de solution adaptable à mon problème alors voilà:

- Je recherche une macro pour générer des numéro ID unique en colonne A constitué de la première lettre du client indiqué en colonne B et d'un numéro (démarrant par 1)

- Caractéristiques:

* Dès que l'on rentre le nom d'un nouveau client, le numéro est généré automatiquement
* Si l'on supprime une ligne pas de renumérotation chaque client conserve son numéro unique.

voir l'exemple attaché pour mieux comprendre.

Merci par avance.
 

Pièces jointes

  • Book2.xls
    27.5 KB · Affichages: 213
  • Book2.xls
    27.5 KB · Affichages: 205
  • Book2.xls
    27.5 KB · Affichages: 202

Softmama

XLDnaute Accro
Re : Numéro ID unique

Bonjour,

Une solution en pièce jointe : entre tes données en colonne I. Un numéro unique s'incrémente pour chaque lettre. Le fichier garde en mémoire ce numéro même si les lignes sont effacées.
 

Pièces jointes

  • Book2.xls
    38.5 KB · Affichages: 611
  • Book2.xls
    38.5 KB · Affichages: 575
  • Book2.xls
    38.5 KB · Affichages: 676

Fred0o

XLDnaute Barbatruc
Re : Numéro ID unique

Bonjour eagleyes90, Softmama,

Bravo Softmama pour ta solution élégante qui permet d'incrémenter une liste à travers la gestion de plages nommées qui font référence à un nombre.

Je ne connaissais pas cette astuce mais je vais m'empresser de l'utiliser !

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Numéro ID unique

Bonjour à tous
Une autre proposition dans le classeur joint.
Code:
[COLOR=DarkSlateGray][B]Private Sub Worksheet_Change(ByVal Target As Range)
Dim ltr$, ind%, MInd, oCel As Range, x As Object
  With [C4]
    Set x = Intersect(.Resize(Rows.Count - .Row, 1), Target)
    If Not x Is Nothing Then[/B][/COLOR][COLOR=DarkSlateGray][B]
      [COLOR=red]Application.Calculation = -4135[/COLOR][/B][/COLOR]
      [COLOR=DarkSlateGray][B]On Error GoTo DefRef
      MInd = Evaluate(ThisWorkbook.Names("MaxIndex").Value)
      On Error GoTo 0
      For Each oCel In x.Cells
        If IsEmpty(oCel) Then
          Application.EnableEvents = 0
          oCel.Offset(0, -1).Value = ""
          Application.EnableEvents = 1
        Else
          If oCel.Offset(0, -1).Value = "" Then
            ltr = UCase(Left$(oCel.Value, 1))
            ind = Asc(ltr) - 64
            If ind < 1 Or 26 < ind Then ltr = "#": ind = 27
            MInd(ind) = MInd(ind) + 1
            Application.EnableEvents = 0
            oCel.Offset(0, -1).Value = ltr & Format(MInd(ind), "00000")
            Application.EnableEvents = 1
          End If
        End If
      Next oCel
      ThisWorkbook.Names.Add Name:="MaxIndex", RefersTo:=MInd
      Application.Calculation = -4105
    End If
  End With
Exit Sub
[COLOR=DarkOrange]' Initialisation[/COLOR]
DefRef:
  rst
  Resume
End Sub

Sub rst()
  ThisWorkbook.Names.Add Name:="MaxIndex", RefersTo:=Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
End Sub[/B][/COLOR]
dans le module de la feuille de saisie.

Code corrigé (en rouge), voir message suivant.
ROGER2327
#4717


Lundi 9 Sable 138 (Saint Sagouin, homme d'Etat, SQ)
19 Frimaire An CCXIX
2010-W49-4T14:02:46Z
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Numéro ID unique

Suite…
J'ai corrigé une erreur (interversion de lignes) dans le code du message précédent.

Ci-joint le fichier corrigé.
ROGER2327
#4724


Mercredi 11 Sable 138 (Nativité de Saint Grabbe, scherziste, SQ)
21 Frimaire An CCXIX
2010-W49-6T00:41:19Z

Postscriptum : fichier modifié et déplacé au message #8 pour tenir des modifications dans la demande (voir #6).
 

Pièces jointes

  • a.txt
    36 bytes · Affichages: 200
Dernière édition:

sigismond

XLDnaute Occasionnel
Re : Numéro ID unique

Bonjour le forum, eagleyes90, Softmama, Fred0o et ROGER2327

Bravo à Softmama pour l'élégance de la solution (+1), je connaissais l'endroit pour y placer des constantes comme la TVA mais on peut y mettre des variables également.

eagleyes90, si tu veux le résultat dans la colonne A, il te faudra écrire le nom dans la colonne B et modifier le code comme suit :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Lettre As String, MaxN As String

'If Left$(Target.Address, 3) = "$I$" Then  *  *  *  *  Remplacer par :

If Left$(Target.Address, 3) = "$B$" Then

    Application.EnableEvents = False
    Lettre = UCase(Left$(Target, 1))
    MaxN = "MaxNumber" & Lettre
    Target(1, 0) = Lettre & Format(Evaluate([MaxN]) + 1, "00")
    ActiveWorkbook.Names.Add Name:=MaxN, RefersTo:="=" & Evaluate([MaxN]) + 1
    Application.EnableEvents = True
End If
End Sub


Bonne journée.

Sigismond
 

ROGER2327

XLDnaute Barbatruc
Re : Numéro ID unique

Re…
Bonjour merci pour vos solutions. Encore une question, que dois-je modifier dans le code pour que les résultats s'affichent en colonne A plutot qu'en colonne n-1?
Une solution permettant de choisir facilement la zone de saisie et la colonne d'affichage des identifiants : il suffit d'une adaptation dans ces deux lignes de code :

col = "A" 'Colonne des identifiants (1 ou "A", 2 ou "B", …, 28 ou "AB", …)
With [C4] 'Première cellule de saisie


Ensemble du code (à placer dans le module de la feuille concernée) :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ltr$, ind%, col, MInd, oCel As Range, x As Object
  col = "A" 'Colonne des identifiants (1 ou "A", 2 ou "B", …, 28 ou "AB", …)
  With [C4] 'Première cellule de saisie
    col = colNum(col) - .Column
    Set x = Intersect(.Resize(Rows.Count - .Row, 1), Target)
    If Not x Is Nothing Then
      Application.Calculation = -4135
      On Error GoTo DefRef
      MInd = Evaluate(ThisWorkbook.Names("MaxIndex").Value)
      On Error GoTo 0
      For Each oCel In x.Cells
        If IsEmpty(oCel) Then
          Application.EnableEvents = 0
          oCel.Offset(0, col).Value = ""
          Application.EnableEvents = 1
        Else
          If oCel.Offset(0, col).Value = "" Then
            ltr = carNet(UCase(Left$(oCel.Value, 1)))
            ind = Asc(ltr) - 64
            If ind < 1 Or 26 < ind Then ltr = "#": ind = 27
            MInd(ind) = MInd(ind) + 1
            Application.EnableEvents = 0
            oCel.Offset(0, col).Value = ltr & Format(MInd(ind), "00000")
            Application.EnableEvents = 1
          End If
        End If
      Next oCel
      ThisWorkbook.Names.Add Name:="MaxIndex", RefersTo:=MInd
      Application.Calculation = -4105
    End If
  End With
Exit Sub
' Initialisation
DefRef:
  rst
  Resume
End Sub

Sub rst()
  ThisWorkbook.Names.Add Name:="MaxIndex", RefersTo:=Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
End Sub

Private Function carNet$(s$)
Dim rEq$, oEq$
  carNet = s
  rEq = " ÀÁÂÃÄÅÆÇÈÉÊËÐÌÍÎÏÑÒÓÔÕÖŒÙÚÛÜÝŸ"
  oEq = " AAAAAAACEEEEEIIIINOOOOOOUUUUYY"
  On Error Resume Next
  carNet = Mid$(oEq, InStr(1, rEq, s, vbBinaryCompare), 1)
  On Error GoTo 0
End Function

Function colNum(x As Variant)
  Select Case VarType(x)
    Case 2 To 5, 17: colNum = colValid(Int(x))
    Case 8
      x = UCase(x)
      colNum = Asc(Right$(x, 1)) - 64
      If Len(x) > 1 Then colNum = colNum + 26 * (Asc(Mid$(StrReverse(x), 2, 1)) - 64)
      colNum = colValid(colNum)
    Case Else: Error 5
  End Select
End Function

Function colValid(x)
  colValid = ((Columns.Count + 2 + x - Abs(Columns.Count - x)) / 2 + Abs((Columns.Count - 2 + x - Abs(Columns.Count - x)) / 2)) / 2
End Function
  • Ce code crée et utilise une seule variable nommée (MaxIndex).
  • Il permet la réinitialisation facile des compteurs : il suffit de supprimer la variable nommée MaxIndex ou d'exécuter la procédure rst.
  • Il ne modifie pas l'identifiant si on corrige une faute d'orthographe (remplacement d'une lettre minuscule par la même en majuscule, par exemple).
  • Il supprime l'identifiant si on supprime un nom. (L'identifiant supprimé ne sera bien sûr pas recréé par la suite.)
    [*]Il ne plante pas en désactivant les procédures évènementielles si :
    1. - on colle simultanément plusieurs noms dans la colonne de saisie ;
    2. - par respect de l'identité des personnes, on saisit un nom commençant par autre chose que A, B, …, Z, a, b, …, z. (Ève et Œdipe, par exemple…) ;
    3. - on efface un nom dans la zone de saisie ;
    4. - on a oublié de définir le nom MaxIndex avant de commencer.
ROGER2327
#4733


Vendredi 13 Sable 138 (Saint Flaive, concierge, SQ)
23 Frimaire An CCXIX
2010-W50-1T23:43:46Z
 

Pièces jointes

  • ID_Unique_4733.xls
    22 KB · Affichages: 260
Dernière édition:

Discussions similaires

Réponses
2
Affichages
983
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…