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 :

Insérer du code pour changer un sous-formulaire après que le formulaire principal a changé [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Insérer du code pour changer un sous-formulaire après que le formulaire principal a changé
    Bonjour à tous,

    J'ai un formulaire avec un sous-formulaire. Avec la relation Père-Fils, Le filtrage des enregistrements dans le sous-formulaire se fait automatiquement.

    Cependant, je voudrais pouvoir afficher un enregistrement spécifique après que le formulaire principal soit modifié.

    Lorsque j'entre dans le formulaire, j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Form_Load()
      Dim Lundi As Date
     
      Lundi = CeLundi()
      Me![SemaineDu].SetFocus
      DoCmd.FindRecord Lundi
      Me!LA.SetFocus
      Statistiques
    End Sub
    Pour le premier client, c'a marche bien. Mais pour les autres, qui sont sélectionnés dans une liste déroulante, c'est le premier enregistrement qui est affiché.

    J'ai tenté d'insérer le même code dans plusieurs événements du formulaire principal, sans succès.
    J'ai tenté d'insérer le même code dans plusieurs événements du sous formulaire, sans plus de succès.

    Je ne sais plus où chercher (J'y suis depuis plus de 5 heures...)

    Merci de m'apporter votre aide.

    Jacques

  2. #2
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    En général, cette mise à jour se fait via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.requery ou me.refresh

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci Zekraoui_Jakani

    En effet, Me.Requery met à jour le formulaire. et Me.Sousformulaire.Requery remet le sous-formulaire à jour et affiche le premier enregistrement.

    Dans mon formulaire principal, je sélectionne le client. Ce sont effectivement les informations sur ce client, mais ceux de la première semaine de transactions (un enregistrement = les transactions de la semaine). La clé de la table est une date, celle du lundi de cette semaine. La table est triée sur cette date. Je voudrais que ce soient les transactions de la semaine courante qui soient affichées.

    Le problème que j'ai, c'est que le changement du nom du client se fait dans le formulaire et que l'affichage des informations du client se fait dans le sous formulaire. Pour pouvoir avoir accès à une sub du sous-formulaire, je dois la déclarer Public au lieu de Private. J'ai beaucoup de réticences à déclarer une sub Public.

    Par contre, si un événement (Sur activation, Si modification, Sur réception focus...) est déclenché dans le sous formulaire au moment où le père (formulaire) est changé et que le fils (sous-formulaire) doit refléter ce changement, je pourrais y insérer un petit bout de code. C'est cet événement (dans le sous-formulaire) que je voudrais connaître.

    Je vous remercie de votre aide.

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    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 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    J'avoue que je n'ai pas compris grand chose
    Citation Envoyé par jbellavance Voir le message
    Avec la relation Père-Fils, Le filtrage des enregistrements dans le sous-formulaire se fait automatiquement.
    Oui à condition de trouver le bon couple père-fils et seulement si c'est toujours le même. Sinon il est toujours possible de modifier le recordsource de la sous-fenêtre chaque fois que nécessaire.
    Citation Envoyé par jbellavance Voir le message
    J'ai beaucoup de réticences à déclarer une sub Public.
    Je ne suis pas sûr que ce soit la solution mais pourquoi donc ?
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Bonjour à tous et merci nico84,

    Afin de clarifier, je vais nommer les objets qui doivent communiquer ensemble :
    Tables :
    Élèves : NoFicheÉleve (Long), Prénom (Chaîne), Famille (Chaîne)
    Inscriptions : NoFiche (Le numéro de la fiche de l'élève à qui appartient l'enregistrement) (Long), DébutSemaine (Date), Lun (Chaîne), Mar (Chaîne), Mer (Chaîne), Jeu (Chaîne), Ven (Chaîne)

    Un formulaire principal : « Horaire-Prof ». Il ne contient qu'un seul contrôle : Une zone de liste déroulante nommée : « Liste des élèves », qui retourne un « NoFicheÉlève » de la table « Élèves »
    Un sous-formulaire : « Horaire » qui affiche les enregistrements de la table inscriptions. Le sous-formulaire est tel qu'il n'affiche qu'une semaine par écran.

    La relation père-fils est : « NoFicheÉlève » -> « NoFiche »

    Quand j'ouvre « Horaire-Prof », La liste déroulante contient le numéro de fiche de l'élève du début de la liste (en ordre alphabétique). De plus, grâce au code suivant, dans le Module du sous-formulaire « Horaire », il affiche la semaine courante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub Form_Load()
      Dim sql As String
     
      sql = "Semainedu = " & SqlDate(CeLundi) 'Prépare la date du lundi de la semaine courante
      Me.Recordset.FindFirst sql              'Dans les données du formulaire, trouve la date
      Me!Lun.SetFocus                           'Curseur dans le champ Lundi
    End Sub
    Quand je choisis un autre élève dans la liste déroulante (Formulaire principal « Horaire_Prof »), le sous-formulaire affiche la première semaine (en ordre chronologique) de l'élève que je viens de choisir, grâce à la relation père-fils. C'est ce que doit faire Access et il le fait bien.

    Je voudrais que ce soit la semaine courante qui s'affiche.

    Ce que je fais présentement, c'est de créer un bouton « CetteSemaine » dans le sous-formulaire, qui reprend le code précédent dans son Événement : Sur Clic. (Private Sub CetteSemaine_Click()). J'obtiens donc le bon enregistrement.

    Ce que je désire, c'est que la chose se fasse sans avoir recours au bouton du sous-formulaire.

    Je pourrais déclarer « Public Sub CetteSemaine_Click() » et l'appeler à partir du module de « Horaire-Prof », simulant ainsi que le bouton « CetteSemaine » a été pressé. Comme je l'ai dit, en dernier dernier recours, je pourrais le faire (et ça fonctionne, je l'ai essayé), mais ce serait la première fois que je déclarerais une sub Public, car elle peut être appelée de partout dans la base de données.

    Je pense que, pour pouvoir afficher le bon enregistrement, le sous-formulaire doit être avisé par le formulaire que le contenant « Père » a changé au moment même de ce changement. Une "conversation comme" :
    1) Horaire-Prof : le père a changé
    2) Horaire : Bien reçu
    3) Horaire : Me.Recordset.Requery
    4) Horaire : Me.Repaint

    J'ai bien lu https://support.office.com/fr-fr/art...7-ce86553682f9.

    Il n'y est question, dans la partie Formulaire et sous-formulaire que lors de l'ouverture ou de la fermeture et lors du passage du contrôle entre les deux. Je n'y ai rien trouvé pour le changement lors d'une modification dans le formulaire principal du contenant « Père »

    J'ai jusqu'au 6 octobre pour trouver une solution, car je dois livrer à cette date.

    Merci pour votre aide

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    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 087
    Points : 5 203
    Points
    5 203
    Par défaut
    C'est un peu plus clair

    Pour commencer, tout ce qui est dans le form_load ne s'exécute qu'une fois au chargement donc comme aurait dit lapalice si ça doit s'exécuter à chaque changement d'élève... il faut l'exécuter à chaque changement d'élève

    Pour cela on peut appeler une procédure publique (seul inconvénient : elle est toujours chargée en mémoire, mais la mémoire y'en a plein), ou alors faire le travail dans la fenêtre principale en manipulant les objets de la sous-fenêtre. Il y a plein de syntaxes qui marchent (mais bien plus qui ne marchent pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.fille1.recordset.findfirst ...
    forms("masousfenetre").recordset.findfirst ...
    form_masousfenetre.recordset.findfirst ... 'celle ci est étrange mais c'est ma préférée
    parfois ça marche aussi avec des ! à la place des .

    Ou alors il suffit de ne mettre que la dernière semaine dans la source de la sous-fenêtre, auquel cas il n'y a plus rien à exécuter
    Pourquoi charger toutes les semaines si on n'en veut qu'une ?

    Il est aussi possible d'avoir 2 pères et 2 fils (l'élève et la semaine)
    ...sans parler de la solution sans père-fils évoquée précédemment

    Mais finalement comme j'aime bien faire simple il me semble que tout peut être fait dans un formulaire : choix de l'élève dans l'entête, affichage de la semaine dans le détail (par me.filter ou modif de me.recordset)
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci Nico84,

    Je vais donc opter pour la solution de déclarer publique la sub qui affiche le bon enregistrement.

    Merci beaucoup pour ton aide.

    Jacques

  8. #8
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Finalement, j'ai trouvé :

    Le but était de faire une action dans un sous-formulaire quand quelque chose change dans le formulaire principal, en plus de ce qui est fait automatiquement par Access lorsque le Parent change

    Ce que je cherchais c'était : dans quel événement dois-je mettre le code pour que cela se produise.

    Merci à nico84 qui m'a aiguillonné sur le bonne piste : Le Form_Load

    Comment peut-on forcer un sous-formulaire à ré-exécuter un Form_Load à partir du formulaire principal? Voilà la question

    La réponse est la suivante :
    Dans le formulaire principal, le contrôle qui change ce qui est affiché dans le sous-formulaire (le Parent) possède un événement : contrôle_AfterUpdate (Il y en a peut-être d'autres, mais celui-là marche)
    Dans cet événement, insérer le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Me.Sousformulaire.SourceObject = "SousFormulaire"
    Et voila! Le code Form_Load du sous-formulaire sera exécuté... dans une Sub... Private

    Je vous remercie tous de m'avoir aidé.

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

Discussions similaires

  1. Code pour changer groupe utilisateurs?
    Par sash6 dans le forum Sécurité
    Réponses: 2
    Dernier message: 20/11/2009, 10h33
  2. Code pour changer le papier peint
    Par ouisansdoute dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/03/2009, 11h55
  3. Réponses: 3
    Dernier message: 01/06/2006, 09h49
  4. [Batch] Code pour changer le dns
    Par rabobsky dans le forum Windows XP
    Réponses: 2
    Dernier message: 14/10/2005, 22h13

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