OVH Cloud OVH Cloud

Comment trier une table de manière aléatoire ?

16 réponses
Avatar
Luc Voeltzel
Bonjour à tous,

Quelqu'un sait-il comment trier une table de manière aléatoire ?

L'idée est de construire une base de donnée dont les éléments puissent être
tirés de manière aléatoire et affichés sous forme de formulaire. Un lecture
répétée de ces fiches tirées de façon aléatoire faciliterait ainsi
l'apprentissage de leur contenu.

NB : Question d'un débutant en access, mais qui connait un peu VBA appliqué
à Excel.

6 réponses

1 2
Avatar
Eric
Bonjour,

Pourquoi créer une nouvelle table puisqu'il s'agit seulement d'un tirage
aléatoire?

J'aurais tendance à créer une requête me retournant les enregistrements
de manière aléatoire et construirais un formulaire sur cette requête.
Pour cela, voir ici le code générant un jeu d'enregistrements aléatoires
sur une table : http://www.mvps.org/accessfr/queries/qry0011.htm
Cette exemple montre comment extraire 100 enregistrements de manière
aléatoire mais tu peux virer le Top 100 si tu les veux tous ou le
réduire (Top 10).

A chaque ouverture du formulaire, un nouveau jeu est tiré. Les
enregistrements peuvent se répéter, en partie, d'un jeu à l'autre.

Oups, il n'y a pas de table Orders, seulement une table 1 qui sert de
données sources. La mention Orders dans le code VBA concernait seulement un
essai de tri.(pas adpté)

Les champs de la table 1 sont :
clef : NuméroAuto (clef primaire)
catégorie : Texte
phrase1: Texte
type : texte
commentaire1 : Mémo
antonyme : texte
source : Numérique

Vous l'avez peut-être compris, il s'agit d'un répertoire pour apprendre les
langues.

maTable est la table cible qui doit reprendre les enregistrement de la table
1 selon un tirage aléatoire.

Si vous arrivez à faire quelque chose avec ça.... ):-(

Merci pour toute aide,

Luc



"ze Titi" a écrit dans le message de
news:

Bonjour Luc Voeltzel

donne nous la structure de ta table Table1 et de ta table Orders.


Dans ton message du lundi

Je n'y arrive pas.

L'idée est d'effacer ma table :
DoCmd.RunSQL "DELETE * FROM Matable" CA MARCHE

mais pour ce qui est de la remplir, c'est une autre affaire. Je ne



connais

rien à SQL.

Faut-il utliser une boucle du genre ?

For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i

Peut-être mais je n'arrive même pas jusque là, étant donnés mes lacunes



en

programmation access.


Est ce que quelqu'un y arrive ?


Pour information, le code que j'ai essayé est ci-dessous, (ne rigolez



pas

trop SVP, je suis débutant) :

Public Sub Remplit_table()
Dim i As Integer 'compteur
Dim min As Integer 'limite basse du tirage aléatoire
Dim max As Integer 'limite haute du tirage

Dim matable As TableDef 'Table qui doit être reconstruite de manière
aléatoire
Dim rst As Recordset
Dim chSQL As String 'variable commande SQL

Set matable = CurrentDb.TableDefs("Table1") 'Table1 est la table source



des

données

chSQL = "SELECT * FROM Orders" 'commande de sélection des données

' Ouvre un objet Recordset de type table.
Set rst = matable.OpenRecordset(chSQL) 'PLANTE
max = rst.RecordCount
min = 1

' faire pointer rst sur matable cible

'Initialisation
Randomize

'efface le contenu de ma table
DoCmd.RunSQL "DELETE * FROM Matable"


For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i


'Ferme les objets ouverts
rst.Close
Set matable = Nothing

End Sub


"Luc Voeltzel" a écrit dans le message de
news:%

Merci ze Titi,

Je vais essayer, et donnerai suite pour ce qui est des résultats ce




soir (la

réussite n'est pas garantie car je n'ai encore jamais fait de VBA sur




access

!)
:-)

Luc



--
Voilou !
Bon code
Cordialement,

Ze Titi








--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Luc Voeltzel
Ca marche !!!!

J'ai eu juste à enlever l'option "indexé oui-sans doublons", activée par
défaut par access pour la clef de la table cible. Le programme plantait
quand le tirage sortait une clef qui était déjà inscrite dans la table (en
effet une table ne peut pas posséder 2 fois la même clef sinon doublon).

Mais bravo pour la boucle, ce code devrait m'être utile dans bien des
procédures de manipulation de données à l'intérieur de nouvelles tables.


Merci !!!
:-)

Luc




"ze Titi" a écrit dans le message de
news:
Bonjour Luc Voeltzel

Vite fait, à tester et à adapter si nécessaire...J'ai supposé que les
champs de matable étaient les mêmes que table1... Si ça n'est pas le
cas, il faut changer les noms de champs après chaque ! dans la boucle.

Public Sub Remplit_table()
Dim i As Integer 'compteur
Dim min As Long 'limite basse du tirage aléatoire
Dim max As Long 'limite haute du tirage

Dim matable As Recordset
Dim aux as long

Set matable = CurrentDb.OpenRecordset("matable")

max = DMax("clef","Table1")
min = 1

Randomize

'efface le contenu de ma table
DoCmd.RunSQL "DELETE * FROM matable"

For i = min To max
matable.AddNew
aux=Int((max - min + 1) * Rnd + min)
matable!clef=aux
matable!catégorießirst("catégorie","table1","clef=" & aux)
matable!phrase1ßirst("phrase1","table1","clef=" & aux)
matable!typeßirst("type","table1","clef=" & aux)
matable!commentaire1ßirst("commentaire1","table1","clef=" & aux)
matable!antonymeßirst("antonyme","table1","clef=" & aux)
matable!sourceßirst("source","table1","clef=" & aux)
matable.Update
Next i
matable.close
Set matable = Nothing

End Sub

Dans ton message du lundi
Oups, il n'y a pas de table Orders, seulement une table 1 qui sert de
données sources. La mention Orders dans le code VBA concernait seulement
un


essai de tri.(pas adpté)

Les champs de la table 1 sont :
clef : NuméroAuto (clef primaire)
catégorie : Texte
phrase1: Texte
type : texte
commentaire1 : Mémo
antonyme : texte
source : Numérique

Vous l'avez peut-être compris, il s'agit d'un répertoire pour apprendre
les


langues.

maTable est la table cible qui doit reprendre les enregistrement de la
table


1 selon un tirage aléatoire.

Si vous arrivez à faire quelque chose avec ça.... ):-(

Merci pour toute aide,

Luc



"ze Titi" a écrit dans le message de
news:
Bonjour Luc Voeltzel

donne nous la structure de ta table Table1 et de ta table Orders.


Dans ton message du lundi
Je n'y arrive pas.

L'idée est d'effacer ma table :
DoCmd.RunSQL "DELETE * FROM Matable" CA MARCHE

mais pour ce qui est de la remplir, c'est une autre affaire. Je ne
connais




rien à SQL.

Faut-il utliser une boucle du genre ?

For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i

Peut-être mais je n'arrive même pas jusque là, étant donnés mes
lacunes en




programmation access.


Est ce que quelqu'un y arrive ?


Pour information, le code que j'ai essayé est ci-dessous, (ne rigolez
pas




trop SVP, je suis débutant) :

Public Sub Remplit_table()
Dim i As Integer 'compteur
Dim min As Integer 'limite basse du tirage aléatoire
Dim max As Integer 'limite haute du tirage

Dim matable As TableDef 'Table qui doit être reconstruite de manière
aléatoire
Dim rst As Recordset
Dim chSQL As String 'variable commande SQL

Set matable = CurrentDb.TableDefs("Table1") 'Table1 est la table
source des




données

chSQL = "SELECT * FROM Orders" 'commande de sélection des données

' Ouvre un objet Recordset de type table.
Set rst = matable.OpenRecordset(chSQL) 'PLANTE
max = rst.RecordCount
min = 1

' faire pointer rst sur matable cible

'Initialisation
Randomize

'efface le contenu de ma table
DoCmd.RunSQL "DELETE * FROM Matable"


For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i


'Ferme les objets ouverts
rst.Close
Set matable = Nothing

End Sub


"Luc Voeltzel" a écrit dans le message de
news:%
Merci ze Titi,

Je vais essayer, et donnerai suite pour ce qui est des résultats ce
soir





(la réussite n'est pas garantie car je n'ai encore jamais fait de VBA
sur





access !)
:-)

Luc



--
Voilou !
Bon code
Cordialement,

Ze Titi



--
Voilou !
Bon code
Cordialement,

Ze Titi








Avatar
Luc Voeltzel
Bonjour Eric,

Merci pour vos conseils,

ci-dessous le code fourni par le site que vous indiquez, très intéressant...

Je n'ai malheureusement plus le temps de l'étudier pour ce soir. Je
rapporterai les essais demain.

cordialement,

Luc


Queries: Create a query that returns Random records
Author(s)
Joe Foster

(Q) How can I return Random records from a table?

(A) Paste the following function in a new module.

'************ Code Begin ***********
'Code courtesy of
'Joe Foster
Function Randomizer () As Integer
Static AlreadyDone As Integer
If AlreadyDone = False Then Randomize : AlreadyDone = True
Randomizer = 0
End Function
'************ Code End *************

Now to get 100 questions picked at random:

select top 100 mytable.*from mytable
where randomizer() = 0
order by rnd(isnull(mytable.question) * 0 + 1)





"Eric" a écrit dans le message de
news:%
Bonjour,

Pourquoi créer une nouvelle table puisqu'il s'agit seulement d'un tirage
aléatoire?

J'aurais tendance à créer une requête me retournant les enregistrements
de manière aléatoire et construirais un formulaire sur cette requête.
Pour cela, voir ici le code générant un jeu d'enregistrements aléatoires
sur une table : http://www.mvps.org/accessfr/queries/qry0011.htm
Cette exemple montre comment extraire 100 enregistrements de manière
aléatoire mais tu peux virer le Top 100 si tu les veux tous ou le
réduire (Top 10).

A chaque ouverture du formulaire, un nouveau jeu est tiré. Les
enregistrements peuvent se répéter, en partie, d'un jeu à l'autre.

Oups, il n'y a pas de table Orders, seulement une table 1 qui sert de
données sources. La mention Orders dans le code VBA concernait seulement
un


essai de tri.(pas adpté)

Les champs de la table 1 sont :
clef : NuméroAuto (clef primaire)
catégorie : Texte
phrase1: Texte
type : texte
commentaire1 : Mémo
antonyme : texte
source : Numérique

Vous l'avez peut-être compris, il s'agit d'un répertoire pour apprendre
les


langues.

maTable est la table cible qui doit reprendre les enregistrement de la
table


1 selon un tirage aléatoire.

Si vous arrivez à faire quelque chose avec ça.... ):-(

Merci pour toute aide,

Luc



"ze Titi" a écrit dans le message de
news:

Bonjour Luc Voeltzel

donne nous la structure de ta table Table1 et de ta table Orders.


Dans ton message du lundi

Je n'y arrive pas.

L'idée est d'effacer ma table :
DoCmd.RunSQL "DELETE * FROM Matable" CA MARCHE

mais pour ce qui est de la remplir, c'est une autre affaire. Je ne



connais

rien à SQL.

Faut-il utliser une boucle du genre ?

For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i

Peut-être mais je n'arrive même pas jusque là, étant donnés mes lacunes



en

programmation access.


Est ce que quelqu'un y arrive ?


Pour information, le code que j'ai essayé est ci-dessous, (ne rigolez



pas

trop SVP, je suis débutant) :

Public Sub Remplit_table()
Dim i As Integer 'compteur
Dim min As Integer 'limite basse du tirage aléatoire
Dim max As Integer 'limite haute du tirage

Dim matable As TableDef 'Table qui doit être reconstruite de manière
aléatoire
Dim rst As Recordset
Dim chSQL As String 'variable commande SQL

Set matable = CurrentDb.TableDefs("Table1") 'Table1 est la table source



des

données

chSQL = "SELECT * FROM Orders" 'commande de sélection des données

' Ouvre un objet Recordset de type table.
Set rst = matable.OpenRecordset(chSQL) 'PLANTE
max = rst.RecordCount
min = 1

' faire pointer rst sur matable cible

'Initialisation
Randomize

'efface le contenu de ma table
DoCmd.RunSQL "DELETE * FROM Matable"


For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i


'Ferme les objets ouverts
rst.Close
Set matable = Nothing

End Sub


"Luc Voeltzel" a écrit dans le message de
news:%

Merci ze Titi,

Je vais essayer, et donnerai suite pour ce qui est des résultats ce




soir (la

réussite n'est pas garantie car je n'ai encore jamais fait de VBA sur




access

!)
:-)

Luc



--
Voilou !
Bon code
Cordialement,

Ze Titi








--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr






Avatar
Luc Voeltzel
Bonjour à tous,

la méthode indiquée par Eric marche très bien, et est très concise.

un grand merci !

Luc



"Luc Voeltzel" a écrit dans le message de
news:
Bonjour Eric,

Merci pour vos conseils,

ci-dessous le code fourni par le site que vous indiquez, très
intéressant...


Je n'ai malheureusement plus le temps de l'étudier pour ce soir. Je
rapporterai les essais demain.

cordialement,

Luc


Queries: Create a query that returns Random records
Author(s)
Joe Foster

(Q) How can I return Random records from a table?

(A) Paste the following function in a new module.

'************ Code Begin ***********
'Code courtesy of
'Joe Foster
Function Randomizer () As Integer
Static AlreadyDone As Integer
If AlreadyDone = False Then Randomize : AlreadyDone = True
Randomizer = 0
End Function
'************ Code End *************

Now to get 100 questions picked at random:

select top 100 mytable.*from mytable
where randomizer() = 0
order by rnd(isnull(mytable.question) * 0 + 1)





"Eric" a écrit dans le message de
news:%
Bonjour,

Pourquoi créer une nouvelle table puisqu'il s'agit seulement d'un tirage
aléatoire?

J'aurais tendance à créer une requête me retournant les enregistrements
de manière aléatoire et construirais un formulaire sur cette requête.
Pour cela, voir ici le code générant un jeu d'enregistrements aléatoires
sur une table : http://www.mvps.org/accessfr/queries/qry0011.htm
Cette exemple montre comment extraire 100 enregistrements de manière
aléatoire mais tu peux virer le Top 100 si tu les veux tous ou le
réduire (Top 10).

A chaque ouverture du formulaire, un nouveau jeu est tiré. Les
enregistrements peuvent se répéter, en partie, d'un jeu à l'autre.

Oups, il n'y a pas de table Orders, seulement une table 1 qui sert de
données sources. La mention Orders dans le code VBA concernait
seulement



un
essai de tri.(pas adpté)

Les champs de la table 1 sont :
clef : NuméroAuto (clef primaire)
catégorie : Texte
phrase1: Texte
type : texte
commentaire1 : Mémo
antonyme : texte
source : Numérique

Vous l'avez peut-être compris, il s'agit d'un répertoire pour
apprendre



les
langues.

maTable est la table cible qui doit reprendre les enregistrement de la
table


1 selon un tirage aléatoire.

Si vous arrivez à faire quelque chose avec ça.... ):-(

Merci pour toute aide,

Luc



"ze Titi" a écrit dans le message de
news:

Bonjour Luc Voeltzel

donne nous la structure de ta table Table1 et de ta table Orders.


Dans ton message du lundi

Je n'y arrive pas.

L'idée est d'effacer ma table :
DoCmd.RunSQL "DELETE * FROM Matable" CA MARCHE

mais pour ce qui est de la remplir, c'est une autre affaire. Je ne



connais

rien à SQL.

Faut-il utliser une boucle du genre ?

For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i

Peut-être mais je n'arrive même pas jusque là, étant donnés mes
lacunes






en

programmation access.


Est ce que quelqu'un y arrive ?


Pour information, le code que j'ai essayé est ci-dessous, (ne rigolez



pas

trop SVP, je suis débutant) :

Public Sub Remplit_table()
Dim i As Integer 'compteur
Dim min As Integer 'limite basse du tirage aléatoire
Dim max As Integer 'limite haute du tirage

Dim matable As TableDef 'Table qui doit être reconstruite de manière
aléatoire
Dim rst As Recordset
Dim chSQL As String 'variable commande SQL

Set matable = CurrentDb.TableDefs("Table1") 'Table1 est la table
source






des

données

chSQL = "SELECT * FROM Orders" 'commande de sélection des données

' Ouvre un objet Recordset de type table.
Set rst = matable.OpenRecordset(chSQL) 'PLANTE
max = rst.RecordCount
min = 1

' faire pointer rst sur matable cible

'Initialisation
Randomize

'efface le contenu de ma table
DoCmd.RunSQL "DELETE * FROM Matable"


For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i


'Ferme les objets ouverts
rst.Close
Set matable = Nothing

End Sub


"Luc Voeltzel" a écrit dans le message de
news:%

Merci ze Titi,

Je vais essayer, et donnerai suite pour ce qui est des résultats ce




soir (la

réussite n'est pas garantie car je n'ai encore jamais fait de VBA
sur







access

!)
:-)

Luc



--
Voilou !
Bon code
Cordialement,

Ze Titi








--
A+
Eric
http://www.mpfa.info/
Archives :
http://groups.google.fr/group/microsoft.public.fr.access?hl=fr











Avatar
Luc Voeltzel
CONCLUSION : pour reconstruire une table (Table1) de manière aléatoire

2 méthodes :

I ) construire matable en mode création puis ajouter une procédure VBA qui
va remplir cette nouvelle table (ici matable) à partir des données contenues
dans Table 1 (merci à ze Titi pour l'écriture du code):

Public Sub Remplit_table()
Dim i As Integer 'compteur
Dim min As Long 'limite basse du tirage aléatoire
Dim max As Long 'limite haute du tirage

Dim matable As Recordset
Dim aux as long

Set matable = CurrentDb.OpenRecordset("matable")

max = DMax("clef","Table1")
min = 1

Randomize

'efface le contenu de ma table
DoCmd.RunSQL "DELETE * FROM matable"

For i = min To max
matable.AddNew
aux=Int((max - min + 1) * Rnd + min) 'clef
matable!clef=aux
matable!champs1catégorießirst("champs1","table1","clef=" & aux)
matable!champs2ßirst("champs2","table1","clef=" & aux)
....
matable!champsnßirst("champsn","table1","clef=" & aux)
matable.Update
Next i

matable.close
Set matable = Nothing

End Sub



II ) créer une requête retournant les enregistrements de manière aléatoire
et construire un formulaire sur cette requête (d'après les renseignements
d'Eric).

1 ) Coller le code suivant dans un module VBA :

'************ Code Begin ***********
'Code courtesy of
'Joe Foster
Function Randomizer () As Integer
Static AlreadyDone As Integer
If AlreadyDone = False Then Randomize : AlreadyDone = True
Randomizer = 0
End Function
'************ Code End *************

2 ) Puis créer une requête en mode SQL du type

select top 100 Table1.*from Table1
where randomizer() = 0
order by rnd(isnull(Table1.clef) * 0 + 1)

pour un tirage de la totalité de la base il suffit d'enlever le "top 100".


Différences entre les 2 méthodes :
- la première méthode permet le tirage répété d'un enregistrement identique.
Il y a création de doublons.
- Il n'y a pas de doublons avec la deuxième méthode.

Merci à tous.


"Luc Voeltzel" a écrit dans le message de
news:
Bonjour à tous,

Quelqu'un sait-il comment trier une table de manière aléatoire ?

L'idée est de construire une base de donnée dont les éléments puissent
être

tirés de manière aléatoire et affichés sous forme de formulaire. Un
lecture

répétée de ces fiches tirées de façon aléatoire faciliterait ainsi
l'apprentissage de leur contenu.

NB : Question d'un débutant en access, mais qui connait un peu VBA
appliqué

à Excel.




Avatar
ze Titi
Bonjour Eric

Présenté comme ça, effectivement, je n'ai pas choisi la simplicité...
:-))
Promis, la prochaine fois je fais mieux... Mais comme on a toujours à
apprendre des autres, je m'instruis !

Bonnne continuation et apprentissage à tous !

Dans ton message <# du lundi
Bonjour,

Pourquoi créer une nouvelle table puisqu'il s'agit seulement d'un tirage
aléatoire?

J'aurais tendance à créer une requête me retournant les enregistrements de
manière aléatoire et construirais un formulaire sur cette requête. Pour cela,
voir ici le code générant un jeu d'enregistrements aléatoires sur une table :
http://www.mvps.org/accessfr/queries/qry0011.htm
Cette exemple montre comment extraire 100 enregistrements de manière
aléatoire mais tu peux virer le Top 100 si tu les veux tous ou le réduire
(Top 10).

A chaque ouverture du formulaire, un nouveau jeu est tiré. Les
enregistrements peuvent se répéter, en partie, d'un jeu à l'autre.

Oups, il n'y a pas de table Orders, seulement une table 1 qui sert de
données sources. La mention Orders dans le code VBA concernait seulement un
essai de tri.(pas adpté)

Les champs de la table 1 sont :
clef : NuméroAuto (clef primaire)
catégorie : Texte
phrase1: Texte
type : texte
commentaire1 : Mémo
antonyme : texte
source : Numérique

Vous l'avez peut-être compris, il s'agit d'un répertoire pour apprendre les
langues.

maTable est la table cible qui doit reprendre les enregistrement de la
table
1 selon un tirage aléatoire.

Si vous arrivez à faire quelque chose avec ça.... ):-(

Merci pour toute aide,

Luc



"ze Titi" a écrit dans le message de
news:

Bonjour Luc Voeltzel

donne nous la structure de ta table Table1 et de ta table Orders.


Dans ton message du lundi

Je n'y arrive pas.

L'idée est d'effacer ma table :
DoCmd.RunSQL "DELETE * FROM Matable" CA MARCHE

mais pour ce qui est de la remplir, c'est une autre affaire. Je ne



connais

rien à SQL.

Faut-il utliser une boucle du genre ?

For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i

Peut-être mais je n'arrive même pas jusque là, étant donnés mes lacunes



en

programmation access.


Est ce que quelqu'un y arrive ?


Pour information, le code que j'ai essayé est ci-dessous, (ne rigolez



pas

trop SVP, je suis débutant) :

Public Sub Remplit_table()
Dim i As Integer 'compteur
Dim min As Integer 'limite basse du tirage aléatoire
Dim max As Integer 'limite haute du tirage

Dim matable As TableDef 'Table qui doit être reconstruite de manière
aléatoire
Dim rst As Recordset
Dim chSQL As String 'variable commande SQL

Set matable = CurrentDb.TableDefs("Table1") 'Table1 est la table source



des

données

chSQL = "SELECT * FROM Orders" 'commande de sélection des données

' Ouvre un objet Recordset de type table.
Set rst = matable.OpenRecordset(chSQL) 'PLANTE
max = rst.RecordCount
min = 1

' faire pointer rst sur matable cible

'Initialisation
Randomize

'efface le contenu de ma table
DoCmd.RunSQL "DELETE * FROM Matable"


For i = min To max
rst(i) = Int((max - min + 1) * Rnd + min)
Next i


'Ferme les objets ouverts
rst.Close
Set matable = Nothing

End Sub


"Luc Voeltzel" a écrit dans le message de
news:%

Merci ze Titi,

Je vais essayer, et donnerai suite pour ce qui est des résultats ce




soir (la

réussite n'est pas garantie car je n'ai encore jamais fait de VBA sur




access

!)
:-)

Luc



-- Voilou !
Bon code
Cordialement,

Ze Titi









--

Ze Titi





1 2