Microsoft 365 Code fonction pour création code aléatoire

NONO14

XLDnaute Occasionnel
Bonjour à toutes et à tous,
Comment à partir de cette fonction, créée par patricktoulon que je remercie au passage, peut-on placer les chiffres en premiers et les lettres à la suite, pour former par exemple 123abc. Ce code viendra s'ajouter au 3 premières lettres du Nom de la TextBox1 comme indiqué dans le 2ème code.
Il faut donc au final que le code ressemble à ça : (si le NOM est DUPONT) DUP123abc
La fonction CodeEmp fonctionne bien, mais mélange les lettres et les chiffres.
J'espère avoir été assez clair dans mes explications.

VB:
Function CodeEmp(Optional NbChar& = 0, Optional NbNum& = 0)
Dim Y&, C&, L

    If NbChar = 0 Then NbChar = 2 + (Round(Rnd * 6))
    If NbNum = 0 Then NbNum = 2 + (Round(Rnd * 3))
    
    Set Dico = CreateObject("Scripting.Dictionary")
    StrLettres = Split(StrConv("abcdefghijklmnopqrstuvwxyz", vbUnicode), Chr(0))
    StrChiffres = Split(StrConv("0123456789", vbUnicode), Chr(0))
    
    Do While Dico.Count < NbChar
        Y = Round(Rnd * UBound(StrLettres))
        Dico(StrLettres(Y)) = ""
    Loop
    
    Do While Dico.Count < NbChar + NbNum
        Y = Round(Rnd * UBound(StrChiffres))
        Dico(StrChiffres(Y)) = ""
    Loop
    
    L = Dico.Keys
    For C = 1 To 7
        y1 = Round(Rnd * UBound(L))
        y2 = Round(Rnd * UBound(L))
        yy = L(y1)
        L(y1) = L(y2): L(y2) = yy
    Next C
    
    CodeEmp = Join(L, "")
End Function

Code:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With Me.TextBox3
        .Value = Left(Me.TextBox1, 3) & CodeEmp(3, 3)
        .SelStart = 100
    End With
        
    With Me.TextBox4
        .Value = CreatePassWord(5, 2)
        .SelStart = 100
    End With
End Sub
 
Solution
Voici la solution apportée par Jean marie et que je remercie encore

VB:
Function CodeEmp(Optional NbChar& = 0, Optional NbNum& = 0) As String
    Dim Y&, DicoLettres As Object, DicoChiffres As Object
    Dim StrLettres() As String, StrChiffres() As String, CodeFinale As String

    ' Initialisation des valeurs par défaut si elles ne sont pas spécifiées
    If NbChar = 0 Then NbChar = 2 + (Round(Rnd * 6)) ' Nombre de lettres
    If NbNum = 0 Then NbNum = 2 + (Round(Rnd * 3))  ' Nombre de chiffres
    
    ' Création de deux dictionnaires distincts
    Set DicoLettres = CreateObject("Scripting.Dictionary")
    Set DicoChiffres = CreateObject("Scripting.Dictionary")

    ' Tableaux contenant les lettres et chiffres
    StrLettres =...

NONO14

XLDnaute Occasionnel
Voici la solution apportée par Jean marie et que je remercie encore

VB:
Function CodeEmp(Optional NbChar& = 0, Optional NbNum& = 0) As String
    Dim Y&, DicoLettres As Object, DicoChiffres As Object
    Dim StrLettres() As String, StrChiffres() As String, CodeFinale As String

    ' Initialisation des valeurs par défaut si elles ne sont pas spécifiées
    If NbChar = 0 Then NbChar = 2 + (Round(Rnd * 6)) ' Nombre de lettres
    If NbNum = 0 Then NbNum = 2 + (Round(Rnd * 3))  ' Nombre de chiffres
    
    ' Création de deux dictionnaires distincts
    Set DicoLettres = CreateObject("Scripting.Dictionary")
    Set DicoChiffres = CreateObject("Scripting.Dictionary")

    ' Tableaux contenant les lettres et chiffres
    StrLettres = Split(StrConv("abcdefghijklmnopqrstuvwxyz", vbUnicode), Chr(0))
    StrChiffres = Split(StrConv("0123456789", vbUnicode), Chr(0))

    ' Remplir le dictionnaire avec les lettres
    Do While DicoLettres.Count < NbChar
        Y = Round(Rnd * UBound(StrLettres))
        DicoLettres(StrLettres(Y)) = ""
    Loop
    
    ' Remplir le dictionnaire avec les chiffres
    Do While DicoChiffres.Count < NbNum
        Y = Round(Rnd * UBound(StrChiffres))
        DicoChiffres(StrChiffres(Y)) = ""
    Loop
    
    ' Créer la chaîne finale : d'abord les chiffres, ensuite les lettres
    CodeFinale = Join(DicoChiffres.Keys, "") & Join(DicoLettres.Keys, "")
    
    ' Retourner le code généré
    CodeEmp = CodeFinale
End Function
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 017
Messages
2 104 583
Membres
109 084
dernier inscrit
mizab