Bonjour à tous!
j'aimerais pouvoir Prélever de façon aléatoire 25% des enregistrements d'une table donnée. Comment puis-je le faire.
Merçi d'avance pour votre aide
Bonjour à tous!
j'aimerais pouvoir Prélever de façon aléatoire 25% des enregistrements d'une table donnée. Comment puis-je le faire.
Merçi d'avance pour votre aide
On peu imaginer charger la table dans un RecordSet.
A partir de là tu peux savoir combien il y a d'enregistrement et donc savoir combien d'enregistrements représentent 25% des enregistrements.
Tu utilise Randomize en vba pour générer autant de nombre aléatoire que nécessaire entre 1 et le nombre total d'enregistrements (en prennant soin de vérifier l'unicité de chacun).
Maintenant tu peux parcourir le RecordSet en incrémentant une variable à chaque tour, et si ce nombre incrémenté est égal à l'un des chiffres générés aléatoirement tu garde l'enregistrement.
Bon ... une solution plus simple serait de faire une requête sur la table du genre :
En fait ici tu peux généré le chiffre 2 que l'on voit ici aléatoirement, ainsi à chaque fois tu auras un ordre d'enregistrements différent. Tu ouvre ça dans un recordSet et tu parcours les "25% premiers enregistrements"
Code : Sélectionner tout - Visualiser dans une fenêtre à part Select * From table1 Order By mid(Champtxt, 2, 1)
Mais tu as besoin d'un champ de type texte.
Bon ... bien capilotractées comme solutions mais c'est de l'inspiration passagère. C'est à ce genre de moment que quelqu'un va poster après proposant une solution toute simple et évidente.
Bonjour,
Bonne idée Demco...
Ca m'a donné une idée //
C'est à tester en mode DEBUG sur "les Comptoirs"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 Function Prendre25Pourcent(ByVal TableName As String, ByVal FieldName As String) As Variant Dim oRS As Recordset Dim lngNBRecords As Long Dim intFlagPosition As Integer Dim intRest As Integer Dim intPercent As Integer Dim aRecords() As Variant Dim I As Long Set oRS = CurrentDb.OpenRecordset("SELECT " & FieldName & " FROM " & TableName & " ORDER BY " & FieldName, 2) If oRS.EOF = False Then With oRS .MoveLast lngNBRecords = .RecordCount intPercent = lngNBRecords * 0.25 RunAgain: Randomize intFlagPosition = (Int(Rnd * 100) \ (Rnd + 1)) + 1 If intFlagPosition >= lngNBRecords - intPercent Then GoTo RunAgain ReDim aRecords(1 To intPercent) .MoveFirst Do While Not .EOF If .AbsolutePosition >= intFlagPosition Then I = I + 1 aRecords(I) = .Fields(FieldName).Value If I >= intPercent Then Exit Do End If End If .MoveNext Loop .Close End With End If Set oRS = Nothing Prendre25Pourcent = aRecords End Function Sub TesterExemple() Dim aResultat As Variant Dim I As Integer aResultat = Prendre25Pourcent("Clients", "[Code client]") For I = LBound(aResultat) To UBound(aResultat) Debug.Print aResultat(I) Next End Sub
Argy
si ta table comporte une donnée numérique aléatoire
chiffre de vente
compteur numérique ou autre numéro de client
tu fais mod(ent(monnombre);4)
et tu mets sur celle clause un critère de 0 à 3
cette méthode crée un échantillon supposé aléatoire
on obtient pas 25% de la table mais environ 25 %
on prendra soin de vérifier que l'échantillon est correct pour un chiffre d'affaire moyenne et écart type de l'échantillon proche de la population
Partager