formateur informatique

Supprimer un enregistrement précis en VBA Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Supprimer un enregistrement précis 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 :


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.

Formulaire Access de suppression au choix d-une référence dans une liste déroulante

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,
Requête sans doublons comme source de données de la liste déroulante du formulaire Access

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.

Requête Access, source de données avec tri 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.

Macro Access pour remplir zone de texte du formulaire au changement de valeur dans la liste déroulante

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.

Supprimer un enregistrement précis depuis un formulaire Access grâce au code VBA

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


 
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