J'ai un code qui génère des chaînes aléatoires de caractères (mots de passe) contenant exactement 8 caractères. Mon problème est qu'il ne remplit que des chiffres et des caractères.
1) J'aimerais inclure des caractères spéciaux au mélange et assurez-vous que au moins un caractère spécial est toujours inclus dans chaque chaîne. P>
2 ) Je dois ajouter une condition que chaque chaîne contient toujours au moins un caractère majuscule, au moins un minuscule, au moins un nombre. P>
C'est le code que j'ai mais je ne peux pas comprendre Comment inclure ces conditions pour le faire fonctionner comme dont j'ai besoin. J'ai essayé beaucoup de googling pour le faire fonctionner spécifiquement pour ce code mais ne peut pas le comprendre. Pouvez-vous s'il vous plaît conseiller? P>
Sub MakeRandom()
Dim J As Integer
Dim K As Integer
Dim L As Double
Dim iTemp As Integer
Dim sNumber As String
Dim bOK As Boolean
Range("G5:G148").Activate
Randomize
L = InputBox("Amount of Passwords:")
For J = 1 To L
sNumber = ""
For K = 1 To 8
Do
iTemp = Int((122 - 48 + 1) * Rnd + 48)
Select Case iTemp
Case 48 To 57, 97 To 122
bOK = True
Case Else
bOK = False
End Select
Loop Until bOK
bOK = False
sNumber = sNumber & Chr(iTemp)
Next K
ActiveCell.Value = sNumber
ActiveCell.Offset(1, 0).Select
Next J
End Sub
3 Réponses :
Pourquoi ne pas introduire de longues chaînes, contenant tous les caractères légaux, puis avoir les caractères de votre algue de positions aléatoires de cette chaîne? De cette façon, vous avez un contrôle facile de ce qui peut être dans vos mots de passe. P>
Pour que les conditions soient vraies, je placerais la génération de mot de passe dans une boucle infinie, qui ne finit que lorsque toutes les conditions sont satisfaites. Tant que cela est réellement possible (c'est-à-dire que vos conditions peuvent toutes être vraies en même temps), cette boucle finira par finir (en raison de la loi des grands nombres). p>
J'ai quelque chose qui pourrait vous aider. J'utilise une méthode différente, mais le résultat devrait être similaire. Je l'ai adapté à vos contraintes, mais j'ai peut-être manqué quelque chose.
Mine fonctionne comme ceci: j'ai une feuille appelée Un tableau est conçu pour stocker les caractères et créer la chaîne aléatoire. Le tableau contient 3 'colonnes'. Le premier donne un nombre compris entre 1 et 4 pour déterminer à partir de quelle colonne il devrait obtenir son caractère. Les quatre premiers sont toujours 1,2,3,4 pour veiller à ce que chaque type de caractère soit utilisé au moins une fois. Les 4 autres (ou plus si la chaîne aléatoire est plus longue) sont remplies au hasard. P> La deuxième "colonne" est ensuite remplie avec le caractère réel à ajouter à la chaîne aléatoire. Et enfin la troisième "colonne" est remplie de zéros. Celles-ci seront utilisées pour suivre quels caractères ont été utilisés dans la chaîne aléatoire. P> une fois que la matrice a été remplie, le à la fin de votre chaîne aléatoire est dans la variable Si vous souhaitez créer plusieurs chaînes en une fois, je suggérerais d'écrire un petit utilisateur de l'appelant, qui appelle celui-ci x quantité de fois. Ou ajoutez une boucle et une boîte à entrée dans celui-ci. P> espère que cela aide. P> chrrsrc code> avec tous les caractères que je veux pouvoir inclure dans la chaîne . Les caractères ont été divisés en quatre colonnes. De la colonne A à D Il est des lettres minuscules, des lettres majuscules, des chiffres, des caractères spéciaux. P> DOLE TOUT tandis que la boucle code> est utilisée pour sélectionner l'ordre des caractères. au hasard. Une fois qu'un caractère a été ajouté, le zéro de la matrice est changé en un, pour vous assurer que chaque caractère est utilisé une fois. P> aléatoire code> et vous pouvez l'écrire à une cellule ou faire quoi que ce soit avec elle. p>
activate code> et sélectionner code>. Dans votre cas, vous pouvez créer un tableau de chaînes aléatoires, puis écrivez la matrice sur la feuille. La longueur de la matrice pourrait être contrôlée par la valeur renvoyée par entréebox code>. Li>
- Votre code peut bénéficier de:
l = entréebox ("quantité de mots de passe:", type: = 1) code> qui, si je lis la documentation correctement, valide que l'entrée est numérique. li>
- Ma compréhension est que vous devez utiliser le type
long code> au lieu de entier code> dans des circonstances normales (comme integer code> s est désormais converti en Long code> s sous la hotte). De plus, dans ce contexte où vous recevez une entrée de l'utilisateur arbitraire, INTEGER CODE> Type Overflows à 32768. Si vous entrez 32768 (par exemple) ou tout numéro plus grand dans la section INPUTBOX CODE> devrait voir une erreur de débordement non gérée. LI>
En référence à l'approche décrite dans cette réponse ( https://stackoverflow.com/a/57903244/8811778 ): p> xxx pré>
- Ce n'est que mon interprétation de l'approche postée par l'utilisateur. Cet utilisateur a peut-être mis en œuvre leur approche différemment. LI>
- la majorité du travail est effectué par le
GetRandomcharActersfromText code>. LI>
- Vous pouvez probablement vous débarrasser du
pour K = 1 à 8 CODE> BOOP et remplacer par quelque chose comme ActiveCell.value = Createrecell.Value = CreaterAndomstring (longueur de l'encombrement: = 1, minimumcountofsymbols : = 1) code> (bien que vous devriez éviter d'utiliser ActiveCell CODE> et, en général, s'appuyer sur des objets à être actifs). LI>
- Enfin, sur la base de certaines parties de votre code, il semble que ce code est destiné à générer des mots de passe. Je ne suis pas expert en matière de sécurité, je m'abstiendrai de fournir des suggestions / conseils liés à la sécurité. Vous pouvez ou non profiter de la lecture https://xkcd.com/936/ 2/a> et la discussion associée < Un href = "https://security.stackexchange.com/a/6096/71460"> https://security.stackexchange.com/a/6096/71460 . li>
ul> ul>