Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Supprimer un enregistrement précis dans une table
Nous l'avons déjà constaté, le
code VBA Access est capable de toutes les prouesses. Ici, nous allons l'exploiter pour voir comment
supprimer un enregistrement précis de la
base de données . Les motivations sont nombreuses. Il peut s'agir d'un client à radier ou d'un article obsolète à supprimer par exemple. Et dans le cas d'une
facturation aussi, lorsqu'une table temporaire est utilisée pour mémoriser les articles achetés, cette dernière doit être vidée à validation pour permettre d'autres facturations dans l'enchaînement.
Dans l'exemple illustré par la capture, l'utilisateur choisit une immatriculation par le biais d'une liste déroulante. L'objectif est de supprimer un véhicule du parc automobile lorsqu'il a été vendu. Les informations correspondantes sont rapatriées dans les champs du formulaire. C'est ainsi et à titre de confirmation que les données détaillées sont livrées à l'utilisateur avant d'entamer l'action irréversible. Dès lors, celui-ci clique sur le
bouton Confirmer la suppression et l'enregistrement précisément défini est aussitôt éradiqué de la table source.
Base de données Access à télécharger
Pour la mise en place de cette solution, nous proposons de
télécharger une base de données offrant un
formulaire permettant déjà de désigner une référence et de faire réagir ses champs.
Télécharger le fichier compressé supprimer-vba-access.rar en cliquant sur ce lien ,
Le décompresser dans le dossier de votre choix,
Double cliquer sur le fichier résultant pour l'ouvrir dans Access ,
Cliquer sur le bouton Activer le contenu du bandeau de sécurité pour libérer les ressources,
Dans le volet de navigation à gauche, double cliquer sur le formulaire Supprimer_vehicule ,
Déployer la liste déroulante et choisir une immatriculation,
Comme vous pouvez le voir, tous les renseignements concernant le véhicule désigné sont effectivement rapatriés dans les
champs du formulaire . Si vous cliquez sur le
bouton Annuler , le
formulaire est automatiquement fermé grâce à un léger
code VBA Access . Mais à ce stade fort heureusement, si vous cliquez sur le
bouton Confirmer la suppression , aucune action n'est encore entreprise.
Interface de suppression
Ces différents
objets du formulaire sont d'ores et déjà articulés par une
requête , une
fonction Access bien spécifique utilisée comme
source de contrôle des champs et une
action de macro . A titre de révision, nous proposons de découvrir l'articulation construite.
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 la liste déroulante pour la sélectionner,
Dès lors, activer l'onglet Données de sa feuille de propriétés ,
Vous constatez que le
contenu de la liste déroulante est rempli avec la
requête r_immat qui est l'unique requête de cette petite base de données. Au passage, cette liste déroulante se nomme
Immat .
Si vous ouvrez cette requête en mode Création, vous remarquez qu'elle se contente de charger toutes les immatriculations dans l'ordre alphabétique croissant.
C'est donc de cette manière que le contenu de la liste déroulante du formulaire peut évoluer dynamiquement au gré des ajouts ou suppressions de véhicules dans la table source, soit la
table Parc .
Fermer la requête et revenir sur le formulaire en mode création,
Puis, cliquer sur la première zone de texte pour la sélectionner,
En consultant l'entête de sa feuille de propriétés, vous notez qu'elle est nommée
laMarque . Mais c'est surtout sa
propriété Source contrôle qui nous intéresse. Vous la trouverez aussi dans l'
onglet Données de la
feuille de propriétés .
=RechDom("[Marque]"; "Parc"; "[immatriculation]=immat")
L'information sur la marque issue de la
table Parc et fonction de l'immatriculation choisie avec la liste déroulante est rapatriée dans cette zone de saisie. La syntaxe est similaire pour les deux autres zones de texte. C'est simplement le nom du champ qui est adapté en premier paramètre pour ramener la donnée correspondante.
Pour finir les présentations, cliquer de nouveau sur la liste déroulante pour la sélectionner,
Dès lors, activer l'onglet Evénement de sa feuille de propriétés ,
Sélectionner la ligne de son événement Sur changement ,
Puis, cliquer sur le petit bouton en bout de cette ligne pour basculer dans l'éditeur de macro ,
Comme vous pouvez le voir, deux actions y sont entreprises.
La première (AfficherTousEnreg) permet d'actualiser le contenu des zones de texte au changement de valeur dans la liste déroulante. La seconde (DéfinirPropriété) permet de réinitialiser le message dans l'étiquette qui est située au-dessus des boutons sur le formulaire.
Procédure VBA de suppression
Puisque les présentations sont faites, il est temps de mettre les mains dans le
code VBA . Premièrement, nous devons créer la procédure attachée au
bouton de suppression du
formulaire .
Dans le ruban Conception de macro , cliquer sur le bouton Fermer ,
Sur le formulaire en conception, cliquer sur le bouton Confirmer la suppression ,
Activer l'onglet Evénement de sa feuille de propriétés ,
Dès lors, cliquer sur le petit bouton à droite de son événement Au clic ,
Dans la boîte de dialogue, choisir le générateur de code et valider par le bouton Ok,
Nous basculons ainsi dans l'
éditeur de code VBA Access , entre les bornes de la
procédure événementielle Supprimer_Click . Son code se déclenchera
au clic sur ce bouton . Rappelons-le, il doit permettre de
supprimer l'intégralité de l'enregistrement attaché à l'immatriculation choisie par l'utilisateur avec la liste déroulante. D'ailleurs, la méthode que nous allons présenter permet de manipuler les enregistrements de table de toutes les sortes, qu'il s'agisse de suppression, de mise à jour ou encore d'insertion.
La variable de base de données
Pour piloter les
enregistrements de tables , nous avons maintenant besoin de déclarer une
variable de base de données . C'est elle qui va permettre d'y exécuter la
requête de suppression .
Dans les bornes de la procédure événementielle , ajouter les deux déclarations suivantes :
Dim base As Database: Dim requete As String
Nous déclarons la
variable base comme un
objet de type Database , soit de
base de données . Elle va donc proposer une
méthode notamment pour exécuter la
requête suppression à construire. Et précisément pour cela, nous déclarons une
variable nommée
requete de
type texte (As String) pour mémoriser la
syntaxe SQL de cette
requête .
Contrôler le choix dans la liste déroulante
Maintenant et avant de penser Ã
exécuter la requête , nous devons tout d'abord vérifier qu'un
choix a bien été émis par le biais de la
liste déroulante . En l'absence d'immatriculation explicitement désignée,
aucune requête suppression ne doit être enclenchée. En d'autres termes le traitement doit être avorté. Et pour cela, la suite des opérations doit être chapotée par une
instruction conditionnelle .
A la suite du code de la procédure, ajouter l'instruction conditionnelle suivante :
If (Immat.Value <> "") Then
Else
msg.Caption = "Vous devez sélectionner une immatriculation à supprimer."
End If
Très simplement, nous vérifions que l'affichage de la liste déroulante n'est pas vide (Immat.Value <> ""), donc qu'une immatriculation a bien été désignée. Si ce critère est vérifié, nous prévoyons la branche pour enclencher le processus de suppression. Elle est vide pour l'instant. Le cas échéant (else), nous affichons un message explicite à destination de l'opérateur dans l'étiquette du formulaire, juste au-dessus des boutons.
Supprimer l'enregistrement sélectionné
Désormais, lorsque le
critère de l'
instruction conditionnelle est vérifié, nous devons engager le
processus de suppression de l'enregistrement correspondant à la référence choisie dans la liste déroulante. Pour cela, nous devons exploiter notre
objet de base de données afin de pointer sur le fichier avec son
chemin d'accès complet . Puis, nous devons de nouveau l'exploiter pour
exécuter la requête SQL de suppression sur cette
base de données .
Dans la branche du If, ajouter les instructions VBA suivantes :
Set base = Application.CurrentDb
requete = "DELETE FROM Parc WHERE immatriculation='" & Immat.Value & "'"
base.Execute requete
Grâce à la
méthode CurrentDb de l'
objet Application , nous initialisons l'
objet base sur la
base de données en cours . Il a donc hérité des
propriétés et
méthodes pour piloter les éléments de cette base. Ensuite, dans la
variable requete , nous construisons la
syntaxe SQL classique d'une requête suppression. La
clause WHERE est fondamentale. C'est elle qui permet de ne pas supprimer tous les enregistrements de la
table Parc mais seulement celui correspondant à l'immatriculation choisie par le biais de la liste déroulante (immatriculation='" & Immat.Value & "'"). Il faut bien veiller à respecter l'alternance de simples et de doubles côtes car le champ de l'immatriculation est un
champ de type texte . Dès lors, nous n'avons plus qu'à exploiter la
méthode Execute sur l'
objet base pour déclencher l'exécution de cette
requête de suppression .
Libérer les ressources
Nous n'en avons pas encore tout à fait terminé. Dès lors que des
variables objets sont utilisées, elles doivent être fermées et détruites pour libérer les ressources et la mémoire. C'est donc ce que nous entreprenons de faire de ce pas.
Toujours dans la branche du If, ajouter les instructions VBA suivantes :
base.Close
Set base = Nothing
Nous fermons l'instance de la base ouverte avec la
méthode Close et nous détruisons l'objet en le réinitialisant Ã
Nothing .
Réinitialiser le formulaire après suppression
Pour parfaire la solution et permettre à l'opérateur d'engager plusieurs suppressions de véhicules dans l'enchaînement, nous devons notamment
recharger la liste déroulante pour qu'elle ne propose plus l'immatriculation du véhicule qui vient d'être supprimé.
Toujours dans la branche du If, ajouter les dernières instructions VBA suivantes :
msg.Caption = "Le véhicule " & Immat.Value & " a été retiré de la table."
Immat.Requery
Immat.Value = ""
Nous exploitons tout d'abord la
propriété Caption de l'étiquette intitulée
msg pour actualiser le message sur le formulaire et informer l'opérateur que la suppression du véhicule demandé s'est déroulée avec succès. Ensuite, nous utilisons la
méthode Requery de la liste déroulante. De cette manière, elle questionne de nouveau sa
requête source qui, ne trouvant plus la référence du véhicule supprimé, l'élimine de la liste. Et nous vidons la précédente immatriculation sélectionnée de l'affichage de cette même liste déroulante.
Supprimer un enregistrement choisi
Le code étant achevé, il est temps de le tester pour vérifier que la suppression chirurgicale a bien lieu.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
Puis, l'exécuter avec la touche F5 du clavier ,
Choisir une immatriculation avec la liste déroulante, par exemple la deuxième : 2069JNY,
Il s'agit d'une Peugeot 308 de 110 Chevaux.
Cliquer sur le bouton Confirmer la suppression ,
Comme vous pouvez le voir, le formulaire se vide. Le message de confirmation apparaît aussitôt dans l'étiquette au-dessus des boutons.
Et si vous déployez de nouveau la liste déroulante, vous constatez l'absence de l'immatriculation précédemment sélectionnée, confirmant vraisemblablement que le véhicule concerné a bien été supprimé depuis la table source.
Remarque : Les trois zones de texte sont effectivement vidées bien que nous ne soyons pas intervenus dessus par le
code VBA . Ce phénomène s'explique par la liaison opérée avec la liste déroulante par le biais de la
fonction RechDom . Comme cette liste ne propose plus de valeur après suppression, la
fonction RechDom ne trouve plus de correspondance et donc conserve la zone vide. De même, sachez que pour une
suppression totale des enregistrements de la table, il suffit d'exploiter exactement la même technique mais en enlevant la
clause WHERE de la
requête suppression .
Pour une double vérification, vous pouvez ouvrir la
table Parc en
mode feuille de données . Et vous constaterez que la référence supprimée brille par son absence.
Le code VBA Access complet que nous avons construit pour réaliser ce formulaire de suppression est le suivant :
Private Sub Supprimer_Click()
Dim base As Database: Dim requete As String
If (Immat.Value <> "") Then
Set base = Application.CurrentDb
requete = "DELETE FROM Parc WHERE immatriculation='" & Immat.Value & "'"
base.Execute requete
base.Close
Set base = Nothing
msg.Caption = "Le véhicule " & Immat.Value & " a été retiré de la table."
Immat.Requery
Immat.Value = ""
Else
msg.Caption = "Vous devez sélectionner une immatriculation à supprimer."
End If
End Sub