[VBA Access] vérifier si un form est ouvert

Bonjour,

Petite question débile qui m'énerve:

J'ai un formulaire avec une liste déroulante comportant la liste des médecins. Je clique sur un nom pour choisir l'un d'entre eux.
Si le médecin recherché n'est pas encodé, j'ouvre le Form "médecins" qui me permet d'encoder le nouvel enregistrement.

J'aimerais, lorsque je referme ce formulaire encoder directement les données dans le Form précédent pour que l'utilisateur n'ait pas à recommencer la sélection dans la liste...

Pas de problème si ce formulaire est ouvert...
Mais s'il est fermé, j'ai un message d'erreur.

Comment peut-on vérifier si un formulaire est ouvert avant d'exécuter le code?

11 réponses

  1. Bon, là, je réponds très longtemps après le début de ces messages, mais ça peut servir à ceux qui passeront par là :

    Dans mon projet ADP (Access 2003), je veux savoir si un formulaire (nommé frmDossierDetail) est ouvert. Ca ce fait en une ligne :

    If CurrentProject.AllForms!frmDossierDetail.IsLoaded Then
    ...

    D'après l'aide, pour une base MDB, ça doit être :

    If CodeProject.AllForms!frmDossierDetail.IsLoaded Then
    ...

    (Je ne fais pas de MDB, j'apprécie la robustesse de SQL Server qui dans ses versions gratuites SQL Express est bien supérieur aux MDB. J'ai aussi une préférence pour dotNet, mais on ne choisi pas toujours la techno du client !)
    13
    1. Perso, je pratique comme suit:

      ' Formulaire à tester
      dim fm as Form

      On error resume next
      Set fm = forms("MonFormulaire")
      if err.number = 0
      ../.. le formulaire est ouvert
      end if
      on error goto 0
      3
      1. Modérateur
        Salut,

        le petit bout de code suivant t'énumère les formulaires ouverts de la base courante...
        Private Sub Commande1_Click()
        Dim monform
        For Each monform In Forms
            MsgBox monform.Name
        Next
        End Sub

        Et celui-là énumère tous les formulaires de la base courante (ouverts ou fermés) :
        Private Sub Commande1_Click()
        Dim monform As AccessObject
        Dim dbs As Object
        Set dbs = Application.CurrentProject
        For Each monform In dbs.AllForms
            MsgBox monform.Name
        Next
        End Sub


        Ca irait ?
        1
        1. Merci à tous les deux.

          J'ai simplement modifié un peu le code proposé en ajoutant une condition:

          For Each objForm In dbs.AllForms
          If objForm.IsLoaded = True And objForm.Name = "F_Rapport"Then

          actions sur F_Rapport...

          End If
          Next objForm

          Je n'ai jamais eu de cours et j'ai bcp de mal à trouver ce type de code dans l'aide...
          1
          1. Modérateur
            Que je te rassure : moi non plus...

            Et en plus, maintenant, je suis en ACCESS XP (2002) et l'aide est CATASTROPHIQUE !

            Je regrette la version 97 :-(
            0
        2. Bin, pas tout à fait...

          Je voudrais que la procédure ne nécessite pas d'intervention de l'utilisateur:

          Lors de l'ajout d'un enregistrement:
          Si formulaire "F_Rapport" est ouvert alors on le met à jour sinon on ferme le form "F_médecins" sans rien faire d'autre...

          J'ai essayé If IsLoaded() et diff trucs trouvés d'ans l'aide mais je n'ai rien trouvé d'adéquat...
          0
          1. Modérateur
            Et les évènements "avant insertion" et "après insertion" ?

            Sinon, méthode bourrin : interdire la fermeture du form en ôtant les boutons...
            0
            1. L'essai: "NomDuForm.Name" renvoie une erreur
              L'affectation à d'autres événements ne règle pas le problème puisque je veux mettre à jour les champs d'un autre formulaire...

              Je pense avoir trouvé une solution en récupérant l'erreur:

              Sub
              ...
              On Error GoTo Fin

              Attribution des valeurs dans le Form supposé ouvert

              Fin
              DoCmd.Close, "F_Médecins"
              End Sub

              Ce n'est peut-être pas très clean mais ça marche...
              Bizarre comme des fonctions qui paraissent simples peuvent être difficiles à trouver...

              Merci pour ton aide.
              0
              1. Bonjour zenon,

                peut-être que ceci repondra à votre besoin :

                Private Sub ExecuteRoutine_Click()
                
                On Error GoTo Err_ExecuteRoutine_Click
                
                    Dim objForm As AccessObject, dbs As Object
                    Set dbs = Application.CurrentProject
                    For Each objForm In dbs.AllForms
                        If objForm.IsLoaded = True Then
                            MsgBox objForm.Name & " est ouvert."
                        Else
                            MsgBox objForm.Name & " est fermé."
                        End If
                    Next objForm
                    
                Exit_ExecuteRoutine_Click:
                    Exit Sub
                
                Err_ExecuteRoutine_Click:
                    MsgBox Err.Description
                    Resume Exit_ExecuteRoutine_Click
                    
                End Sub
                


                Lupin
                0
                1. Bonjour,
                  Mon problème (sans aucun doute très simple à résoudre maisjamais travaillé avec des objets) est celui-ci:

                  Comment accéder, depuis un "état", aux variables créées dans le code VBA associé à l'ouverture de ce "Form"?
                  Merci bcp!!

                  D'autre part, petit commentaire:

                  If objForm.IsLoaded = True Then

                  peut être résumé à :

                  If objForm.IsLoaded Then
                  0
                2. Modérateur
                  @Alain DaubechiesMerci d'ouvrir un nouveau message sur le problème qui te concerne et de ne pas te rattacher à une discussion déjà cloturée...
                  0
              2. Bjr,

                j'ai encore oublié le Set dbs = Nothing, et tout autre objet instancié.

                je crois que les bouqins servent à parcourrir le reste,
                j'ai un bouqin pour chaque VBA que je pratique, et si
                google est impuissant il ne reste que ça :-)

                je ne sais si une édition à jour existe mais voici celle que je
                connais.

                Beginning Access 97 VBA programming
                Robert Smith and David Sussman

                je te l'accorde le bouquin est en anglais mais bien illustré
                meme avec un interface français on s'y retrouve très bien.
                c'est vrai qu'il faut avoir la chance de le faire...

                Lupin
                0
                1. Je sais que le dernier post date de + d'un an mais si ca peut aider quelqu'un ... voilà une solution pour déterminer si un formulaire est ouvert ou non (solution obtenue dans l'aide sur ActiveForm).

                  L'objectif pour que l'ordi sache si un formulaire est ouvert est de présenter ce formulaire comme fenêtre active quand il est ouvert :
                  {
                  Dim frmFormulaireActif as Form

                  Set frmFormulaireActif = Screen.ActiveForm
                  If frmFormulaireActif = LeFormulaireQueVousCherchez.Name Then
                  ... ' Votre action : le formulaire est actif donc forcément ouvert!
                  End If
                  }

                  Si ca n'est pas le cas, la bidouille est de fermer le formulaire actif jusqu'à tomber sur celui que l'on cherche puis rouvrir les formulaires fermés après avoir fait ce qu'on voulait faire. Il est facilement possible de mémoriser les formulaires fermés pour les réouvrir automatiquement avec des variables Form.

                  J'espère que ca vous avance ?!
                  P.S. : Je suis sous Access 2002
                  0
                  1. [quote="Kiwijinshi"]Bon, là, je réponds très longtemps après le début de ces messages, mais ça peut servir à ceux qui passeront par là [/quote]

                    Et effectivement, ça m'intéresse !

                    Grâce à cette discussion, je sais comment vérifier quels sont les formulaires ouverts ; Je sais aussi trouver leur nom.

                    Maintenant, je souhaite savoir si leur état est MINIMIZE, MAXIMIZE ou RESTORE.

                    Merci par avance.

                    ________________________________________________________________________________________
                    Il n'y a que les fous pour croire que les autres sont fous.
                    0