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

Fermé
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 - 15 mars 2006 à 15:04
 BernardH - 1 juil. 2010 à 16:38
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

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
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
blux Messages postés 26152 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 28 juin 2024 3 293
15 mars 2006 à 15:33
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
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
15 mars 2006 à 22:56
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
blux Messages postés 26152 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 28 juin 2024 3 293
16 mars 2006 à 09:04
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
15 mars 2006 à 16:12
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
blux Messages postés 26152 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 28 juin 2024 3 293
15 mars 2006 à 17:06
Et les évènements "avant insertion" et "après insertion" ?

Sinon, méthode bourrin : interdire la fermeture du form en ôtant les boutons...
0
zenon Messages postés 726 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 13 février 2010 180
15 mars 2006 à 18:37
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
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
Alain Daubechies
30 mai 2007 à 12:39
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
blux Messages postés 26152 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 28 juin 2024 3 293 > Alain Daubechies
30 mai 2007 à 12:41
Merci 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
Utilisateur anonyme
15 mars 2006 à 23:17
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
kiwijinshi Messages postés 12 Date d'inscription mardi 27 mars 2007 Statut Membre Dernière intervention 30 juillet 2007
30 juil. 2007 à 14:57
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
[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