Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

Forms: Fermer tous les formulaires avec la syntaxe  "For Each"

Author(s)
Terry Kreft

Fermer tous les formulaires avec la syntaxe  "For Each".

(Q) J'essaie de fermer tous les formulaires en bouclant sur la collection Forms et en utilisant  "For Each frm". Mais cela ne semble pas fonctionner correctement. Qu'est-ce qui ne va pas et comment fermer tous les formulaires?

(A) Un For... Each... Next traverse la collection  Forms dans la même séquence que ces formulaires furent ouverts (séquence de l'index), d'où ce code

 

   dim frm as form   
   for each frm in forms      
     debug.print frm.name   
   next

produira le même effet que

   dim intX as integer
   for intX = 0 to Forms.Count-1      
     debug.print Forms(intX).name   
   next

Le problème c'est qu'en "enlevant" des éléments de la collection, les éléments glissent d'une position: enlevant l'élément en position 0, la position 1 devient 0 et ainsi de suite. Par la suite, le NEXT élément est calculé depuis la position, non depuis la valeur de la clé, et le système passe donc à ce qui est actuellement en position 1, anciennement l'élément qui occupait la position 2, avant que l'élément 0 ne soit effacé. L'élément initialement en position 1, maintenant en position 0, ne s'est donc pas fait effacée et la procédure laisse les éléments initialement impairs intacts.

Une solution est donc de toujours fermer l'élément en première position, ou de commencer vers la fin, bouclant vers le début.

  do while forms.count>0      
    docmd.close acform,forms(0).name   
   loop

ou

   dim intx as integer   
   dim intCount as integer   
   intCount = Forms.count-1
   for intX= intCount to 0 step -1     
    docmd.close acform,forms(intX).name
   next

Il y a une différence entre les deux méthodes: avec la seconde, vous pouvez conditionnellement laisser des formulaires ouverts:

   for intX= intCount to 0 step -1
        if forms(intX).Name <> "MyFormToKeepOpen" then
            docmd.close acform,forms(intX).name        
        end if    
   next

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer