Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tirage aléatoire et remplissage

14 réponses
Avatar
LeSoviet
Bonjour,

Je cherche =E0 faire un tirage al=E9atoire sous la forme suivante :

Sur mon form, j'ai une zone de liste contenant des noms et autant de
zones de texte que de noms.
J'aimerai que sur clic d'un bouton, il y ait un tirage al=E9atoire des
noms contenus dans la zone de liste et que cela remplisse les zones de
texte (celles-ci sont nomm=E9es num=E9riquement/ ex : Txtbox1,... , TxtboxN)
jusqu'=E0 ce qu'il n'y ait plus de noms dans la liste.

Je n'arrive pas =E0 mettre en place cette fonction. Qqun aurait-il une
id=E9e ?

Merci d'avance

10 réponses

1 2
Avatar
Raymond [mvp]
Bonjour.

une petite idée pour exemple à adapter à ta situation.
soit Liste1 une zone de liste
soit texte1....Texte26, 26 zones de texte
liste1 contient les lettres de l'alphabet

on peut écrire cette fonction:
Public Sub Commande0_Click()
Dim DataListe As String
DataListe =
"'A';'B';'C';'D';'E';'F';'G';'H';'I';'J';'K';'L';'M';'N';'O';'P';'Q';'R';'S';'T';'U';'V';'W';'X';'Y';'Z';"
Me.Liste1.RowSource = DataListe
Randomize
Dim I As Integer
Dim J As Integer
For J = 1 To Me.Liste1.ListCount
I = Int((Me.Liste1.ListCount * Rnd) + 1)
Me("texte" & J) = Me.Liste1.ItemData(I - 1)
Me.Liste1.RowSource = Replace(Me.Liste1.RowSource, "'" &
Me.Liste1.ItemData(I - 1) & "';", "")
Next J
Me.Liste1.RowSource = DataListe
End Sub

les deux premières lignes sont là pour charger les données que tu dois avoir
dans des variables ou tables.

--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/

Le multimédia vu par Windows Vista, Office 2007 et Windows Live !!!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"LeSoviet" a écrit dans le message de news:

Bonjour,

Je cherche à faire un tirage aléatoire sous la forme suivante :

Sur mon form, j'ai une zone de liste contenant des noms et autant de
zones de texte que de noms.
J'aimerai que sur clic d'un bouton, il y ait un tirage aléatoire des
noms contenus dans la zone de liste et que cela remplisse les zones de
texte (celles-ci sont nommées numériquement/ ex : Txtbox1,... , TxtboxN)
jusqu'à ce qu'il n'y ait plus de noms dans la liste.

Je n'arrive pas à mettre en place cette fonction. Qqun aurait-il une
idée ?

Merci d'avance
Avatar
LeSoviet
Bonjour Raymond,

Je ne comprend pas bien le sens de ton code sur plusieurs points mais
je précise qu'en amont du clic, la liste a déjà un rowsource (j'aurai
dû le préciser dans mon premier message) :

- Je ne vois pas où se décrémente (? ) le rowsource de la liste apr ès
que la fonction ait fait un choix, ni où est renvoye ce choix dans une
zone de texte.
-Je ne comprends pas bien le sens de "les deux premières lignes sont
là pour charger les données que tu dois avoir
dans des variables ou tables."

Merci beaucoup pour ton aide
Avatar
LeSoviet
Re,

Bon j'avance un peu (j'arrive à faire fonctionner le code de Command0)
mais c'est pas encore ça.

Je réexplique le contexte :
-1 zone de liste ayant une requête (2 champs) en rowsource. A partir
de l'exemple de l'alphabet, le contenu de la reqûete serait le
suivant : 1 champ pour les chiffres (de 1 à 26), le 2ème pour les
lettres (de A à Z).

-Après le clic sur Command0, je remplis Text1 par le champ1 (ici les
chiffres) du 1er enregistrement tiré de façon aléatoire et Text2 par
le 2éme champ (les lettres) du même enregistrement, etc jusqu'à
épuisement. D'où ici 52 Textbox.

Cependant, j'ai une erreur éxécution '3163' (Champ trop petit...) sur
Me("texte" & J) = Me.Liste1.ItemData(I - 1).
Y a t il un moyen pour ne récupérer que le champ concerné dans
Me.Liste1.ItemData(I - 1) ? (J'ai essayé avec Column. sans succès)

Encore merci pour l'aide apportée
Avatar
Raymond [mvp]
comme je te l'ai dit, c'est un exemple (qui fonctionne) pour te montrer
qu'on peut le faire mais qu'il est à adapter à tes besoins.
le fait que la source soit une requête va te poser des problèmes et il
vaudrait mieux travailler sur une table temporaire créée par cette requête
justement, mais est-ce possible à faire ? toute la difficulté réside dans le
fait de supprimer provisoirement les infos d'un recordset ou d'un tableau.
ne serait-il pas préférable de créér une nouvelle requête en partant de ta
requête actuelle et en ajoutant un champ de valeur aléatoire et de la trier
sur ce champ. ensuite les contrôles texte seraient remplis dans l'ordre de
la requête. cà me semble la solution la plus simple à mettre en oeuvre et si
tu es d'accord on peut voir ce que ça donne. dans ce cas pour travailler sur
des éléments réels, donne nous les noms exacts des objets, listes, table,
requête etc...

--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/

Le multimédia vu par Windows Vista, Office 2007 et Windows Live !!!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"LeSoviet" a écrit dans le message de news:

Re,

Bon j'avance un peu (j'arrive à faire fonctionner le code de Command0)
mais c'est pas encore ça.

Je réexplique le contexte :
-1 zone de liste ayant une requête (2 champs) en rowsource. A partir
de l'exemple de l'alphabet, le contenu de la reqûete serait le
suivant : 1 champ pour les chiffres (de 1 à 26), le 2ème pour les
lettres (de A à Z).

-Après le clic sur Command0, je remplis Text1 par le champ1 (ici les
chiffres) du 1er enregistrement tiré de façon aléatoire et Text2 par
le 2éme champ (les lettres) du même enregistrement, etc jusqu'à
épuisement. D'où ici 52 Textbox.

Cependant, j'ai une erreur éxécution '3163' (Champ trop petit...) sur
Me("texte" & J) = Me.Liste1.ItemData(I - 1).
Y a t il un moyen pour ne récupérer que le champ concerné dans
Me.Liste1.ItemData(I - 1) ? (J'ai essayé avec Column. sans succès)

Encore merci pour l'aide apportée
Avatar
LeSoviet
Re,

Je vais un peu simplifier :
-Table : TblClient
-Formulaire : FrmEnvoiClient
-Zone de liste : lstClient
-Requête qui alimente la zone de liste : ReqClient
-Zones de texte : Nompre (de 1 à x) nommées Nompre1 à Nomprex
Societe (de 1 à x) nommées Societe1 à Societex

Sur la propriété Sur_Chargement de FrmEnvoiClient, j'ai :
Me. FrmEnvoiClient.Rowsource = "SELECT IdClient, Nompre, Societe FROM
ReqClient ;"


Voilà pour la structure. Par contre, dans la mesure du possible,
j'aimerai que tout passe par le code (genre fonction dans un module).

Un très grand merci pour ton aide
Avatar
Raymond [mvp]
ne me prends pas pour un tatillon mais ne serait-ce pas plutôt:

Me. lstClient.Rowsource = "SELECT IdClient, Nompre, Societe FROM
ReqClient ;"
et non
Me. FrmEnvoiClient.Rowsource = "SELECT IdClient, Nompre, Societe FROM
ReqClient ;"

questions subsidiaires quand même:
y-a-t-il une limite dans le nombre de contrôles texte Nomprex ou faut-il la
prévoir ?
que devient la liste après remplissage des contrôels texte, elle reste
identique, elle est vidée ?

--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/

Le multimédia vu par Windows Vista, Office 2007 et Windows Live !!!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"LeSoviet" a écrit dans le message de news:

Re,

Je vais un peu simplifier :
-Table : TblClient
-Formulaire : FrmEnvoiClient
-Zone de liste : lstClient
-Requête qui alimente la zone de liste : ReqClient
-Zones de texte : Nompre (de 1 à x) nommées Nompre1 à Nomprex
Societe (de 1 à x) nommées Societe1 à Societex

Sur la propriété Sur_Chargement de FrmEnvoiClient, j'ai :
Me. FrmEnvoiClient.Rowsource = "SELECT IdClient, Nompre, Societe FROM
ReqClient ;"


Voilà pour la structure. Par contre, dans la mesure du possible,
j'aimerai que tout passe par le code (genre fonction dans un module).

Un très grand merci pour ton aide
Avatar
LeSoviet
Oui pour la boulette, c'est bien :
Me. lstClient.Rowsource = "SELECT IdClient, Nompre, Societe FROM
ReqClient ;"

-la limite dans le nombre de contrôles texte Nomprex et Societex est
le nombre d'enregistrements contenus dans ReqClient.
-Après le tirage, la liste est toujours remplie par le contenu du
départ (peu importe l'ordre ici je pense).

Merci beaucoup pour ton aide
Avatar
Raymond [mvp]
Tu peux essayer ceci:

créer une requête nommée ReqListe qui contient:
SELECT IdClient, Nompre, Societe, aleatoire([idclient]) AS Ordre
FROM TblClient ORDER BY aleatoire([idclient]);

Créer un module standard nommé n'importe comment qui contient:
Option Compare Database
Option Explicit
Public Function aleatoire(IdClient As Long) As String
Randomize IdClient
aleatoire = Format((DCount("*", "tblclient") * Rnd) + 1, "000.000000")
End Function

créer l'événement suivant dans le formulaire FrmEnvoiClient
Private Sub Form_Load()
Dim Db As DAO.Database
Dim Rs As DAO.Recordset
Dim I As Integer
Set Db = CurrentDb
Set Rs = Db.OpenRecordset("SELECT IdClient, Nompre, Societe,
aleatoire([idclient]) AS Ordre FROM TblClient ORDER BY
aleatoire([idclient]);")
If Not Rs.BOF Then
I = 1
Do Until Rs.EOF
Me("nompre" & I) = Rs("Nompre")
Me("Societe" & I) = Rs("societe")
I = I + 1
Rs.MoveNext
Loop
End If
Set Rs = Nothing
Set Db = Nothing
End Sub

c'est tout.

il n'y a pas de test de dépassement de la requête sur le nombre de
contrôles.
--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/

Le multimédia vu par Windows Vista, Office 2007 et Windows Live !!!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"LeSoviet" a écrit dans le message de news:

Oui pour la boulette, c'est bien :
Me. lstClient.Rowsource = "SELECT IdClient, Nompre, Societe FROM
ReqClient ;"

-la limite dans le nombre de contrôles texte Nomprex et Societex est
le nombre d'enregistrements contenus dans ReqClient.
-Après le tirage, la liste est toujours remplie par le contenu du
départ (peu importe l'ordre ici je pense).

Merci beaucoup pour ton aide
Avatar
Raymond [mvp]
.../...
la requête n'est pas obligatoire, elle fait double emploi. dans le code vba
soit tu laisses le code comme ça soit tu le remplaces par le nom de la
requête, au plus simple pour toi.

| Set Rs = Db.OpenRecordset("SELECT IdClient, Nompre, Societe,
| aleatoire([idclient]) AS Ordre FROM TblClient ORDER BY
| aleatoire([idclient]);")

ou
Set Rs = Db.OpenRecordset("ReqListe")

--
@+
Raymond Access MVP http://OfficeSystem.Access.free.fr/
Pour débuter sur le forum: http://www.mpfa.info/

Le multimédia vu par Windows Vista, Office 2007 et Windows Live !!!
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273


"Raymond [mvp]" a écrit dans le message
de news:
| Tu peux essayer ceci:
|
| créer une requête nommée ReqListe qui contient:
| SELECT IdClient, Nompre, Societe, aleatoire([idclient]) AS Ordre
| FROM TblClient ORDER BY aleatoire([idclient]);
|
| Créer un module standard nommé n'importe comment qui contient:
| Option Compare Database
| Option Explicit
| Public Function aleatoire(IdClient As Long) As String
| Randomize IdClient
| aleatoire = Format((DCount("*", "tblclient") * Rnd) + 1, "000.000000")
| End Function
|
| créer l'événement suivant dans le formulaire FrmEnvoiClient
| Private Sub Form_Load()
| Dim Db As DAO.Database
| Dim Rs As DAO.Recordset
| Dim I As Integer
| Set Db = CurrentDb
| Set Rs = Db.OpenRecordset("SELECT IdClient, Nompre, Societe,
| aleatoire([idclient]) AS Ordre FROM TblClient ORDER BY
| aleatoire([idclient]);")
| If Not Rs.BOF Then
| I = 1
| Do Until Rs.EOF
| Me("nompre" & I) = Rs("Nompre")
| Me("Societe" & I) = Rs("societe")
| I = I + 1
| Rs.MoveNext
| Loop
| End If
| Set Rs = Nothing
| Set Db = Nothing
| End Sub
|
| c'est tout.
|
| il n'y a pas de test de dépassement de la requête sur le nombre de
| contrôles.
| --
| @+
| Raymond Access MVP http://OfficeSystem.Access.free.fr/
| Pour débuter sur le forum: http://www.mpfa.info/
|
| Le multimédia vu par Windows Vista, Office 2007 et Windows Live !!!
|
http://www.comscamp.com/Tracker/Redirect.ashx?linkid°64304e-439a-45c7-9d2f-c3326db58273
|
|
| "LeSoviet" a écrit dans le message de news:
|
| Oui pour la boulette, c'est bien :
| Me. lstClient.Rowsource = "SELECT IdClient, Nompre, Societe FROM
| ReqClient ;"
|
| -la limite dans le nombre de contrôles texte Nomprex et Societex est
| le nombre d'enregistrements contenus dans ReqClient.
| -Après le tirage, la liste est toujours remplie par le contenu du
| départ (peu importe l'ordre ici je pense).
|
| Merci beaucoup pour ton aide
|
|
|
|
Avatar
LeSoviet
Bonjour Raymond,

J'ai suivi tes conseils (création de la fonction dans un module,
création d'une requête ou non, code sur chargement du formulaire...)
mais j'ai un message d'erreur (3061 : trop peu de paramètres. 1
attendu) sur cette ligne :
Set Rs = Db.OpenRecordset("SELECT IdClient, Nompre, Societe,
aleatoire([IdClient]) AS Ordre FROM TblClient ORDER BY
aleatoire(IdClient]);")

Merci beaucoup pour ton aide
1 2