Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Contribuez
Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/06/2006, 11h40   #1
Membre Expert
 
Avatar de guigui5931
 
guillaume defrain
Inscription : avril 2006
Messages : 1 667
Détails du profil
Informations personnelles :
Nom : guillaume defrain
Âge : 25
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2006
Messages : 1 667
Points : 2 099
Points : 2 099
Par défaut [FAQ] Fermer tous les formulaires ouverts

Code :
1
2
3
4
5
6
7
8
Public Sub fermerToutFormulaire()
    Dim frm As Form
    ' Enumère la collection Forms.
    For Each frm In Forms
         ' Ferme le formulaire.
          DoCmd.Close acForm, frm.Name, acSaveNo
     Next frm
End Sub
C'est pas grand chose mais ça peut peut être aider
guigui5931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2006, 15h22   #2
Membre Expert
 
Avatar de Papy Turbo
 
Homme Etienne Pailleret
Développeur VBA
Inscription : mars 2004
Messages : 742
Détails du profil
Informations personnelles :
Nom : Homme Etienne Pailleret
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur VBA

Informations forums :
Inscription : mars 2004
Messages : 742
Points : 1 096
Points : 1 096
Merci, guigui, mais attention, ta fonction ne va fermer qu'un seul formulaire sur 2 (s'il y en a plus de 3 qui sont ouverts).
Dans toute collection, pour supprimer tous les objets, il faut procéder à l'envers, du dernier au premier
Je te propose la mienne :
Code :
1
2
3
4
5
6
7
Public Sub CloseAllForms()
Dim Ptr                  As Long
 
    For Ptr = Forms.Count - 1 To 0 Step -1
        DoCmd.Close acForm, Forms(Ptr).Name
    Next
End Sub
L'autre solution consiste à fermer le 1er, tant qu'il en reste au moins un :
Code :
1
2
3
Do WHILE Forms.Count
    Docmd.Close acForm, Forms(0).Name
Loop
Papy Turbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2006, 16h24   #3
Membre Expert
 
Avatar de guigui5931
 
guillaume defrain
Inscription : avril 2006
Messages : 1 667
Détails du profil
Informations personnelles :
Nom : guillaume defrain
Âge : 25
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2006
Messages : 1 667
Points : 2 099
Points : 2 099
Exact il faut que je change ça dans mon projet.

Merci du conseil
guigui5931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2006, 06h08   #4
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Bonjour,

en faisant comme ça, ca ferme tout aussi :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 
Public Sub CloseAllForms()
On Error GoTo errortag
   Dim oObj As AccessObject
 
   For Each oObj In Application.CurrentProject.AllForms
      If oObj.IsLoaded = True Then
         DoCmd.Close acForm, oObj.Name, acSaveNo
      End If
   Next oObj
fin:
   Set oObj = Nothing
   Exit Sub
errortag:
   Resume fin
End Sub
Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2006, 18h15   #5
Membre Expert
 
Avatar de Papy Turbo
 
Homme Etienne Pailleret
Développeur VBA
Inscription : mars 2004
Messages : 742
Détails du profil
Informations personnelles :
Nom : Homme Etienne Pailleret
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur VBA

Informations forums :
Inscription : mars 2004
Messages : 742
Points : 1 096
Points : 1 096
Petite question, philben, puisque tu utilises ce code.

J'ai le souvenir d'avoir utilisé ".IsLoaded", plutôt que de parcourir la collection des Forms, en me disant "ce sera plus rapide". Je faisais ça simplement pour savoir si un formulaire était ouvert, ce qui reviendra au même.

J'ai abandonné cette méthode, quand je me suis aprerçu qu'elle était extrêmement lente : en fait, Access ouvrait le formulaire avant de renvoyer Vrai ou Faux !!! (puis il le refermait !)
Je pense qu'il devait s'agir de la première mouture d'Access 2000 ?

Je vais refaire les tests, mais, est-ce que tu peux me confirmer déjà qu'il ne s'agissait que d'un défaut de jeunesse, aujourd'hui corrigé ?

P.S. : ça ne t'ennuierait pas de supprimer ce contrôle d'erreur qui ignore tout (Resume Fin - Aaaaargh!). Ça va m'empêcher de dormir pendant plusieurs nuits, sinon.
Papy Turbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 12h47   #6
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Bonjour Papy Turbo,

Citation:

Je vais refaire les tests, mais, est-ce que tu peux me confirmer déjà qu'il ne s'agissait que d'un défaut de jeunesse, aujourd'hui corrigé ?

Franchement, c'est rapide et sans bug.

Je crois que l'on peut écrire seulement ( à vérifier):
Code :
1
2
3
4
5
 
 
For Each oObj In Application.CurrentProject.AllForms
      DoCmd.Close acForm, oObj.Name, acSaveNo
Next oObj
Citation:
P.S. : ça ne t'ennuierait pas de supprimer ce contrôle d'erreur qui ignore tout (Resume Fin - Aaaaargh!). Ça va m'empêcher de dormir pendant plusieurs nuits, sinon

En faite, dans mon code d'origine j'avais un gestionnaire d'erreur avant le resume Fin, que j'ai enlevé ici d'ou le resume fin orphelin et inutile!!!

Je savais que j'allais me faire frotter les oreilles...

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 15h25   #7
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Là, on va tenter des femretures sur des formulaires qui ne sont peut être pas ouvert. Je suis pas sur que niveau perf et robustesse ce soit optimal
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 15h59   #8
Membre Expert
 
Avatar de Papy Turbo
 
Homme Etienne Pailleret
Développeur VBA
Inscription : mars 2004
Messages : 742
Détails du profil
Informations personnelles :
Nom : Homme Etienne Pailleret
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Développeur VBA

Informations forums :
Inscription : mars 2004
Messages : 742
Points : 1 096
Points : 1 096
Oui, là, comme dit Tofalu, si tu ne testes plus le ".IsLoaded", tu vas avoir une erreur pour chaque formulaire non ouvert ! Et y a pas plus lent.

Même si tu le testes (.IsLoaded), ce qui paraît bien indispensable, je ne suis pas sûr que cette méthode soit + rapide que l'autre, sur la collection Forms.
- Forms ne contient que les formulaires ouverts (ceux qu'on cherche),
- AllForms non seulement les contient tous, mais aussi tous les sous-formulaires.
Si le nombre de formulaires + sous-formulaires dans ton application est grand, la méthode AllForms sera plus lente que la "bonne vieille" méthode avec Forms !

à tester !
Papy Turbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 20h58   #9
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Bonjour,

vous avez raison, ce n'est pas robuste si on ne teste plus l'ouverture du form par isloaded.

Par contre, au niveau performance, je trouve cette méthode rapide pour l'utilisation que j'en fait. En effet je ne l'utilise que dans des cas particuliers comme un utilisateur qui a oublié de se délogger, etc...

C'était juste une alternative possible aux méthodes proposées par Papy Turbo.

amicalement,

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2006, 15h46   #10
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Le gros soucis avec cette méthode :

Elle nécessite :

- Parcours de chaque formulaire (200 parfois juste pour en fermer 2)
- Un test sur chaque formulaire
- Et surtout au moins Access 2000
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2006, 18h26   #11
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Bonjour,

Hum, Hum, les résultats sont là



Sans rancune...

Philippe

Modification : voir http://www.developpez.net/forums/sho...08#post1098808
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2006, 08h47   #12
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Re bonjour,

J'ai 'implémenté' les 2 fonctions proposées par Papy Turbo...

Résultat : 1 partout ! mais Papy Turbo a fait rentrer les remplaçants...

Amicalement,

Philippe

http://www.developpez.net/forums/sho...69#post1122669 - Version 1.12
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2006, 16h09   #13
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Tu as essayé ta méthode pour 10 formulaires ?

Là, ton exemple de 25 n'est pas parlant car la collection Forms tend à rejoindre Allforms du coté du nombre d'élement. En fermant 25 formulaire sur 27,tu ne traite pas les cas des formulaires qui ne sont pas ouverts.

Pour 10 formulaire, la différence temps de traitement est de l'ordre de 25 %

Il ne faut pas prendre les cas particuliers où l'utilisateurs aura fermés tous ou auncun formulaire (car pour aucun, la méthode Forms est instantanée). Mais il faut plutot prendre un cas typique où l'utilisateur aura ouvert entre 5 et 10 formulaire (et jamais plus de la moitié des formulaires)
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2006, 18h39   #14
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Re bonjour,

J'ai fait le test suivant :
1) Création de 100 formulaires
2) Ouverture de 10 formulaires sur 100 (j'ai essayé avec 30/100, c'est pareil)
3) fermeture de ces 10 formulaires

meilleurs résultats obtenus :
boucle for sur forms : 156 ms
do while sur forms : 94 ms
for each sur allforms : 99 ms

Caractéristiques :
Processeur : 3 giga hertz
Access : 2003

je me suis peut-être planté dans mon jeu de test mais les chiffres sont là avec ma configuration.

C'est vrai que ce n'est pas logique, la boucle for each est-elle spécialement optimisée ?
Sur d'autres configurations, les résultats sont-ils totalement différents ?

Pour arrêter les flèches des apaches , la meilleure solution est donc la boucle do while de Papy Turbo.

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2006, 19h49   #15
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Il se peut que for each soit plus otpimisé car typé et la variable utilisé par le parcours est déclaré en entête, sa référence mémoire est donc localisée uniquement lors de la première utilisation. En revanche, avec un while, une nouvelle variable est créée à chaque parcours
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 10h17   #16
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Attention, avec la réponse que tu as effacé, tu ne supprimes qu'un formulaire sur deux lorsqu'il y en a au moins 3 d'ouvert.

Pour ce qui est des tests, il serait bon aussi de tester avec des formulaires ayant un jeu d'enregistrements conséquent.
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 13h02   #17
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Bonjour,

Citation:
Attention, avec la réponse que tu as effacé, tu ne supprimes qu'un formulaire sur deux lorsqu'il y en a au moins 3 d'ouvert.

Ben oui, on retombait sur la solution de Guigui5931 : Très rapide mais des formulaires restent ouverts...


J'essayerai avec un formulaire ayant des enr.

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 13h50   #18
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
Et ben là, je tombe sur le c**.

Je viens de réessayer avec 25 formulaires et je retrouve la méthode Forms plus rapide, alors qu'avant, j'avais les mêmes résultats que toi
Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2006, 06h57   #19
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 586
Points : 1 586
Bonjour,

j'ai essayé avec des formulaires dépendants (liés à la table TTemporaire) et ça ne change rien...

Citation:
Je viens de réessayer avec 25 formulaires et je retrouve la méthode Forms plus rapide, alors qu'avant, j'avais les mêmes résultats que toi

J'ai aussi des deltas de vitesse parfois important.

Premièrement, Je me suis aperçu que windows, lors du premier test, essaye souvent de créer 1 bouton par formulaire ouvert dans la barre de tâche et ça ralenti l'execution du test.
Si on relance 2 à 3 fois le test en cliquant sur le bouton <Test>, Windows regroupe les formulaires ouverts dans un seul bouton de la barre de tâche et ça stabilise les vitesses d'éxecution.

Deuxièmement, d'autres évènements système peuvent perturber la vitesse du test.

En relançant plusieurs fois le test on obtient des temps à peu près significatifs je pense.

Dans tous les cas de figure testés chez moi (création jusqu'à 100 formulaires, ouverture de 10 % des formulaires,...) le passage par la collection AllForms s'est toujours située en terme de vitesse entre les 2 méthodes passant par la collection Forms et souvent très proche de la méthode la plus performante.

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h57.


 
 
 
 
Partenaires

Hébergement Web