Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Supprimer une table en VBA Access
Certaines applications utilisent des
tables temporaires pour stocker et consolider des données, par exemple dans le cas d'une
interface de facturation. Ainsi et à validation, le code n'a plus qu'à récupérer les données insérées pour les intégrer dans les
tables officielles. Mais dès lors, la
table temporaire est de trop. Elle peut être supprimée. Cette nouvelle
astuce VBA Access montre comment
supprimer une table désignée par le
code VBA.
Sur l'exemple illustré par la capture, au
chargement du formulaire, une
liste déroulante se remplit automatiquement des
noms des tables composant la
base de données. Dès lors, l'utilisateur choisit l'une d'entre elles et clique sur le
bouton supprimer. Aussitôt, elle disparaît de l'
affichage actualisé du volet de navigation. Et dans le même temps, la liste déroulante rafraîchit elle aussi son contenu pour ne plus considérer la table effacée.
Base de données Access à télécharger
Pour la démonstration de la technique, nous suggérons d'appuyer l'étude sur une
base de données abritant
quelques tables et offrant ce
formulaire.
Comme l'indique le
volet de navigation sur la gauche de l'écran, cette
base de données est constituée de
10 tables et d'un
formulaire.
- Dans le volet de navigation, double cliquer sur le formulaire fParcourir pour l'ouvrir,
Si vous déployez la
liste déroulante, vous constatez qu'elle est déjà chargée des
noms de table. C'est un
code VBA existant qui s'en occupe, Ã l'
activation du formulaire. Le
bouton Fermer est fonctionnel. Comme son nom l'indique, il permet de
fermer le formulaire. Le
bouton Supprimer est bien entendu inopérant à ce stade. C'est lui que nous devons développer pour
supprimer de la base de données, la
table spécifiée par l'utilisateur avec la liste déroulante.
La déclaration des variables
Nous allons le voir, le développement est relativement simple. De plus, il recèle quelques astuces fort intéressantes et utiles dans d'autres contextes. Tout d'abord, nous avons besoin de
déclarer des variables, notamment pour pointer sur la
base de données en cours.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans les propositions, choisir le mode Création,
- Sur le formulaire en conception, cliquer sur le bouton Supprimer pour le sélectionner,
- Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
Comme vous pouvez le voir, une
procédure événementielle est déjà attachée à l'
événement du clic sur ce bouton.
- Cliquer sur le petit bouton à trois points situé à l'extrémité droite de la zone,
De fait, nous basculons dans l'
éditeur VBA Access entre les bornes de la
procédure supprimer_Click. Supprimer est le nom du bouton. Click est son événement associé. Vous notez de même la présence de la
procédure Form_Current. Comme nous l'avons évoqué, elle s'occupe de
remplir la liste déroulante des
noms de table, au
chargement du formulaire.
- Dans la procédure supprimer_Click, ajouter les déclarations de variables suivantes :
Private Sub supprimer_Click()
Dim base As Database
Dim requete As String: Dim nomTable As String
End Sub
L'
objet base est typé comme un
objet de base de données (Database). Il est destiné à pointer sur la
base de données en cours pour pouvoir manipuler ses objets, comme ses
tables.
La
variable requete, typée comme un texte (String) doit stocker la
syntaxe Sql permettant de
supprimer une table précise. La
variable nomTable est elle aussi typée en texte. Sa vocation est de réceptionner le
nom de la table désignée par l'utilisateur avec la liste déroulante.
Récupérer le nom de la table
Pour pouvoir l'introduire dans la
syntaxe Sql, nous devons maintenant récupérer le
nom de la table choisie par l'utilisateur avec la
liste déroulante.
- A la suite du code VBA, ajouter les instructions suivantes :
...
nomTable = listeTables.Value
If (nomTable <> "") Then
End If
...
C'est effectivement la
propriété Value d'un
objet de zone de liste déroulante qui permet de désigner la valeur sélectionnée par l'utilisateur. Nous la stockons dans la
variable nomTable. Puis, nous engageons un test (nomTable <> "") pour vérifier qu'un choix a bien été émis. En effet, il n'est pas question d'amorcer le traitement si aucune table n'a été définie en amont.
La requête de suppression
Donc, si la table est spécifiée, il est temps d'exécuter la
requête ordonnant sa
suppression. Mais avant cela, nous devons pointer sur la
base de données active, grâce à l'
objet base que nous avons déclaré.
- Dans les bornes de l'instruction conditionnelle, ajouter les instructions VBA suivantes :
...
Set base = CurrentDb()
requete = "DROP TABLE [" & nomTable & "];"
base.Execute requete
...
Nous le savons, c'est la
fonction VBA Access CurrentDb qui permet à un objet d'hériter des propriétés et méthodes pour
piloter la base de données en cours. Dès lors, nous construisons la syntaxe de
destruction de la table grâce à la
clause DROP TABLE suivie du
nom de la table en question. Les crochets ne sont pas forcément utiles. Mais ils sont nécessaires lorsqu'il s'agit de désigner des tables dont les noms comportent des espaces. Sinon, la
syntaxe SQL échoue. Il ne nous reste plus qu'à déclencher cette
requête action grâce à la
méthode Execute de l'
objet base. Bien sûr, la syntaxe lui est passée en paramètre par le
nom de la variable.
Fermer et vider l'objet de base de données
Nous en avons l'habitude désormais, chaque objet qui n'est plus utilisé doit être fermé et vidé pour libérer complètement les ressources.
- A la suite du code de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
base.Close
Set base = Nothing
...
La
méthode Close de l'
objet base permet de fermer l'objet. Sa réaffectation (Set) Ã
Nothing permet de le détruire complètement et donc, de le sortir de la mémoire de l'ordinateur.
Il est donc temps de tester le bon fonctionnement du
code VBA.
- Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
- L'exécuter par exemple avec la touche F5 du clavier,
- Choisir un nom de table avec la liste déroulante,
- Puis, cliquer sur le bouton Supprimer,
Même si le code semble s'être déroulé avec succès puisqu'aucune erreur n'est à déplorer, le rendu du volet de navigation n'est pas très rassurant. La table a priori supprimée est toujours visible. Mais rassurez-vous, cela tient au fait que l'affichage de ce dernier n'a pas été réactualisé. Si vous pointez avec la souris sur ce nom de table, elle disparaît aussitôt.
Rafraîchir le volet de navigation
Cependant, la solution en l'état n'est pas pleinement satisfaisante d'autant que l'
objet Application propose une méthode dédiée pour rafraîchir globalement l'affichage des fenêtres et volets.
- Revenir dans l'éditeur VBA Access,
- Après la destruction de la variable base, ajouter l'instruction VBA suivante :
...
Application.RefreshDatabaseWindow
...
Cette méthode (RefreshDatabaseWindow) ne s'invente pas mais elle porte bien son nom pour actualiser l'affichage des fenêtres.
- Revenir sur le formulaire en exécution,
- Choisir une autre table avec la liste déroulante,
- Puis, cliquer sur le bouton Supprimer,
Cette fois, le résultat est beaucoup plus probant. Comme vous pouvez l'apprécier, dès que la suppression est commandée, le nom de la table disparaît de la liste du volet de navigation. Cependant, un défaut persiste. La liste déroulante du formulaire ne s'actualise pas et c'est gênant. Elle conserve les noms des tables supprimées dans l'énumération.
Actualiser une liste après suppression
Il existe une astuce et technique très simple pour
rafraîchir le contenu d'une liste déroulante après l'exécution d'une
requête Suppression. L'idée consiste Ã
fermer le formulaire pour le
rouvrir aussitôt. La transaction est absolument transparente pour l'utilisateur à la vitesse du processeur. Et comme le formulaire commande le
remplissage de la liste déroulante au chargement, celle-ci sera automatiquement mise à jour
après suppression. Donc, d'autres suppressions de tables pourront être entreprises dans l'enchaînement.
- Revenir dans l'éditeur VBA Access,
- Puis, sous l'instruction précédente, ajouter les deux lignes VBA suivantes :
...
DoCmd.Close acForm, "fParcourir"
DoCmd.OpenForm "fParcourir"
...
Dans les deux cas, c'est l'
objet DoCmd qui est mis à contribution. Sa
méthode Close permet de
fermer un objet dont il est question de définir la nature (acForm) en premier argument et le nom en second paramètre "fParcourir". La
méthode OpenForm est plus directe puisqu'elle inclut la nature de l'objet. Elle permet d'
ouvrir le formulaire dont le nom lui est passé en paramètre.
- Enregistrer les modifications et basculer sur le formulaire,
- Avec la liste déroulante, choisir encore une autre table,
- Puis, cliquer sur le bouton Supprimer,
Cette fois, en même temps que le
volet de navigation actualise son affichage pour
éliminer la table supprimée, la
liste déroulante met à jour ses éléments en cohérence avec les tables encore présentes dans la base de données. Le
code VBA complet que nous avons conçu pour
supprimer une table précise et actualiser les dépendances, est le suivant :
Private Sub supprimer_Click()
Dim base As Database
Dim requete As String: Dim nomTable As String
nomTable = listeTables.Value
If (nomTable <> "") Then
Set base = CurrentDb()
requete = "DROP TABLE [" & nomTable & "];"
base.Execute requete
base.Close
Set base = Nothing
Application.RefreshDatabaseWindow
DoCmd.Close acForm, "fParcourir"
DoCmd.OpenForm "fParcourir"
End If
End Sub