Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Supprimer les relations entre les tables
Avec cette nouvelle 
astuce VBA Access, nous allons apprendre à automatiser la 
suppression des relations entre les tables, par le 
code VBA. Ce mécanisme est intéressant à plus d'un titre. Le plus flagrant concerne celui de la 
suppression des tables. 
Access n'autorise pas la suppression d'une table tant qu'elle est encore liée à une autre table.
Base de données Access à télécharger
Pour développer ce 
code VBA au demeurant trivial, nous suggérons d'appuyer les travaux sur une 
base de données offrant 
plusieurs tables reliées entre elles.
Comme vous le constatez, cette petite base de données est constituée d'un formulaire et de cinq tables. Quatre d'entre elles sont impliquées dans des relations.
- En haut de la fenêtre Access, cliquer sur l'onglet Outils de base de données,
- Dans ce ruban, cliquer sur le bouton Relations,

Vous voyez ainsi l'architecture de cette petite base qui est utilisée à l'origine, pour facturer les clients et gérer les stocks. Ce sont ces 
liaisons qui interviennent entre chaque table parente et chaque table enfant, que nous devons 
supprimer automatiquement par le code 
VBA Access. Il s'agit d'un processus d'autant plus intéressant à mettre en place sur des bases de données volumineuses aux architectures complexes.
Le formulaire
Très simplement, c'est au clic sur un 
bouton du formulaire que nous devons déclencher ce 
code VBA.
- Dans le ruban Conception de relations, cliquer sur le bouton Fermer,
- Dans le volet de navigation, double cliquer sur le formulaire fRelations pour l'afficher,
Comme vous pouvez le voir, il est seulement doté d'un bouton.

C'est lui qui doit déclencher le 
code VBA Access permettant de supprimer toutes les relations entrant en jeu entre toutes les tables.
- 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 pour le sélectionner,
- Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
- Cliquer ensuite sur le petit bouton associé à son événement Au clic,
- Dans la boîte de dialogue qui suit, choisir le Générateur de code et valider par Ok,
C'est ainsi que nous basculons dans l'
éditeur VBA Access, entre les bornes de la 
procédure événementielle supRel_Click. 
supRel est le 
nom du bouton. 
Click est son 
événement déclencheur.
Les variables
Nous devons piloter les 
relations des 
tables dans cette 
base de données. Nous avons donc besoin de 
trois variables pour représenter ces objets respectifs. Et il faut bien comprendre que pour accéder au coeur de cette base, une référence précise est nécessaire. Mais nous avions anticipé, elle existe déjà. Nous proposons de le constater.
- Au-dessus de la feuille de code, cliquer sur le menu Outils,
- Dans les propositions, choisir l'option Référence,

La librairie qui nous intéresse se nomme 
Microsoft Office 16.0 Access database engine Object Library. Et comme vous pouvez le voir, sa case est déjà cochée.
- Cliquer sur le bouton Ok de la boîte de dialogue pour revenir sur la feuille de code,
- Dans la procédure supRel_Click, ajouter les déclarations et l'affectation suivantes :
...
Dim base As Database: Dim rel As Relation
Dim table As TableDef
Set base = CurrentDb()
...
Nous déclarons un 
objet de type Database (base) pour piloter la 
base de données en cours. Nous en déclarons un autre (table) de 
type TableDef pour représenter une table au sens large. Nous le verrons, nous l'utiliserons pour 
parcourir toutes les tables de la base de données. Puis, nous déclarons un dernier 
objet de type Relation pour représenter une relation entre tables au sens large. Là aussi, nous l'utiliserons pour 
parcourir toutes les relations qui impliquent chaque table. Enfin, nous exploitons la 
fonction VBA Access CurrentDb() pour initialiser (Set) l'
objet base sur la 
base de données en cours. C'est ainsi qu'il hérite des propriétés et méthodes pour piloter cette dernière.
Parcourir toutes les tables
Pour analyser 
chaque table de la base de données, nous devons engager une 
boucle For Each sur la 
collection des tables, avec notre 
objet table.
- A la suite du code, créer la boucle For Each suivante :
...
For Each table In base.TableDefs
If Left(table.Name, 4) <> "MSys" Then
End If
Next table
...
La 
propriété héritée TableDefs par l'
objet base, représente la 
collection des tables dans cette base de données. Dans cette 
boucle For Each, nous engageons l'
objet table dans (In) cette collection, pour les analyser toutes. A chaque passage néanmoins, nous nous assurons qu'il ne s'agit pas d'une 
table système (MSys). Pour cela, nous testons les quatre premiers caractères du nom (Name) de la table en cours grâce à la 
fonction VBA Left. Si le test échoue (<> "MSys"), nous en concluons (Then) qu'il s'agit d'une table utilisateur et nous poursuivons le traitement.
Les relations de chaque table
Nous devons maintenant analyser 
toutes les relations en vigueur dans cette base de données. Dès que l'une d'entre elles implique la 
table en cours, soit par une 
clé primaire, soit par une 
clé externe, nous devons la supprimer.
- Dans l'instruction conditionnelle, créer la nouvelle boucle For Each suivante :
...
For Each rel In base.Relations
If rel.Table = table.Name Or rel.ForeignTable = table.Name Then
End If
Next rel
...
Toujours grâce à une 
boucle For Each donc, nous engageons cette fois l'
objet rel dans (In) la 
collection des relations (Relations) de la 
base de données en cours (base). Si cette relation concerne la table en cours d'analyse (table.Name) par la première boucle, sur une 
clé primaire (rel.Table) ou encore (Or) sur une 
clé étrangère (rel.ForeignTable), alors (Then) nous poursuivons le traitement puisqu'il est question de la supprimer.
Supprimer les relations
Si le double test est concluant pour la table en cours d'analyse, nous devons supprimer la relation concernée. Et pour cela, la 
collection des relations héritée par l'
objet base propose une 
méthode dédiée.
- Dans cette nouvelle instruction conditionnelle, ajouter la ligne VBA suivante :
...
base.Relations.Delete (rel.Name)
...
C'est donc la 
méthode Delete de cette collection, avec le nom de la relation en paramètre, qui permet de supprimer cette dernière. Comme elles sont toutes passées en revue grâce à cette double boucle, elles devraient toutes être supprimées.
Remarque : Comme la 
propriété Name renseigne sur le nom de la relation, il est possible de prévoir un traitement automatisé pour supprimer les relations, tout en en préservant certaines, identifiées par des noms à ne pas toucher.
Comme vous le savez, à l'issue du traitement, il convient de détruire les objets qui ne sont plus utilisés.
- Après la double boucle, ajouter les instructions VBA suivantes :
...
Set rel = Nothing
Set table = Nothing
base.Close
Set base = Nothing
...
Tester la suppression des relations
Il est temps de tester ce code VBA. 
- Enregistrer les modifications (CTRL + S) et basculer sur le formulaire Access (ALT + Tab),
- Exécuter ce dernier, par exemple avec la touche F5 du clavier,
- Puis, cliquer sur son unique bouton,
- En haut de la fenêtre Access, cliquer sur l'onglet Outils de base de données,
- Dans la section Relations du ruban, cliquer sur le bouton Relations,

Comme vous pouvez le voir, les relations qui liaient autrefois ces tables, ont toutes disparu en un éclair et ce, avec un petit code VBA Access fort simple.