IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Extraction aléatoire d'observations à partir d'un champ Access


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Extraction aléatoire d'observations à partir d'un champ Access
    Bonjour,

    Je souhaite extraire 25 observations de façon aléatoire du champ 'NUMERO' de ma table 'CONTROLE', dans une macro access, et je n'y arrive malheureusement pas...

    Voici le code :

    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
     
    Sub selection()
     
    Dim nbConsultChoisis, nbConsultTot, nbATirer, ligne, ouvreBase As Database
     
    'nbConsultChoisis = les 25 consultants qui seront tirés aléatoirement
    'nbConsultTot = le nb de consultants total du champ numéro
    'nbATirer = le nb de consultant que l'on veut extraire
    'ligne pour initialiser
     
    Set ouvreBase = OpenDatabase("CONTROLE")
    nbATirer = 25
    nbConsultTot = ("NUMERO")
    For ligne = 0 To nbConsultTot
    nbConsultChoisis = Int(Rnd(1) * nbConsultTot)
    Next ligne
     
    End Sub
     
    J'ai le message d'erreur suivant : erreur d'exécution '3024', table non trouvée... pourtant cette table existe bel et bien dans ma base de donnée???
    J'ai vu par ailleur qu'il fallait pour se connecter à une table écrire en VBA ce genre de chose : 
    Dim myConnection As ADODB.Connection
    Set myConnection = CurrentProject.Connection
    Dim myRecordset As New ADODB.Recordset
    myRecordset.ActiveConnection = myConnection
    myRecordset.Open "CONTROLE", , adOpenStatic, adLockOptimistic...
    J'arrive malheureusement pas bien à faire le lien entre tout ca... :/

    Est-ce que quelqu'un pourrait m'aider ?

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Désolé, comprend pas !

    Que contient ta table 'Controle' ?
    Que contient le champ 'Numéro' ?

    Tu veux avoir 25 enr, choisi aléatoirement, dans ta table Controle ?

    Ou, tu veux parcourir l'ensemble des enr de la table controle et tirer 25 valeurs comprises entre 1 et le nombre contenu dans le champ 'Numéro' pour chacun des enr de 'Controle' ?

    Accepte tu des doublons pour tes valeurs aléatoires (ex : 2 fois le 1) ?

    A+

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Alors en fait le champ 'numéro' représente les identifiants des personnes (ici ce sont des consultants), je souhaite pouvoir prendre aléatoirement 25 personnes issues de ce champ, sans doublon.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Tu as une liste de valeur dans ce champ ? Es-tu en Access 2007 ou as-tu une chaîne de caractères (ex : Num1;Num2;Num3) ?

    A+

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    c'est une liste de valeur qu'il y a dans le champ, je travail avec Access 2003.


  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    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
     
    dim db as database:set db=currentdb
    dim r as recordset :set r=db.openrecordset("Controle"):'Là je ne suis pas certain que ce soit la bonne table mais tu changera si nécessaire le reste du code ne sera pas affecté.
    dim numeros as collection
    dim i as integer
     
    do while not r.eof
      set numeros=TirerRepresentant(r![Numero])
      for i=1 to numeros.count
        debug.print numeros.item(i)
      next i
      set numeros=nothing
      r.movenext
    loop
     
     
    r.close:set r=nothing
    db.close:set db=nothing
    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
     
    private function TirerRepresentant(prmListeRepresentant as string) as collection
      'Crée une collection à partir de la liste des représentants, tire un élément de la collection et le supprime pour éviter les doublons.
     
      dim result as new collection
      dim tRepresentant as variant:numeros=split(prmListeRepresentant,";")
      dim  respresentants as collection
     
      dim i as integer:for i=lbound(tRepresentant) to ubound(tRepresentant)
        call representants.add(tRepresentant(i))
      next i
     
      dim iMax as integer:iMax=25 
      dim j as integer
      for i=1 to iMax
         j=int(rnd()*representants.count)+1
         call result.add(representants.item(j))
         representants.remove j
      next i
     
      set representants=nothing
     
      set TirerRepresentant=result
      set result=nothing
    end function

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour le programme...

    Je l'ai testé mais j'ai un message d'erreur '13', dont e n'arrive pas à corriger le probleme.
    Ca me pointe toujours la 2eme ligne!
    J'ai essayé de modifier les types, avec Variant... à plusieurs endroits mais cela ne fonctionne toujours pas! Quoi que je fasse j'ai toujours ce message d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim i As Integer
      For i = LBound(tRepresentant) To UBound(tRepresentant)
        Call representants.Add(tRepresentant(i))
      Next i

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Tu as déclaré i comme un entier, est-ce que ton tableau ne dépasserait pas 32 767 lignes ?

    Starec

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé en tapant i as double, ou i as variant... ca ne marche pas non plus

  10. #10
    Invité
    Invité(e)
    Par défaut
    Re

    Est-ce que c'est cette ligne qui bug

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call representants.Add(tRepresentant(i))
    que veux-tu faire avec ?

    Starec

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    C'est la ligne du dessus qui bug! (qui est surlignée en jaune!)

    Normalement ca crée un tableau, et ca va chercher le nombre de représentants souhaité, qui s'ajoute dans le tableau tRepresentant

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Ooops ! J'm'a trompis !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      dim result as new collection
      dim tRepresentant as variant:tRepresentant=split(prmListeRepresentant,";")
      dim  respresentants as collection
     
      dim i as integer:for i=lbound(tRepresentant) to ubound(tRepresentant)
        call representants.add(tRepresentant(i))
      next i

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    C'est encore moi :/ .... j'arive toujours pas à faire tourner le code !!!

    J'ai encore un message d'erreur : "Variable objet ou variable bloc With non définie (erreur 91)"

    sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call representants.Add(tRepresentant(i))
    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim i As Integer
      For i = LBound(tRepresentant) To UBound(tRepresentant)
        representants.Add Item:=tRepresentant(i)
      Next i
    Ca m'écrit le même message d'erreur...
    J'ai essayé avec Set ... aussi, est le message d'erreur reste le même?

  14. #14
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    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
     
    Private Function TirerRepresentant(prmListeRepresentant As String) As Collection
      'Crée une collection à partir de la liste des représentants, tire un élément de la collection et le supprime pour éviter les doublons.
     
      Dim result As New Collection
      Dim tRepresentant As Variant: tRepresentant = Split(prmListeRepresentant, ";")
      Dim representants As New Collection
     
      Dim i As Integer: For i = LBound(tRepresentant) To UBound(tRepresentant)
        Call representants.Add(tRepresentant(i))
      Next i
     
      Dim iMax As Integer: iMax = 25
     
      If (UBound(tRepresentant) + 1) < iMax Then
        iMax = UBound(tRepresentant) + 1: 'Cas ou on a moins de 25 rep dans la liste
      End If
     
      Dim j As Integer
      For i = 1 To iMax
         j = Int(Rnd() * representants.Count) + 1
         Call result.Add(representants.Item(j))
         representants.Remove j
      Next i
     
      Set representants = Nothing
     
      Set TirerRepresentant = result
      Set result = Nothing
    End Function
    Contrairement au code précédent, je l'ai testé et il marche.

    Ça serait bon que tu active l'option de contrôle des variables dans ton Access ça va t'aider à trouver mes erreurs :-). J'avais mal orthographié 2 variables.

    Pour faire cela va, en mode code, dans le menu Outil/Option et coche Declaration obligatoire des variables. Si une variable n'est pas déclarée ou si elle est mal orthographié lors de son utilisation tu le saura à la compilation.

    Dans un module existant ajouter :
    en début de module.

    A+

  15. #15
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    merci merci merci

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Si ton problème est résolu pense à cliquer sur

    Starec

Discussions similaires

  1. [XL-2007] Remplir un combobox à partir d'un champ ACCESS
    Par bipbip2006 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/12/2010, 11h37
  2. Composition d'un numéro de tel. à partir d'un champs
    Par Anthony17 dans le forum Access
    Réponses: 1
    Dernier message: 02/05/2006, 18h29
  3. Afficher un enregistrement à partir d'un champ d'un autre
    Par michelleclercq dans le forum Access
    Réponses: 1
    Dernier message: 08/12/2005, 20h39
  4. Etat à partir d'un champs
    Par Didi17 dans le forum Access
    Réponses: 1
    Dernier message: 01/11/2005, 08h06
  5. Group by à partir d'un champ calculé || substr
    Par SegmentationFault dans le forum Bases de données
    Réponses: 4
    Dernier message: 30/07/2004, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo