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
|