Signaler

Macro pour attribuer des codes aléatoires [Résolu]

Posez votre question ADBJ 9Messages postés dimanche 14 août 2016Date d'inscription 15 septembre 2016 Dernière intervention - Dernière réponse le 16 sept. 2016 à 11:14
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 :)
Afficher la suite 
Utile
+1
moins plus
Bonjour
une autre manière (VBA aussi)
http://www.cjoint.com/c/FIooKcywJvJ
ADBJ 9Messages postés dimanche 14 août 2016Date d'inscription 15 septembre 2016 Dernière intervention - 14 sept. 2016 à 16:48
Merci Michel, ça c'est du beau bulot! :)
Répondre
Ajouter un commentaire
Utile
+1
moins plus
Bonjour à tous les deux

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

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

Cdlmnt
ccm81 6961Messages postés lundi 18 octobre 2010Date d'inscription 25 septembre 2016 Dernière intervention - 14 sept. 2016 à 20:21
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
Répondre
Ajouter un commentaire
Utile
+1
moins plus
alors michel, un coup de blues ;-) ???

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

Cdlmnt
ADBJ 9Messages postés dimanche 14 août 2016Date d'inscription 15 septembre 2016 Dernière intervention - 15 sept. 2016 à 15:36
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 ;)
Répondre
Ajouter un commentaire
Utile
+0
moins plus
Bonjour,
Via formule ou via macro ?

jordane45 14575Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 26 septembre 2016 Dernière intervention - 14 sept. 2016 à 16:06
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.
http://www.commentcamarche.net/faq/36886-vba-recherche-de-donnees-la-methode-find

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
Répondre
ADBJ 9Messages postés dimanche 14 août 2016Date d'inscription 15 septembre 2016 Dernière intervention - 15 sept. 2016 à 12:48
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
Répondre
michel_m 13950Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 26 septembre 2016 Dernière intervention - 15 sept. 2016 à 14:08
et si on fait ce que tu demandes, que demanderas tu ENCORE après....?

taillable et corvéable à merci....
Répondre
ADBJ 9Messages postés dimanche 14 août 2016Date d'inscription 15 septembre 2016 Dernière intervention - 15 sept. 2016 à 15:01
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...
Répondre
michel_m 13950Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 26 septembre 2016 Dernière intervention - 15 sept. 2016 à 16:57
puisque tu veux apprendre, sache qu'une solution informatique passe par la définition complète et claire de ce que l'on obtenir . c'est le système d'information (méthode Merise)
sur ta première demande, je t'ai fourni une solution simple qui fonctionne et que tu as apprécié (merci) et qui référenciée dans la FAQ du site "développez.com"

si tu avais précisé au départ "Pour peaufiner 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'aurais étudié une solution tout autre.

Il faut bien te rendre compte que ce que tu demandes n'est pas forcément facile et que personne ne veut passer parfois plusieurs heures à essayer de résoudre un problème bénévolement pour se voir dire après coup « il faut en plus que.... »


.
Répondre
Ajouter un commentaire
Utile
+0
moins plus
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.

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

Bon test.
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !