Programme VBA

Laetitia -  
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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    
    

    1
    1. Laetitia
       
      Je me retrouve plus dans la programmation. j'ai encore besoin de vous. Lorque j'ai entrer le programme comment je lapplique a ma feuille excel?
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      quelle version Excel?
      0
    3. Laetitia
       
      Word 2007
      0
    4. Laetitia
       
      Pardon excel 2007
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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


      ..
      0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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.
    0
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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???
    0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
      0
    2. Laetitia
       
      Merci beaucoup pour l'aide dsl de rpdre que maintenant. Je vais voir ce que ca donne.
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut laetitia,
      Utilise la méthode de michel :
      1- elle fonctionne,
      2- elle est plus rapide...
      0
    4. Laetitia
       
      Ok merci encore pour l'aide
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      bonjourLaetitia,

      Pijaku,

      essaies cette tite démo
      Sub zero()
      MsgBox 0 & "A"
      End Sub

      heu.... Val est un mot réservé par VBA

      essaies
      0