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

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

NONO14

XLDnaute Impliqué
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
Bonjour Staple1600,
J'ai mis ton code en place et ça fonctionne bien, il réponds à mes attentes.
Par contre, je dois ajouter les deux derniers chiffes de l'année en cours, sachant que dans la feuille "Données" il y a une cellule nommée...

NONO14

XLDnaute Impliqué
Me voilà revenu. Désolé d'avoir tardé à te répondre.
Je n'ai pas testé ton code car il a fallut restructuré mon application, mais je vais m'en servir car je dois revoir le code agent et ta proposition va beaucoup m'aider en ce sens.
Encore mille excuses pour le retard de près d'une semaine.
 

NONO14

XLDnaute Impliqué
Bonjour Staple1600,
J'ai mis ton code en place et ça fonctionne bien, il réponds à mes attentes.
Par contre, je dois ajouter les deux derniers chiffes de l'année en cours, sachant que dans la feuille "Données" il y a une cellule nommée "Année" où se trouve l'année en cours. Ces chiffres doivent être en premier, ensuite les 3 premières lettres du Nom et ensuite ton code.
Voici le code dans mon formulaire et qui se rapporte à Txt_Nom.
Merci par avance pour ton aide
 

NONO14

XLDnaute Impliqué
J'ai trouvé la solution.
Voici le code
VB:
Private Sub Txt_Nom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim CurrentYear As String
Application.ScreenUpdating = False

    CurrentYear = Right(Year(Date), 2)
    
    If Me.Txt_Code.Value <> "" Then Exit Sub
    
        With Me.Txt_Code
        .Value = CurrentYear & Left(Me.Txt_Nom, 3) & Cod
        End With
End Sub
 

Staple1600

XLDnaute Barbatruc
Bonjour @NONO14

Bravo

J'allais poster cette variation de la fonction
(comme c'est fait, je poste)
VB:
Function cod() As String
[IV1600].Formula2 = "=TEXTJOIN("""",1,INDEX(CHAR(VSTACK(SEQUENCE(26,1,65,1),SEQUENCE(10,1,48,1))),RANDARRAY(10,1,1,36,-1)))"
pref = Format(Date, "yy")
cod = pref & Range("IV1600").Value
End Function
Sub test()
Randomize
MsgBox cod
End Sub
Ton CurrentYear peut s'écrire comme je l'ai fait
CurrentYear=Format(Date, "yy")
 

NONO14

XLDnaute Impliqué
Bonjour Staple1600,
Merci pour ta réponse. Mais pour une fois que j'arrive à trouver tout seul, je vais garder mon code.
Cependant, je conserve ta proposition.
 

NONO14

XLDnaute Impliqué
Hello !,
J'avais lu quelque part que désactivez l'actualisation de l'écran permettait d'accélérer l'exécution du code de la macro. On ne peut pas voir l'action de la macro, mais elle s'exécutera plus rapidement.
 

TooFatBoy

XLDnaute Barbatruc
J'avais lu quelque part que désactivez l'actualisation de l'écran permettait d'accélérer l'exécution du code de la macro. On ne peut pas voir l'action de la macro, mais elle s'exécutera plus rapidement.
C'est exact.

D'après ce que j'en sais :
- C'est inutile si tu n'écris pas dans une feuille.
- À la fin d'une macro le ScreenUpdating passerait automatiquement à True, donc ça pourrait désactiver le ScreenUpdating False de la macro appelante.
 

Staple1600

XLDnaute Barbatruc
Je reviens un instant sur cette discussion afin de demander une précision.
Si je ne souhaite que des chiffres dans ma combinaison, comment dois-je procéder ?
Merci par avance
@NONO14
Pour n'avoir que des chiffres, voir cette adaptation de ma précédente fonction
VB:
Sub test_3()
Randomize
xxx = cod
MsgBox xxx
yyy = cod(8)
MsgBox yyy
End Sub

Private Function cod(Optional Nb_Car = 5) As String
[IV1600].Formula2 = "=TEXTJOIN("""",1,CHAR(INDEX(SEQUENCE(10,1,48,1),RANDARRAY(" & Nb_Car & ",1,1,10,TRUE))))"
cod = Range("IV1600").Value
End Function
La fonction est paramétrable.
On peut choisir le nombre de caractère (par défaut c'est 5)
 

NONO14

XLDnaute Impliqué
Super, merci beaucoup et en plus ça fonctionne
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…