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

Contribuez Discussion :

[FAQ] Fermer tous les formulaires ouverts [Fait]


Sujet :

Contribuez

  1. #1
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut [FAQ] Fermer tous les formulaires ouverts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  2. #2
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Do WHILE Forms.Count
        Docmd.Close acForm, Forms(0).Name
    Loop
    Développement Office, support technique, assistance, sur place (Loire atlantique, Vendée, Maine et Loire) ou à distance.

  3. #3
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Exact il faut que je change ça dans mon projet.

    Merci du conseil
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    en faisant comme ça, ca ferme tout aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    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.
    Développement Office, support technique, assistance, sur place (Loire atlantique, Vendée, Maine et Loire) ou à distance.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour Papy Turbo,


    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    For Each oObj In Application.CurrentProject.AllForms
          DoCmd.Close acForm, oObj.Name, acSaveNo
    Next oObj
    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

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    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

  8. #8
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    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 !
    Développement Office, support technique, assistance, sur place (Loire atlantique, Vendée, Maine et Loire) ou à distance.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    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

  10. #10
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    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

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    Hum, Hum, les résultats sont là



    Sans rancune...

    Philippe

    Modification : voir http://www.developpez.net/forums/sho...08#post1098808

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    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

  13. #13
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    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)

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    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

  15. #15
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    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

  16. #16
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    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.

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    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

  18. #18
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    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

  19. #19
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

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

    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

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2020
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2020
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup
    Je cherchais un code pour fermer tous les états.
    Je viens d'y adapter celui que vous avez proposé pour fermer les formulaires.
    Il marche super bien.
    Merci beaucoup.

Discussions similaires

  1. Fermer tous les formulaires actifs dans excel ?
    Par bernard_metz dans le forum Excel
    Réponses: 1
    Dernier message: 08/04/2014, 02h44
  2. [AC-2007] Comment fermer tous les formulaires d'une application ?
    Par eperat dans le forum VBA Access
    Réponses: 15
    Dernier message: 23/04/2013, 08h32
  3. Comment fermer tous les modules ouverts
    Par chim33 dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/02/2009, 14h11
  4. Actualiser tous les formulaires ouverts
    Par baila dans le forum VBA Access
    Réponses: 5
    Dernier message: 28/01/2008, 13h12
  5. Fermer tous les formulaires sauf
    Par marcb03 dans le forum IHM
    Réponses: 4
    Dernier message: 30/03/2007, 16h01

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