Créer un ID à partir d'un secteur et des noms prénoms

balkan59

XLDnaute Nouveau
:D Bonjour à tous,
J'aurais besoin d'un petit coup de main. Voilà je voudrais pouvoir identifier une personne à partir d'un ID qui se présenterait de cette façon les deux premières lettres du secteur suivit de lettre fixe type enf pour "enfant" et une incrémentation commencant par 01.
J'avais commencer par une fonction type :
Code:
=TEXTE(LIGNE(A1);"000")&"enf"
mais cette fonction n'est pas daptable au secteur.
J'avais bien trouvé ceci
HTML:
http://www.excel-downloads.com/forum/140577-creer-identifiant-unique-pour-liaison-entre-deux-feuilles.html
sur le forum mais je n'arrive pas à l'adapter...
Pourriez vous me donner un petit coup de main Merci...;)
 

Pièces jointes

  • ID.xls
    34 KB · Affichages: 59

balkan59

XLDnaute Nouveau
Re : Créer un ID à partir d'un secteur et des noms prénoms

Merci pour ton aide R@chid, ;)
Et sous forme de macro es ce que ce serait possible pour qu'il y est de la cohérence entre les variables en cas de suppression ou de mise à jour.
Merci Encore je retiens pour la formule Merci...:)
 

ROGER2327

XLDnaute Barbatruc
Re : Créer un ID à partir d'un secteur et des noms prénoms

Bonjour à tous.


À balkan59 : Suite à votre message privé de demande d'adaptation d'une vieille procédure que j'avais écrite pour résoudre un autre problème d'identificateur unique, je vous propose ceci (à mettre dans le module de la feuille de données) :​
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim colNom%, colID%, oCl&, tf As Boolean
Dim n&, oPlg As Object, oCel As Range
Dim h$, k$, ck&, nLieux&, corLieux$()
Dim nMax&, nPatron$, nFormat$, w&

Const Champ_Nom$ = "Secteur"     'intitulé de la colonne des Noms
Const Champ_ID$ = "ID Enfants"   'intitulé de la colonne des Identifiants
Const nk As Byte = 2             'longueur du préfixe littéral
Const ww$ = "-ENF-"              'séparateur
Const nc As Byte = 3             'longueur du postfixe numérique

'Recherche des n° de colonnes des champs :

   oCl = Cells(1, Columns.Count).End(xlToLeft).Column
   With Range(Cells(1, 1), Cells(1, oCl))
      For colNom = 1 To oCl
         If .Cells(1, colNom) Like Champ_Nom Then Exit For
      Next
      For colID = 1 To oCl
         If .Cells(1, colID) Like Champ_ID Then Exit For
      Next
   End With

'Si les champs de données existent :

   If colNom <= oCl And colID <= oCl Then

'Définition de la plage de données à traiter :

      Set oPlg = Intersect(Target, Columns(colNom).Resize(Rows.Count - 1, 1).Offset(1, 0))

'Contrôle de l'existence de données à traiter :

      If Not oPlg Is Nothing Then

'     Calcul des paramètres relatifs au postfixe numérique :

         nMax = 10 ^ nc - 1: nPatron = String(nc, "#"): nFormat = String(nc, "0")

'     Normalisation des noms de secteur :

         nLieux = [Lieux].Count
         ReDim corLieux(1 To nLieux)
         For ck = 1 To nLieux: corLieux(ck) = corCar([Lieux].Cells(ck)): Next

         Application.Calculation = xlCalculationManual

'Traitement séquentiel des données :

         For Each oCel In oPlg.Cells
            If Not IsEmpty(oCel.Value) Then

'Recherche du préfixe de la donnée courante :

               h = corCar(oCel.Value)
               k = Left$(h, nk) & ww
               For ck = nLieux To 1 Step -1
                  If h = corLieux(ck) Then Exit For
               Next

'Si la donnée correspond à un préfixe valide, détermination du rang du rang "n" du dernier postfixe associé :

               If ck Then
                  n = Feuil2.Cells(ck, 1).Offset(, 1).Value

'Vérification de la disponibilité d'un postfixe valide :

                  If n >= nMax Then
                     MsgBox "Tous les identifiants ont été attribués." & vbLf & "Désolé..."
                  Else

'Contrôle de la présence antérieure d'un identifiant et demande sur l'éventuelle création d'un nouvel identifiant :

                     If Not IsEmpty(oCel.Offset(0, colID - colNom)) And Not IsEmpty(oCel) Then
                        tf = MsgBox("Voulez-vous remplacer l'ancien idendifiant ?", vbYesNo) = vbYes
                     End If

'Le cas échéant, création d'un nouvel identifiant :

                     If (IsEmpty(oCel.Offset(0, colID - colNom)) Or tf) And Not IsEmpty(oCel) Then
                        n = n + 1
                        Application.EnableEvents = False
                        oCel.Offset(0, colID - colNom).Value = k & Format(n, nFormat)

'Mémorisation du rang du postfixe :

                        Feuil2.Cells(ck, 1).Offset(, 1).Value = n
                        Application.EnableEvents = True
                     End If
                  End If

               End If

            End If
         Next

         Application.Calculation = xlCalculationAutomatic

      End If
      Set oPlg = Nothing
      Erase corLieux

   End If
'Suite de la procédure Worksheet_Change

End Sub

Private Function corCar$(x$)
Const rEq = " ÀÁÂÃÄÅÂÆÇÈÉÊËÊÐÌÍÎÏÑÒÓÔÕÖŒÙÚÛÜÝŸ" '(à compléter)
Const oEq = "*AAAAAAAACEEEEEEIIIINOOOOOOUUUUYY"
Dim i&
      x = UCase(x)
      For i = 1 To Len(x)
         On Error Resume Next
         Mid$(x, i, 1) = Mid$(oEq, InStr(1, rEq, Mid$(x, i, 1), vbBinaryCompare), 1)
         On Error GoTo 0
      Next
      corCar = x
End Function
(J'espère avoir bien compris la demande...)

[Lieux] fait référence à la plage nommée
Code:
=DECALER(OP!$A$1;;;MAX((OP!$A$1:$A$1001<>"")*LIGNE(OP!$1:$1001));)

Voyez si vous pouvez en tirer quelque chose.​


Bonne soirée.


ROGER2327
#6938


Samedi 21 Haha 141 (Zimzoum de Bosse-de-Nage - fête Suprême Tierce)
5 Brumaire An CCXXII, 6,0642h - oie
2013-W43-6T14:33:15Z
 

Pièces jointes

  • ID_unique.xlsm
    37.2 KB · Affichages: 46
  • ID_unique.xls
    94 KB · Affichages: 45

balkan59

XLDnaute Nouveau
Re : Créer un ID à partir d'un secteur et des noms prénoms

:D Bonjour ROGER2327,
Merci pour ton Post et la patience dont tu fais par pour moi pauvre Newbees ce qui es bien avec excel et le vba en général c'est qu'on apprend tout le temps. Moi j'apprends mais j'ai du mal à voir seul la globalité des choses "du problème en fait" j'ai souvent besoin d'un appuit pour me recadrer dans la bonne direction.
Merci à toi d'avoir répondu à mon appel et d'avoir jouer ce rôle.
Si j'ai besoin je ne manquerais pas de te recontacter merci encore pour ta patience...:cool:
 

Statistiques des forums

Discussions
312 520
Messages
2 089 298
Membres
104 092
dernier inscrit
karbone57