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 :

Problème de "Cocher/Décocher tout" dans un sous-formulaire [AC-2016]


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2024
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème de "Cocher/Décocher tout" dans un sous-formulaire
    Bonjour à tou(te)s

    Je me permets de faire ce post car je n’ai pas trouvé de réponse sur le forum.

    Dans l’une de mes bases Access, j’ai un formulaire [Frm_OP] (rattaché à la table [Offre_de_prix]) dans lequel se trouve un sous-formulaire [Ssfrm_offres] (rattaché à la requête [Qry_offres], qui ne comporte aucun filtre, elle-même rattachée à la table [Tbl_offres]), qui contient une case à cocher [Exclusion] (créée dans la table [Tbl_offres]).

    Mon objectif était de trouver le moyen de cocher/décocher la case [Exclusion] de l’intégralité des lignes affichées sur le sous-formulaire. En effectuant des recherches sur Internet, j’ai trouvé la requête VBA suivante :

    Option Explicit
    Dim MAJCase As String
    ***
    Private Sub cocher_tout_Click()
    DoCmd.SetWarnings False
    MAJCase = "UPDATE Qry_Offres SET Qry_Offres.Exclusion = True"
    DoCmd.RunSQL MAJCase
    DoCmd.SetWarnings True
    Refresh
    End Sub
    ***
    Private Sub decocher_tout_Click()
    DoCmd.SetWarnings False
    MAJCase = "UPDATE Qry_Offres SET Qry_Offres.Exclusion = false"
    DoCmd.RunSQL MAJCase
    DoCmd.SetWarnings True
    Refresh
    End Sub

    En soi, ça fonctionne : lorsque je clique sur les boutons « Cocher tout » et « Décocher tout » les cases [Exclusion] sont cochées/décochées. MAIS, elles le sont pour l’intégralité des lignes de ma table [Tbl_offres] et non uniquement celles affichées dans mon sous-formulaire.

    J’ai tenté de modifier la requête en intégrant les champs liés en modifiant l’update mais ça ne fonctionne pas (aucune action et aucun message d’erreur):
    MAJCase = "UPDATE Qry_Offres, Offre_de_prix SET Qry_Offres.Exclusion = True WHERE ((([qry_offres]![Num_OP]=[Offre_de_prix]![Numéro d'OP]) And ([Qry_Offres]![Client]=[Offre_de_prix]![Client])))"

    J’ai également tenté d’ajouter le nom du sous-formulaire pour le « Refresh » (« Me.Ssfrm_OP.Refresh ») mais j’ai le message d’erreur suivant « Erreur de compilation. Membre de méthode ou de données introuvable ».

    N’étant pas calée en VBA et novice en SQL, je n’arrive pas à trouver comment régler ce problème.

    Auriez-vous une idée du problème ?

    Je vous mets un visuel de mon formulaire avec des informations qui, à mon sens, peuvent peut-être aider à la compréhension (car je ne suis pas sûre d'avoir été très claire dans mon post ).

    Merci beaucoup et bonne journée à tou(te)s !

    Aurore_G


    Nom : Access.png
Affichages : 64
Taille : 75,4 Ko

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    une solution simple en VBA consiste à utiliser le recordsetclone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RecordsetClone.MoveFirst
    While Not RecordsetClone.EOF
      RecordsetClone!monchamp = false
      RecordsetClone.MoveNext
    Wend
    refresh
    Pour un sous-formulaire c'est un peu plus sioux, il faut trouver le bon objet... Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    forms("monsousformulaire").RecordsetClone
    On peut aussi mettre la fonction publique dans le code du sous-formulaire et l'appeler depuis le formulaire principal
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 777
    Points : 14 826
    Points
    14 826
    Par défaut
    bonjour,
    Citation Envoyé par nico84
    Pour un sous-formulaire c'est un peu plus sioux, il faut trouver le bon objet...
    @nico84: dans ce contexte, l'objet Me.RecordsetClone suffit puisque les boutons cocher et décocher (et donc le code) sont dans le sous formulaire
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  4. #4
    Candidat au Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2024
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour Nico84 et tee_granbois,

    Merci beaucoup pour vos réponses.

    Alors, comme indiqué dans mon post, je suis une buse totale en VBA

    @nico84 :

    J'ai modifié ma requête par la tienne et j'obtiens l'erreur suivante :

    Nom : Erreur VBA.png
Affichages : 46
Taille : 5,6 Ko
    Nom : Détail erreur VBA.png
Affichages : 45
Taille : 8,4 Ko

    Dois-je modifier l'intégralité de ma requête ou ajouter la tienne à un endroit spécifique de celle que j'avais déjà créée ?

    J'ai également testé avec le forms("monsousformulaire").RecordsetClone mais j'ai un autre message d'erreur (j'ai encore dû me tromper dans la syntaxe ) :

    Nom : Erreur VBA sous-formulaire.png
Affichages : 44
Taille : 6,8 Ko
    Nom : Détail erreur VBA sous-formulaire.png
Affichages : 44
Taille : 9,2 Ko

    @tee_grandbois :

    J'ai aussi testé avec le Me.Recordsetclone mais j'ai eu le même message d'erreur (erreur d'exécution '3020')



    Désolée pour ces questions qui peuvent paraître extrêmement basiques pour des connaisseurs !

    Merci par avance


    Citation Envoyé par nico84 Voir le message
    Bonjour,

    une solution simple en VBA consiste à utiliser le recordsetclone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RecordsetClone.MoveFirst
    While Not RecordsetClone.EOF
      RecordsetClone!monchamp = false
      RecordsetClone.MoveNext
    Wend
    refresh
    Pour un sous-formulaire c'est un peu plus sioux, il faut trouver le bon objet... Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    forms("monsousformulaire").RecordsetClone
    On peut aussi mettre la fonction publique dans le code du sous-formulaire et l'appeler depuis le formulaire principal
    Citation Envoyé par tee_grandbois Voir le message
    bonjour,

    @nico84: dans ce contexte, l'objet Me.RecordsetClone suffit puisque les boutons cocher et décocher (et donc le code) sont dans le sous formulaire

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 777
    Points : 14 826
    Points
    14 826
    Par défaut
    Erreur d'inattention de nico84 et moi qui ne l'ai même pas remarqué: il manque les instructions Edit et Update:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Me.Recordsetclone.Edit
            Me.Recordsetclone!Exclusion = False
            'ça fonctionne aussi (c'est même préconisé): Me.Recordsetclone.Fields("Exclusion") = False
            Me.Recordsetclone.Update
            Me.Recordsetclone.MoveNext
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 777
    Points : 14 826
    Points
    14 826
    Par défaut
    pour l'erreur 7951:
    quand on invoque la collection des formulaires (Forms), un sous-formulaire n'est plus considéré comme tel car il est un contrôle objet, il fait donc partie de la collection Controls() du formulaire principal.
    De plus, lorsqu'on indique le nom, il doit être entre guillemets: Forms("Ssfrm_OP")
    Ci-dessous quelques syntaxes correctes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Forms("FormulairePrincipal").Controls("NomduSousformulaire").Form.MoveFirst
    Forms("FormulairePrincipal").NomduSousformulaire.Form.MoveFirst
    Forms("FormulairePrincipal")!NomduSousformulaire.Form.MoveFirst
    d'autre part, comme le code cocher_tout_Click est dans le sous-formulaire, il est inutile de faire appel à l'objet formulaire (qui d'ailleurs, ne l'est plus puisque devenu contrôle objet en tant que sous-formulaire), on désigne le formulaire contenant le code par: Me (par analogie, c'est comme ThisWorkBook dans Excel)

    Me.RecordsetClone.MoveFirst suffit à la place de Forms("Ssfrm_OP").RecordsetClone.MoveFirst
    Est-ce plus clair ?
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  7. #7
    Candidat au Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2024
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    Erreur d'inattention de nico84 et moi qui ne l'ai même pas remarqué: il manque les instructions Edit et Update:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Me.Recordsetclone.Edit
            Me.Recordsetclone!Exclusion = False
            'ça fonctionne aussi (c'est même préconisé): Me.Recordsetclone.Fields("Exclusion") = False
            Me.Recordsetclone.Update
            Me.Recordsetclone.MoveNext
    Merci beaucoup tee_grandbois !

    Alors, j'ai testé (avec la préconisation) et ça fonctionne !

    Mais je rencontre 2 problèmes (encore ) :

    1. Il faut que je clique à chaque fois pour que les lignes se cochent/décochent. Or, il peut il y avoir plus d'une centaine de lignes dans un sous-formulaire. L'objectif est qu'il fasse la manipulation tout seul, comme un grand

    2. Lorsque la dernière ligne du sous-formulaire est cochée/décochée, j'ai le message d'erreur suivant : "Erreur d'exécution '3021' : aucun enregistrement en cours" et il faut que je sorte du formulaire et rentre de nouveau pour pouvoir de nouveau cocher/décocher (le simple fait de changer d'enregistrement de formulaire ne suffit pas)

    Aurais-tu une idée lumineuse ?

    Merci beaucoup !

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 777
    Points : 14 826
    Points
    14 826
    Par défaut
    Alors, j'ai testé (avec la préconisation) et ça fonctionne !

    Mais je rencontre 2 problèmes (encore ) :
    ça ne fonctionne pas tant que ça, du coup
    vraiment étrange, normalement cette boucle parcourt et traite tous les enregistrements, c'était le but de ce code ...
    je ne vois pas ce qui cloche ou alors il y a autre chose qu'on ne nous dit pas ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  9. #9
    Candidat au Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2024
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    ça ne fonctionne pas tant que ça, du coup
    vraiment étrange, normalement cette boucle parcourt et traite tous les enregistrements, c'était le but de ce code ...
    je ne vois pas ce qui cloche ou alors il y a autre chose qu'on ne nous dit pas ...
    Bonjour tee_grandbois,

    Merci pour ton retour. Eh bien je t'avoue que je ne vois pas ce que j'aurai pu omettre comme information pour faire en sorte que ça fonctionne

    Si jamais tu as une illumination, je suis preneuse !

    En tout cas, merci beaucoup pour ton aide et tes explications !

  10. #10
    Candidat au Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2024
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Juin 2024
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Alors, en faisant la demande sur un autre site, la réponse m'a été apportée !

    Voici le code (qui fonctionne parfaitement) avec les commentaires :

    "En effet, ton code ne traite qu'un seul enregistrement, et passe au suivant. Quand il est au dernier, il provoque une erreur en tentant de passer au suivant. Je suggère de faire plutôt ainsi, et de parcourir tous les enregistrements, en commençant par le premier, jusqu'au dernier:

    Me.RecordsetClone.MoveFirst
    do until Me.RecordsetClone.EOF
    Me.RecordsetClone.Edit
    Me.RecordsetClone.Fields("Exclusion") = True
    Me.RecordsetClone.Update
    Me.RecordsetClone.MoveNext
    loop"

    Encore une fois, merci à vous pour m'avoir apporté votre aide !

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 777
    Points : 14 826
    Points
    14 826
    Par défaut
    bonjour,
    je comprend mieux, mais je rappelle que dans le code d'origine il y avait ces 2 instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While Not RecordsetClone.EOF
    '...
    Wend
    qui permettent d'exécuter la boucle et lire tous les enregistrements.
    Dans le post #5, j'avais surtout mis en avant les instructions qui manquaient (Edit et Udpate).
    Compris, la prochaine fois je mettrais tout le code ...
    bonne continuation
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/12/2023, 17h16
  2. Réponses: 3
    Dernier message: 29/12/2021, 20h27
  3. Réponses: 1
    Dernier message: 21/05/2020, 19h09
  4. case à cocher dans un sous formulaire
    Par nomade333 dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/09/2009, 14h30
  5. Réponses: 24
    Dernier message: 24/11/2005, 10h28

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