formateur informatique

Fermer tous les formulaires ouverts en VBA Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Fermer tous les formulaires ouverts en VBA Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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,
Bouton Access pour fermer tous les formulaires ouverts par le code VBA

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.

Certains formulaires Access restent ouverts

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.

Fermer en même temps tous les formulaires Access par le code VBA

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


 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn