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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du 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
    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 : 123
Taille : 75,4 Ko

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 129
    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

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

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    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

  4. #4
    Futur Membre du 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
    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 : 110
Taille : 5,6 Ko
    Nom : Détail erreur VBA.png
Affichages : 103
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 : 105
Taille : 6,8 Ko
    Nom : Détail erreur VBA sous-formulaire.png
Affichages : 103
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
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    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

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

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    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 ?

  7. #7
    Futur Membre du 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
    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
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    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 ...

+ 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