Macro pour attribuer des codes aléatoires

Résolu
ADBJ Messages postés 14 Statut Membre -  
gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
je souhaite mettre en place un système de codes (4 chiffres, de 0 à 9999 donc) pour des casiers que je louerai dans le futur. Je vous explique mon soucis.
J'ai une centaine de casiers à louer. Ma première colonne (A disons) contient les numéros de 1 à 100, et est figée. Sur la deuxième, je souhaite mettre le nom de la personne qui va louer le casier. Je veux attribuer un code associé au nom et au numéro du casier en colonne C. Le problème est qu'il faut que ce code soit unique pour que mon système de sécurité ne bug pas.

Comment je peux faire pour attribuer le numéro aléatoirement tout en vérifiant que ce numéro n'est pas déjà utilisé? J'ai regardé la fonction aléa, mais je ne vois pas comment gérer l'unicité.
Merci d'avance, et bonne journée :)

5 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour
    une autre manière (VBA aussi)
    http://www.cjoint.com/c/FIooKcywJvJ
    1
    1. ADBJ Messages postés 14 Statut Membre
       
      Merci Michel, ça c'est du beau bulot! :)
      0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour à tous les deux

    Un exemple
    http://www.cjoint.com/c/FIopcR4XzUq

    Zut, entre temps michel est arrivé ;-)
    donc bonjour à tous les trois

    Cdlmnt
    1
    1. ccm81 Messages postés 11033 Statut Membre 2 434
       
      et pour gagner quelques centièmes de seconde

      Option Explicit

      Const cocas = "A"
      Const cocod = "B"
      Const lideb = 2
      Const codmaxi = 9999
      Const codmini = 1000
      Const nbres = 100

      Public Sub OK()
      Dim t(), k1 As Long, k2 As Long, k As Long
      Dim nbcod As Long, c As Long
      ' dimensionner le tableau t des codes
      nbcod = codmaxi - codmini + 1
      ReDim t(codmini To codmaxi)
      'remplissage tableau des codes
      For k = codmini To codmaxi
      t(k) = k
      Next k
      ' mélange de t
      For k = 1 To 3 * nbcod
      k1 = 1000 + Int(Rnd * nbcod)
      k2 = 1000 + Int(Rnd * nbcod)
      c = t(k1)
      t(k1) = t(k2)
      t(k2) = c
      Next k
      ' redimensionner le tableau t avec nbres cases
      ReDim Preserve t(codmini To codmini + nbres - 1)
      ' affichage t
      Range(cocod & lideb).Resize(nbres, 1) = Application.Transpose(t)
      End Sub

      Bonne soirée
      0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    alors michel, un coup de blues ;-) ???

    ADBG> http://www.cjoint.com/c/FIpnbanGWIq

    Cdlmnt
    1
    1. ADBJ Messages postés 14 Statut Membre
       
      Ah merci! Je n'aurais pas trouvé je pense. Ma méthode ne pouvait s'appliquer que pour rechercher du texte non?
      En tout cas, c'est parfait ;)
      0
  4. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    Bonjour,
    Via formule ou via macro ?

    0
    1. ADBJ Messages postés 14 Statut Membre
       
      Une macro serait le plus propre je présume. Après, les nombres sont amenés à changer assez rarement, donc si c'est vraiment plus simple une formule peut aussi faire l'affaire!

      Merci de l'intérêt porté à mon sujet en tout cas ;)
      0
    2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
       
      En VBA .. pour générer un nombre aléatore c'est RND (et non ..alea)
      Int ((999 - 100 + 1) * Rnd + 100)
      'Result: random number between 100 and 999
      


      Pour envuite vérifier que ce nombre n'est pas déjà utilisé... tu peux très bien utiliser la méthode FIND pour le chercher dans ta feuille.
      https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel

      Le tout dans une boucle WHILE (tant que le nombre existe... alors je refais un random + un find.
      Si le find ne me retourne rien.. alors c'est bon je peux continuer mon cde
      While condition
      Actions
      Wend
      
      0
    3. ADBJ Messages postés 14 Statut Membre
       
      J'ai compris vos méthodes, et je veux peaufiner un peu le truc.
      Je souhaiterais pouvoir vérifier si un code est déjà pris. Par exemple, un client me dit qu'il aimerait avoir le numéro 5632. J'ai crée une macro, je tape sur le bouton générer. Je peux alors taper ce code 5632. Il doit me dire si ce numéro est dispo. Je pensais avoir bien compris la commande find,mais visiblement non. Ma méthode find semble me retourner toujours "nothing".

      Je ne comprends pas trop ce qui cloche.
      Voici mon fichier, avec ma macro :)
      http://www.cjoint.com/c/FIpkTd1fQQl
      0
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > ADBJ Messages postés 14 Statut Membre
       
      et si on fait ce que tu demandes, que demanderas tu ENCORE après....?

      taillable et corvéable à merci....
      0
    5. ADBJ Messages postés 14 Statut Membre
       
      Je ne cherche qu'à apprendre, et j'ai fais l'effort de proposer une solution. Je ne comprends pas pourquoi mon projet ne fonctionne pas. Ça doit être une subtilité du "Find", commande gentillement proposée par Jordane.

      J'avoue ne pas trop comprendre cette agressivité soudaine. Mais si quelqu'un de bienveillant pouvait jeter un oeil et m'orienté, je lui serait très reconnaissant.

      S'il est interdit de poser deux questions successives sur ce forum d'aide, qu'on me le dise, je m'excuserai...
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    Bonjour à tous,

    Même si le sujet est résolu, je te propose une solution un peu différente.

    Je ne cherche qu'à apprendre,
    Voilà donc une solution avec un formulaire qui te permettra de voir ce qu'il est possible d'obtenir.

    https://www.cjoint.com/c/FIqjnJnorBl

    Bon test.
    0