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

IHM Discussion :

Fermeture tous les formulaires ouverts sauf 1


Sujet :

IHM

  1. #1
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut Fermeture tous les formulaires ouverts sauf 1
    Bonjour,
    Je voudrais pouvoir fermer tous les formulaire ouvert sauf un ayant un nom précis.

    Ce code me permet de fermer tous les formulaires mais comment le modifier pour éviter la fermeture du formulaire "toto"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Do While Forms.Count > 0
         DoCmd.Close acForm, Forms(0).Name
    Loop
    Merci à tous pour votre aide
    Fred

  2. #2
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonjour,

    Tout simplement avec un "If" et en changeant la condition de ton While.
    Car tu boucle tant que tu a un formulaire ouvert
    Essaye plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NbrForms=Forms.Count
    For I=0 to NbrForms
    	if Forms(I).Name<>"TOTO" then
         		DoCmd.Close acForm, Forms(I).Name
    	end if
    Next I

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    En faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Do While Forms.Count > 0
         If Forms(0).Name <> "Toto" then
              DoCmd.Close acForm, Forms(0).Name
         End If
    Loop
    Cordialement,

  4. #4
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonjour madefemere

    Comment tu sorts de ta boucle ???
    Car si tu ne ferme pas le formulaire "toto" Forms.Count sera toujours supérieur à zéro

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 917
    Points
    281 917
    Par défaut
    Bonjour,

    Je propose ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub FermeTousSaufToto()
      Do While Forms.Count > 1
          If Forms(0).Name <> "toto" Then
              DoCmd.Close acForm, Forms(0).Name
            Else
              DoCmd.Close acForm, Forms(1).Name
          End If
      Loop
    End Sub

    Didier,




    À chaque occurrence de suppression, la numérotation change

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Salut tout le monde,

    Eh oui, répondre dans la foulée n'est jamais évident Manque d'attention et pas de tests, donc on laisse passer certaines trivialités .

    Fred, t'as compris, il faut mettre un If quelque part.

    Bonne continuation à tous

  7. #7
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Ok pour le If, mais il faut pouvoir sortir de la boucle aussi

    Pour ma part l'erreur que claude a eu c'est a cause d'une boucle qui va trop loin !
    Si la collection part de zéro alors il faut allez jusqu'a Forms.Count-1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NbrForms=Forms.Count-1
    For I=0 to NbrForms
    	if Forms(I).Name<>"TOTO" then
         		DoCmd.Close acForm, Forms(I).Name
    	end if
    Next I
    méa cupla

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Didier,

    Je parlais de "nous" avec notre volonté d'aider les autres et d'être presser.
    On attend ce que va dire Fred

    Bonne continuation

  9. #9
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 917
    Points
    281 917
    Par défaut
    Didier,
    Imagine
    FormulaireA : forms(0)
    FormulaireB: forms(1)
    FormulaireToto: forms(2)

    Tu dis boucler de 0 à 2

    1er tour avec 0
    tu fermes FormulaireA
    => les index deviennent
    FormulaireB: forms(0)
    FormulaireToto: forms(1)

    2e tour avec 1
    Tu évites Toto et il reste
    FormulaireB: forms(0)
    FormulaireToto: forms(1)

    3e tour avec 2
    Tu cherches forms(2)


  10. #10
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonsoir Claude

    Merci et bien vu pour le débogage

    effectivement c'est vrai que les index de la collection Forms se modifie des lors que l'on va en ouvrir ou en fermer un
    Bravo et merci a toi
    Je l'avais oublié et pas tester.
    A force d'avoir l'habitude de parcourir les collections d'objets mais sans les fermer, j'avais omis ce point de détail très important.
    Ta solution est donc la seule qui marche.
    je n'essayerai même pas d'expliquer comment charger les noms des formulaires dans une variable tableau excepté le "toto" en question pour ensuite fermer tous les formulaires ouverts dont on a récupéré le nom
    Ta solution est plus simple et plus claire
    Mais c'est bien pour cela aussi que tu es "rédacteur"

    Bonne soirée à tous et surtout bonne continuation à fred

    PS : madefemere j'avais bien compris et bien pris ce que tu disais

  11. #11
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 917
    Points
    281 917
    Par défaut
    Bonjour,

    charger les noms des formulaires dans une variable tableau excepté le "toto" en question pour ensuite fermer tous les formulaires ouverts dont on a récupéré le nom.
    Bonne idée ! … et l’occasion d’expliquer comment alimenter un tableau en lui ajoutant une colonne à chaque cycle de la boucle sur les formulaires ouverts (instruction Redim).

    « Rédacteur » parce que j’ai du temps libre et que j’aime expliquer quand j’ai enfin compris comment ça marche.

    Bon week-end.

  12. #12
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonjour,

    Parce que c'est samedi
    Parce que j'ai le temps
    Parce que cela m'amuse
    Voila un petit morceau de code qui peut servir d'exemple de passage de paramètre, de parcours d'une collection d'objet, de redimensionnement d'un tableau dynamique et de récupération de son nombre d'élément grâce a "Ubound"

    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
    Sub FermeToutSauf(ByVal psFormName As String)
    Dim I As Integer
    Dim vtFormNames() As String
    Dim voForm As Form
        For Each voForm In Forms
            If voForm.Name <> psFormName Then
                ReDim Preserve vtFormNames(I)
                vtFormNames(I) = voForm.Name
                I = I + 1
            End If
        Next
        For I = 0 To UBound(vtFormNames)
            DoCmd.Close acForm, vtFormNames(I)
        Next
    End Sub
    Et pour appeler la procédure :
    Bonne journée

  13. #13
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 917
    Points
    281 917
    Par défaut
    Ben, tu vois quand on a le temps !

  14. #14
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut
    Salut les gars et merci à vous trois pour vos réponses.
    Je vais tester tout ca lundi à tête repose car la avec le changement d heure je suis un peu décalé
    J avais essayé avec un if mais j avais bien réussi.
    Le solution de Claude me semble très bien mais pour le fun je vais essayer de comprendre ton bout de code Didier.
    Bon we
    Fred

  15. #15
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonjour,

    Comme c'est dimanche et que j'ai un peu de temps, je vais faire ma BA et essayer de mettre des commentaire
    Ce n'est pas mon fort, mais cela pourras t'aider à comprendre le code

    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
    Sub FermeToutSauf(ByVal psFormName As String)
    Dim I As Integer
    Dim vtFormNames() As String 'déclaration d'une variable de type tableau
    Dim voForm As Form 'déclaration d'une variable objet de type formulaire
        ' dans un premier temps on parcours la collection Forms des formulaires ouverts afin de récupérer dans un tableau leurs noms
        For Each voForm In Forms ' Grace au For Each je parcours toute la collection sans avoir besoin d'un Set pour affecté ma variable voForm
            If voForm.Name <> psFormName Then 'Je test le nom du formulaire qui se trouve dans ma variable  voForm et le compare au nom passé en paramètre dans la variable psFormName ("toto" dans ton cas)
                ReDim Preserve vtFormNames(I) 'A chaque fois, j'ajoute un élément dans ma variable tableau tout en préservant les valeurs initialement remplies
                vtFormNames(I) = voForm.Name 'Ensuite j'affecte le nom de mon formulaire à ce nouvel élément de mon tableau
                I = I + 1 'J'incrémente mon compteur afin de pouvoir le cas échéant ajouter une nouvel dimension à mon tableau.
            End If
        Next
        ' à la sortie de ma boucle, j'ai récupérer la liste de tous les noms des formulaires ouverts dans ma variable tableau excepté celui passé en paramètre
        For I = 0 To UBound(vtFormNames) 'Je parcours tous les éléments de mon tableau grâce  a leur indice et m'arrête sur le N° du dernier élément renvoyé par Ubound()
            DoCmd.Close acForm, vtFormNames(I) 'je ferme ces formulaires grâce à leur nom.
        Next
    End Sub
    Donc si on appelle la procédure ainsi:
    On ferme tout sauf le formulaire "Toto" et s'il n'est pas ouvert, on ferme tout comme si on mettait le nom d'un formulaire qui n'existe pas ou si on met "" à la place de "Toto"

    Si on avait voulu ne pas être obligé de passer un paramètre pour pouvoir tout fermer on aurait du déclarer la procédure comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub FermeToutSauf(Optional ByVal psFormName As String)
    Ce qui nous permet d'appeler la procédure de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FermeToutSauf "Toto"
    ou
    FermeToutSauf
    Et voila

    Bon dimanche

  16. #16
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut
    Salut Didier
    Merci pour tes commentaires c'est très clair et j'ai bien compris. C'est nickel.
    Mais du coup en terme d'efficacité, quelle sera la différence entre ton code et celui de Claude? (juste pour mon info car je travaille seulement avec 4-5 formulaire donc je ne suis pas sur que la différence soit visible).

    Bonne journée
    Fred

  17. #17
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonjour,

    Aucune c'était juste un exercisse de style pour pouvoir expliquer d'autres manière de manipuler les collections

  18. #18
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut
    OK merci.
    Ca marche nicke!!!

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

Discussions similaires

  1. [FAQ] Fermer tous les formulaires ouverts
    Par guigui5931 dans le forum Contribuez
    Réponses: 19
    Dernier message: 15/02/2024, 16h57
  2. [XL-2007] Eviter la fermeture de tous les formulaires
    Par Cesaror dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/05/2012, 14h18
  3. Fermeture d'une fenêtre avec tous les onglets ouverts
    Par Invité dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/11/2008, 08h44
  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