Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Fermer tous les formulaires ouverts
Toujours dans l'optique de l'optimisation des traitements par les
boucles, nous proposons de découvrir ici comment il est possible de fermer en même temps
tous les formulaires ouverts, au clic sur un bouton. Cette solution n'est pas dénuée d'intérêt pour les lourdes applications embarquant un grand nombre d'outils hébergés par des formulaires différents. Elle offre confort et gain de temps quand il est question de purger l'espace de travail.
Base de données Access à télécharger
Pour la mise en place de cette
astuce VBA Access, nous suggérons d'appuyer l'étude sur une
base de données embarquant un certain nombre de
formulaires.
- Télécharger le fichier compressé fermer-tous-formulaires.rar en cliquant sur ce lien,
- Le décompresser dans le dossier de votre choix,
- Double cliquer sur le fichier réceptionné pour l'ouvrir dans Access,
- Cliquer sur le bouton Activer le contenu du bandeau de sécurité,
- Dans le volet de navigation, double cliquer sur l'avant dernier formulaire nommé fFermer,
Comme vous pouvez le voir, il s'affiche en
mode Fenêtre. Un clic sur son bouton doit
fermer tous les formulaires ouverts. Ces
formulaires sont énumérés dans le
volet de navigation sur la gauche de l'écran. Ils ont été majoritairement importés depuis une autre application sans leurs sources. C'est la raison pour laquelle ils ne sont pas fonctionnels. Mais ce n'est pas ce qui nous préoccupe ici.
- Dans le volet de navigation, double cliquer tour à tour sur chaque nom de formulaire,
De cette manière, nous les ouvrons tous dans des onglets. Le
formulaire fFermer continue de les survoler tous.
Code VBA au clic sur le bouton
Nous devons maintenant initialiser la
procédure VBA à attacher au
bouton de fermeture.
- Dans le volet de navigation, cliquer droit sur le formulaire fFermer,
- Dans le menu contextuel, choisir le mode Création,
- Sur le formulaire en conception, cliquer sur le bouton Fermer les formulaires,
- Activer alors l'onglet Evénement de sa feuille de propriétés,
- Puis, cliquer sur le petit bouton de son événement Au clic,
- Dans la boîte de dialogue qui suit, choisir le Générateur de code et valider par Ok,
Nous basculons ainsi dans l'
éditeur de code VBA Access, plus précisément entre les bornes de la
procédure événementielle fermerTout_Click. Son code se déclenchera au clic sur ce bouton.
Les objets de formulaires
Pour piloter les
formulaires Access par le
code VBA, nous avons besoin d'objets les désignant.
- Dans les bornes de la procédure, ajouter les déclarations et l'affectation suivantes :
...
Dim chaqueForm As Form: Dim tousForm As Forms
Dim compteur As Byte
Set tousForm = Application.Forms
...
La
variable chaqueForm est typée comme un
objet représentant un
formulaire (Form). C'est elle que nous utiliserons pour les
parcourir tous dans la
collection. Et précisément, cette
collection de formulaires doit être représentée par la
variable tousForm, typée comme une
collection de formulaires (Forms). Nous exploiterons plus tard la
variable compteur pour connaître le nombre de formulaires ouverts. Vous verrez qu'elle sera utile pour corriger une petite anomalie de fonctionnement.
Ensuite, nous initialisons (Set) la
variable tousForm, sur la collection des formulaires ouverts. Elle les représente tous désormais.
Parcourir tous les formulaires ouverts
Nous allons maintenant pouvoir exploiter cet objet pour passer en revue
chacun des formulaires ouverts.
- A la suite du code, ajouter les instructions VBA suivantes :
...
For Each chaqueForm In tousForm
DoCmd.Close acForm, chaqueForm.Name, acSaveYes
Next chaqueForm
...
Nous exploitons une classique
boucle For Each pour
parcourir chaque formulaire (chaqueForm) dans la
collection des formulaires ouverts (tousForm). A chaque passage dans la boucle, grâce à la
méthode Close de l'
objet DoCmd, nous fermons le formulaire en cours d'analyse. Pour cela, nous passons son nom (chaqueForm.Name) en deuxième paramètre de la méthode.
- Enregistrer les modifications (CTRL + S) et basculer sur le formulaire fFermer (ALT + Tab),
- L'enregistrer à son tour et l'exécuter par exemple avec la touche F5 du clavier,
- Puis, cliquer sur le bouton Fermer les formulaires,
Le processus démarre. Quelques formulaires sont fermés comme d'ailleurs notre formulaire de fermeture. Puis, il se stoppe brutalement.
Et ce n'est pas la fermeture de notre formulaire pilote qui est la cause de cette anomalie. A chaque fois qu'un formulaire est fermé, leur nombre n'est plus le même dans la collection. La
boucle For Each s'arrête prématurément estimant avoir parcouru la quantité réactualisée à chaque passage.
Forcer la fermeture des formulaires ouverts
Pour pallier le dysfonctionnement, nous suggérons de
forcer la boucle For Each à reprendre ses passages tant que le
nombre de formulaires ouverts n'a pas atteint le chiffre de zéro. C'est la raison de la déclaration de la
variable compteur. Et c'est une
boucle While qui permet de forcer un traitement à se répéter tant qu'un objectif n'est pas atteint.
- Rouvrir tout d'abord tous les formulaires qui ont été fermés,
- Adapter ensuite le code VBA en fonction des instructions données en gras :
Private Sub fermerTout_Click()
Dim chaqueForm As Form: Dim tousForm As Forms
Dim compteur As Byte
Set tousForm = Application.Forms
compteur = tousForm.Count
While compteur > 0
For Each chaqueForm In tousForm
DoCmd.Close acForm, chaqueForm.Name, acSaveYes
Next chaqueForm
compteur = tousForm.Count
Wend
End Sub
Grâce à la
propriété Count de la
collection Forms, nous prélevons la quantité de formulaires ouverts que nous stockons dans la
variable compteur. Grâce à la
boucle While exploitant cette variable en critère, nous ordonnons à la
boucle For Each de poursuivre tant que des formulaires restent ouverts. Bien sûr à chaque passage dans cette boucle parent, nous n'oublions pas de réactualiser ce chiffre (compteur = Application.Forms.Count) puisque des formulaires ont nécessairement été fermés dans l'intervalle.
- Enregistrer les modifications et basculer sur le formulaire de fermeture,
- Puis, cliquer sur le bouton Fermer les formulaires,
Cette fois et comme vous pouvez l'apprécier, tous les onglets sont parfaitement fermés, avec un seul traitement.
Enfin, pour coder proprement et comme toujours, il convient de libérer les ressources en détruisant les deux variables objets. Pour cela, il suffit d'ajouter les deux instructions suivantes à la fin du code de la procédure événementielle :
Set chaqueForm = Nothing
Set tousForm = Nothing