Programme VBA
Laetitia
-
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour, Je voudrais savoir comment obtenir des séquences de quatre caractères (2chiffres, 2 lettres) avec une programmation vba. Ces séquences doivent être différentes.
4 réponses
-
Bonjour
sans doublons
nbre de combinaisons différentes: 10*10*26*26= 67600
Sub test() Dim nbre As Long nbre = 100 If nbre < 67600 Then sequences_uniques nbre End Sub '--------- Sub sequences_uniques(fin) Dim cptr As Long, xxx As Byte Dim uniq As Object Dim texto As String, liste Set uniq = CreateObject("scripting.dictionary") Range("C1:C10000").Clear Randomize For cptr = 1 To fin texto = "" 'tirage chiffres For xxx = 1 To 2 texto = texto & CStr(Int(Rnd * 10)) Next 'tirages lettres For xxx = 1 To 2 texto = texto & Chr(Int(Rnd * 26) + 65) Next If Not uniq.exists(texto) Then uniq.Add texto, texto Else cptr = cptr - 1 End If Next liste = uniq.items Range("C1:C" & UBound(liste) + 1) = Application.Transpose(liste) End Sub
-
-
-
-
-
tu fais un copier de la macro
dans XL Alt+F11
insertion- module
coller
Si tu n'as pas pas l'onglet développeur
Cliquer sur le bouton Office,
puis sur le bouton Options Excel.
Cliquer sur le menu Standard.
Cocher l'option Afficher l'onglet Développeur dans le ruban.
Cliquer sur le bouton OK pour valider.
Active le ruban développeur
dans le groupe "création"
mode création-insérer
dans contrôle de formulaire, cliquer sur le bouton
le dessiner sur la feuille et affecter la macro
Cliquer sur le bouton OK pour valider.
si les macros ne sont pas activées
Cliquer sur le bouton Office,
puis sur le bouton Options Excel.
Cliquer sur gestion confidentialité
Cliquer sur bouton paramètre de gestion..
Cliquer sur paramètres macros
cocher "activer toutes les macros
..
-
-
Bonjour,
Une solution, même si ce n'est pas la meilleure...Sub SequencesAleatoires() Dim Carac As Byte Dim Tablo() As String Tablo = Split("a;z;e;r;t;y;u;i;o;po;q;s;d;f;g;h;j;k;l;m;w;x;c;v;b;n;0;1;2;3;4;5;6;7;8;9;A;Z;E;R;T;Y;U;I;O;P;Q;S;D;F;G;H;J;K;L;M;W;X;C;V;B;N", ";") For Carac = 1 To 4 Randomize Cells(1, 1) = Cells(1, 1) & Tablo(CInt(Rnd * 62)) Next End Sub
N'hésite pas à poser des questions pour une meilleure compréhension. -
Salut,
Malgré le possible abandon du sujet par sa créatrice, je me permet de revenir ici. Au vu de la tienne Michel, je me suis rendu compte que ma solution ne répondait pas aux contraintes imposées.
J'ai donc refait le code en conservant mon schéma initial...
J'obtiens maintenant :Sub SequencesAleatoires() Dim Carac As Byte Dim Lign As Long Dim TabloLettres() As String TabloLettres = Split("a;z;e;r;t;y;u;i;o;p;q;s;d;f;g;h;j;k;l;m;w;x;c;v;b;n;A;Z;E;R;T;Y;U;I;O;P;Q;S;D;F;G;H;J;K;L;M;W;X;C;V;B;N", ";") Randomize For Lign = 1 To 100 For Carac = 1 To 2 Cells(Lign, 1) = Cells(Lign, 1) & CStr(CInt(Rnd * 10)) Next For Carac = 1 To 2 Cells(Lign, 1) = Cells(Lign, 1) & TabloLettres(CInt(Rnd * 51)) Next Next End Sub
Le problème se situe dans les chiffres.....
1- Lorsqu'il me "tire" un zéro en début de séquence, il ne l'affiche pas, même si, je pense, CStr() a transformé mon 0 en "0"...
Bon ce souci est vite réglé en mettant le format de cellule sur "texte" au lieu de "standard", mais je préfèrerais comprendre mon erreur.
2- Mon tirage aléatoire de chiffres (identique au tien) me sort des 10... Je me retrouve donc parfois avec des séquences de 3 chiffres et 2 lettres...
Mais pourquoi donc??? -
Bonjour,
a mon avis, tu envoies directement dans une cellule au lieu de concaténer par une variable string: comme il y a 2 lettres, XL gère le tout en tant que texte et accepte le zéro en t^te
Michel-
Merci.
Pour le 1- Ok, j'ai modifié en passant par une variable "String" et ça fonctionne.
Maintenant, pour le 2- j'ai toujours des 10 avec CStr(CInt(Rnd * 10)) et toi non... Donc il arrive que j'obtienne des séquences de 3 chiffres (ex : 108) et 2 lettres...
J'ai testé ta solution sur 10 000 lignes. Il ne me sort que 4 caractères, 2 chiffres et deux lettres. Ma solution, sur 100 lignes me sort (au dernier essai) 5 séquences de 5 caractères, 3 chiffres et deux lettres. Or notre méthode de tirage aléatoire des nombres est identique :
Ton code :Dim xxx As Byte Dim texto As String Randomize For cptr = 1 To fin texto = "" 'tirage chiffres For xxx = 1 To 2 texto = texto & CStr(Int(Rnd * 10)) Next
Mon code :Dim Carac As Byte Dim Val As String Randomize For Lign = 1 To 100 Val = "" For Carac = 1 To 2 Val = Val & CStr(CInt(Rnd * 10)) Cells(Lign, 7) = Val Next -
-
-
-
-