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 :

Modification données dans sous formulaire


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 19
    Points
    19
    Par défaut Modification données dans sous formulaire
    Bonjour,

    Je travaille sous access 2003 et je ne suis pas très expériementé en VBA. Je m'inspire très largement des conseils que je peux trouver sur ce site et j'en profite pour remercier leurs auteurs.

    Voici mon problème :
    J'ai un sous formulaire (liste de contacts) alimenté par une requête qui se met à jour en fonction des options du formulaire contenant.
    L'un des champs de cette liste est une case à cocher qui me permet de ne sélectionner que certains contacts avant de faire un publipostage.
    Lorsque je fais une sélection manuelle, tout fonctionne parfaitement...

    Je souhaite maintenant créer une option (case à cocher) me permettant de tout cocher/décocher sur la liste affichée afin de gagner en efficacité.

    Voici le code que j'ai rentré :
    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
    Private Sub CocherTout_Click()
    'coche ou décoche toutes les cases
    '
    Dim Liste As Recordset
    Dim NbrUsers As Integer
    Dim vRéponse As String
     
    'compte le nbr d'utilisateurs
    NbrUsers = DCount("*", "R_ContactsCourrierNonConfidentiel")
    If NbrUsers = 0 Then
        vRéponse = MsgBox("Les utilisateurs ne sont pas définis" & vbCr & "Demandez à l'administrateur de les créer.", vbOKCancel, "Liste des utilisateurs")
        Exit Sub
    End If
     
    'faire référence à la requête
    Set Liste = CurrentDb.OpenRecordset("R_ContactsCourrierNonConfidentiel")
     
    'se place en début de liste
    Liste.MoveFirst
    Donnée = Liste.Fields("Cocher")
     
    For User = 1 To NbrUsers
        If Me![CocherTout] = False Then
            Liste.Edit
            Liste![Cocher] = False
            Liste.Update
            Else
            Liste.Edit
            Liste![Cocher] = True
            Liste.Update
        End If
        Liste.MoveNext
    Next
     
    'libération de la référence
    Liste.Close
    Set Liste = Nothing
     
    End Sub
    J'obtiens l'erreur suivante sur "Liste.Edit" :
    Méthode ou membre de données introuvable (erreur 461)

    Je m'en remets à vos compétences pour me dire à quel niveau se trouve l'erreur.
    Je reste à votre disposition pour tout renseignement complémentaire.
    Merci par avance pour votre aide.

    Cordiales salutations

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 579
    Points
    24 579
    Par défaut
    Bonjour et bienvenue,

    Dans l'ordre :

    1. Vérifier que la référence DAO est bien cochée (menu outils/référence dans le VBE). Si oui le placer devant ADOx ou signer ton recordset par DAO : dim rst as DAO.recordset
    2. Vérifier que la requete (R_....) est bien une requete modifiable, pour cela ouvrir la requete est essayer de faire une modification ou un ajout.
    3. Eventuellement la forcer en mode dynamique, soit dans l'appel recordset (dynaset) soit directement dans les propriétés de la requete (propriété Mise à jour globale)


    Vu le message je pense que le 1 devrait resoudre le pb.

    Cordialement,

    Ps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    For User = 1 To NbrUsers
        If Me![CocherTout] = False Then
            Liste.Edit
            Liste![Cocher] = False
            Liste.Update
            Else
            Liste.Edit
            Liste![Cocher] = True
            Liste.Update
        End If
        Liste.MoveNext
    Next
    optimisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For User = 1 To NbrUsers
        Liste.Edit
        Liste![Cocher] = Me![CocherTout]        
        Liste.Update
        Liste.MoveNext
    Next

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Merci pour cette réponse rapide.

    Il semble que le problème soit déplacé...
    J'ai bien vérifié que la référence DAO était cochée et je l'ai remontée dans la liste (la référence ADO n'est pas cochée).
    J'ai modifié également mon "Dim Liste" en ajoutant "as DAO.recordset ".

    J'ai également pris en compte ta suggestion d'optimisation.

    Maintenant, j'obtiens le message suivant :
    Trop peu de paramètres. 12 attendu. (Erreur 3061)
    sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Liste = CurrentDb.OpenRecordset("R_ContactsCourrierNonConfidentiel")
    Par ailleurs, la requête est bien modifiable puisque je peux cocher les cases manuellement (leur effet est bien pris en compte par la suite).
    D'autre part ma requête est bien en mode dynamique : Feuille rép.dyn.(MAJ globale)

    As-tu une autre piste ?

    Merci par avance
    Cordialement

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 579
    Points
    24 579
    Par défaut
    Avec ceci ça devrait fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openrecordset("marequete", dbOpenDynaset)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Je te remercie mais le problème persiste !

    Voici le code complet :
    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
    Private Sub CocherTout_Click()
    'coche ou décoche toutes les cases
    '
    Dim Liste As DAO.Recordset
     
    Dim NbrUsers As Integer
    Dim vRéponse As String
     
    'compte le nbr d'utilisateurs
    NbrUsers = DCount("*", "R_ContactsCourrierNonConfidentiel")
    If NbrUsers = 0 Then
        vRéponse = MsgBox("Les utilisateurs ne sont pas définis" & vbCr & "Demandez à l'administrateur de les créer.", vbOKCancel, "Liste des utilisateurs")
        Exit Sub
    End If
     
    'faire référence à la requête
    Set Liste = CurrentDb.OpenRecordset("R_ContactsCourrierNonConfidentiel", dbOpenDynaset)
     
    'se place en début de liste
    Liste.MoveFirst
    Donnée = Liste.Fields("Cocher")
     
    For User = 1 To NbrUsers
        Liste.MoveFirst
        Liste.Edit
        Liste![Cocher] = Me![CocherTout]
        Liste.Update
        Liste.MoveNext
    Next
     
    'libération de la référence
    Liste.Close
    Set Liste = Nothing
     
    End Sub
    Je bloque toujours sur le "Set Liste..."
    As-tu une autre idée ?

    Cordialement

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 579
    Points
    24 579
    Par défaut
    Désolé pas d'autre idée, ton code est correct. si DAO 3.6 est bien cochée c'est que le problème vient de la requete.

  7. #7
    Membre expérimenté Avatar de Gabout
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Points : 1 683
    Points
    1 683
    Par défaut
    Bonjour,

    Je trouve ta solution complexe (mais je ne fais que bricoler... )
    Après avoir compté tes enregistrements pour être sûr d'en avoir à cocher, pourquoi ne pas exécuter une requête de mise à jour basée sur ta requête R_ContactsCourrierNonConfidentiel et pour laquelle tu mets à jour ton champ Cocher à Oui

    Du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim sSQL as string
    docmd.setwarnings False
    sSQL="SELECT ............ta requête............. WHERE ((([cocher])=Yes));"
    docmd.runSQL sSQL
    docmd.setwarnings True

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Bonjour Gabout,

    Je te remercie pour ton aide mais sauf erreur de ma part (je suis peu rompu aux requêtes SQL) ta proposition ne me permettra que de sélectionner les enregistrements qui seront déjà cochés (Cocher=Yes) alors que je souhaite forcer leur mise à jour sur YES.

    Cordialement

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    J'ai la solution !

    Au lieu d'attaquer ma requête, je vais modifier directement ma table des contacts et je demande un Requery du formulaire.

    Voici le code complet et fonctionnel :
    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
    Private Sub CocherTout_Click()
    'coche ou décoche toutes les cases
    '
    Dim Liste As DAO.Recordset
     
    Dim NbrUsers As Integer
    Dim Réponse As String
     
    'compte le nbr d'utilisateurs
    NbrUsers = DCount("*", "R_ContactsCourrierNonConfidentiel")
    If NbrUsers = 0 Then
        Réponse = MsgBox("Les utilisateurs ne sont pas définis" & vbCr & "Demandez à l'administrateur de les créer.", vbOKCancel, "Liste des utilisateurs")
        Exit Sub
    End If
     
    'faire référence à la table des contacts
    Set Liste = CurrentDb.OpenRecordset("T_Contacts")
     
    'se place en début de liste
    Liste.MoveFirst
    'Donnée = Liste.Fields("Cocher")
     
    Liste.MoveFirst
    Do While Not Liste.EOF
        Liste.Edit
        Liste![Cocher] = Me![CocherTout]
        Liste.Update
        Liste.MoveNext
    Loop
     
    'libération de la référence
    Liste.Close
    Set Liste = Nothing
     
    'met à jour l'affichage
    Me.Requery
     
    End Sub
    Est-ce que le problème peut venir du fait :
    - que ma requête soit issue d'une autre requête ?
    - d'un paramétrage de cette autre requête ?
    - que son nom soit asez long ?

    En tout cas, un grand merci pour vos réponses.

    Cordialement

  10. #10
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 028
    Points : 24 579
    Points
    24 579
    Par défaut
    Bonjour,

    Cela ne vient pas du nom trop long.

    J'ai testé ton code sans le contenu de ta requete sa fonctionne.

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] modification de données dans sous formulaire
    Par kasrimus dans le forum VBA Access
    Réponses: 1
    Dernier message: 16/10/2012, 18h29
  2. lecture sur données dans sous formulaire
    Par Ludwik dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/03/2008, 19h14
  3. ajout de nouvelles données dans sous formulaires
    Par gregoire747 dans le forum IHM
    Réponses: 2
    Dernier message: 16/01/2008, 17h18
  4. Affichage de données dans sous formulaire
    Par karibou47 dans le forum Access
    Réponses: 1
    Dernier message: 16/08/2006, 20h58
  5. raîchissement de données dans sous-formulaire
    Par frodon33 dans le forum Access
    Réponses: 1
    Dernier message: 04/06/2006, 20h15

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