formateur informatique

Connecter une base Access à Excel par le code VBA

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Connecter une base Access à Excel par le code VBA
Livres à télécharger


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

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Sujets et formations similaires :


Connexion à une base de données Access en VBA Excel

Dans les formations précédentes nous avions conçu une application Excel en deux temps. La première permettait de remplir des listes déroulantes reliées entre elles. La seconde permettait d'extraire les informations de la base de données en fonction des choix recoupés depuis ces listes déroulantes. Dans les deux cas, les informations étaient issues d'une source de données disposée dans l'une des feuilles du classeur.

Formulaire Excel des listes déroulantes liées et remplies des données de base Access



Pour prouver à quel point il est important d'exploiter les logiciels dans leur domaine, nous proposons ici d'accéder à une source externe, avec un code VBA largement optimisé. Cette source est désormais une base de données Access à laquelle le code VBA doit accéder pour remplir et relier les listes déroulantes. Dans un second volet, nous verrons comment extraire ces informations en consolidant ces critères sous forme de requête SQL.

Sources et présentation du concept
Grâce aux objets de base de données et aux requêtes SQL, la manipulation des informations est extrêmement efficace et puissante. Les librairies nécessaires, si elles sont référencées dans le projet VBA, permettent de prendre le contrôle d'objets et d'applications externes. C'est ce que nous proposons de prouver en accédant aux données d'une base Access par le code VBA Excel, pour les restituer sur une feuille du classeur. Nous proposons de débuter à partir d'une source et d'un classeur existants. Comme vous le remarquez, la décompression conduit à deux fichiers : Le classeur Excel connexion-bdd-access.xlsm et la base de données Access sorties.accdb.
  • Double cliquer sur le fichier connexion-bdd-access.xlsm pour l'ouvrir dans Excel,
  • Puis, cliquer sur le bouton Activer la modification du bandeau jaune de sécurité,
Le structure est déjà en place. Trois listes déroulantes, sous forme d'objets ActiveX ComboBox sont proposées. Une zone d'extraction est prévue pour recevoir les données correspondant aux critères choisis par l'internaute. Mais si vous cliquez sur l'une des listes déroulantes, rien ne se produit encore. Nous devons en effet bâtir le code capable de relier les listes déroulantes entre elles et d'extraire les informations depuis la base de données Access en fonction de ces choix recoupés.
  • Réaliser le raccourci clavier ALT + F11,
Nous basculons ainsi dans l'éditeur de code Visual Basic Excel. Nous aurions aussi pu cliquer sur le bouton Visual Basic du ruban Développeur. Ce ruban est nécessaire pour la suite du développement. S'il n'est pas disponible dans votre environnement, la formation pour débuter la programmation en VBA Excel rappelle comment l'afficher. Pour piloter les objets de connexion aux bases de données Access, une référence est nécessaire.
  • Dans l'éditeur de code VBA Excel, cliquer sur le menu Outils en haut de la fenêtre,
  • Dans la liste, choisir Références,
Référence à une librairie VBA Excel pour piloter bases de données externes Access

Vous devez y noter la présence d'une référence cochée : Microsoft Office 16.0 Access database engine. Il s'agit tout simplement de la librairie qui livre tous les objets nécessaires pour piloter le moteur de base de données Access. Elle permet ainsi d'accéder aux informations de bases de données par le code VBA. Si elle n'est pas présente, vous devez l'ajouter. Le numéro 16.0 dépend de la version d'Office installée sur votre système d'exploitation. Cette référence est déjà présente car nous l'avons ajoutée au fichier source. A l'avenir, lorsque vous souhaiterez accéder aux données Access, vous devrez l'ajouter.
  • Cliquer sur le bouton Ok pour fermer la boîte de dialogue,
  • Dans le dossier de décompression, double cliquer sur le fichier sorties.accdb pour l'ouvrir dans Access,
  • Cliquer alors sur le bouton Activer le contenu du bandeau jaune de sécurité,
  • Dans le volet des objets Access sur la gauche, double cliquer sur la table societes pour afficher son contenu,
Il s'agit de la table sur laquelle nous allons devoir exécuter les requêtes recoupant les choix effectués par l'utilisateur, par le biais des listes déroulantes situées sur la feuille du classeur Excel. Ces requêtes seront pilotées par le code VBA Excel grâce à la librairie dont nous venons de constater la référence.

Données de base Access à importer sur feuille Excel selon requêtes SQL gérées en VBA

Comme vous le constatez, cette source recense des idées de sorties par activité, département et ville notamment. Chacun des champs correspondants est préfixé du nom de la table, comme societes_departement par exemple. Nous devrons exploiter ces noms précisément par le code, afin d'accéder à l'information que chaque champ contient pour l'extraire.
  • Fermer la table, puis fermer la base de données Access,
Remarque : Il n'est pas nécessaire qu'Access soit installé sur votre système d'exploitation pour réussir la liaison. Les pilotes suffisent. Il s'agit des librairies nécessairement présentes. D'ailleurs Word les exploite pour le publipostage, afin d'établir la liaison avec les bases de données.



Listes déroulantes en cascade
Dans la première liste déroulante, nous devons charger tous les départements de la base de données Access, sans doublons et triés croissant. Dans la deuxième liste, nous devons charger toutes les activités (societes_activite) correspondant au département sélectionné en amont, sans doublons et triées dans l'ordre croissant. Dans la dernière liste enfin, nous devons charger toutes les villes (societes_ville) correspondant au département et à l'activité, sans doublons et triées dans l'ordre croissant. Grâce aux requêtes SQL cette fois et notamment à leurs clause WHERE, nous allons voir à quel point il est simple d'extraire de l'information multicritère, tout en classant les données.
  • Revenir sur le classeur Excel et basculer dans l'éditeur de code VBA (ALT + F11),
Dans l'arborescence de l'explorateur de projet, sur la gauche de la fenêtre, vous notez la présence d'un module de code nommé Module1. Ce module est prévu pour accueillir des procédures de code externes réalisant des traitements communs.
  • Créer les deux procédures nettoyer et extraire, comme suit :
Sub nettoyer()

End Sub

Sub extraire()

End Sub


Dans la procédure nettoyer nous bâtirons un code VBA permettant de purger la zone d'extraction de la feuille Excel des anciennes valeurs. Dans la procédure extraire, nous construirons le code VBA capable d'interroger la base de données Access par requêtes SQL. Ces requêtes devront consolider les conditions qui seront placées dans la zone de critères de la feuille, entre H5 et J5. Nous reviendrons sur ces modules de code en temps voulu.

A l'ouverture du classeur, les données doivent être mises à jour par connexion à la base, afin de charger la première liste déroulante des départements uniques et triés dans l'ordre croissant.
  • Dans l'explorateur de projet, double cliquer sur l'élément ThisWorkbook,
  • Au centre de l'écran, au-dessus de sa feuille de code, dérouler la liste de gauche,
  • Puis, cliquer sur Workbook,
Nous créons ainsi la procédure événementielle Workbook_Open. Comme l'enseigne la formation sur la facturation automatisée avec interface graphique, c'est ici que doit être écrit le code VBA à déclencher à l'ouverture. Comme toujours, nous devons commencer par déclarer les variables nécessaires au traitement.
  • Entre les bornes de la procédure événementielle, ajouter les déclarations suivantes :
Dim chemin_bd As String
Dim enr As Recordset: Dim base As Database


Pour accéder à la base de données Access, nous devons la désigner par son chemin d'accès complet. La variable de type String chemin_bd doit reconstruire et mémoriser ce chemin. Et puis, comme nous l'avons appris en VBA Access, nous avons besoin de deux objets permettant de manipuler les données de la base. La variable base déclarée comme un objet Database, grâce à la référence ajoutée au projet VBA, doit désigner la base de données à piloter, par son chemin d'accès. La variable enr quant à elle est déclarée comme un objet de type Recordset. Elle doit permettre de manipuler les enregistrements retournés par les requêtes, afin d'extraire les données pour remplir les listes déroulantes notamment.
  • A la suite du code, ajouter les instructions suivantes :
chemin_bd = ThisWorkbook.Path & 'sorties.accdb'
nettoyer
MsgBox chemin_bd


La propriété Path de l'objet ThisWorkbook renvoie le chemin d'accès complet au classeur Excel en cours. Comme la base de données Access est placée dans le même dossier, nous concaténons ce chemin (&) avec le nomde la base Access. Nous stockons donc bien le chemin d'accès complet dans la variable chemin_bd. Ensuite, nous appelons la procédure nettoyer. Comme elle est vide de code pour l'instant, elle ne produit aucune incidence. Puis, à titre de vérification, nous exploitons la fonction VBA MsgBox pour afficher le chemin reconstruit à l'écran.
  • Enregistrer les modifications (CTRL + S),
  • Enfoncer la touche F5 du clavier pour lancer l'exécution du code VBA,
Comme l'illustre la capture ci-dessous, la fonction MsgBox confirme la bonne réception de l'adresse permettant d'accéder à la base de données.

Reconstruire chemin accès complet à une base de données externe par le code VBA Excel

Avant d'établir la connexion à la source de données, nous devons purger les listes déroulantes et cellules de critères, de leur potentiel précédent contenu. L'utilisateur pourra à sa guise réaliser plusieurs extractions d'affilée. Entre chacune d'elles, le contenu doit être réinitialisé.
  • Cliquer sur le bouton Ok du MsgBox pour revenir dans l'éditeur VBA,
  • Passer le MsgBox en commentaire en préfixant sa ligne d'une apostrophe ('),
  • Puis, à la suite du code, ajouter les affectations suivantes :
Sheets('formulaire').liste_dep.Clear: Sheets('formulaire').liste_act.Clear: Sheets('formulaire').liste_villes.Clear
Sheets('formulaire').liste_dep.Value = '': Sheets('formulaire').liste_act.Value = '': Sheets('formulaire').liste_villes.Value = ''
Range('H5').Value = '': Range('I5').Value = '': Range('J5').Value = ''


La méthode Clear d'un objet Combobox (liste déroulante) permet de purger son contenu. Comme nous codons en dehors de la feuille, pour désigner chacune d'elles, nous devons préciser leur appartenance. C'est l'objet Sheets avec le nom de la feuille en paramètre qui permet d'y accéder. Ensuite, leur propriété Value permet de supprimer l'information affichée par défaut et potentiellement mémorisée. Puis, nous désignons chacune des cellules de la zone de critères avec l'objet Range pour supprimer leur contenu, grâce à leur propriété Value là aussi.

Il convient désormais d'établir la connexion à la base de données et d'accéder aux enregistrements afin d'extraire les départements.
  • Pour ce faire, ajouter les deux instructions suivantes :
Set base = DBEngine.OpenDatabase(chemin_bd)
Set enr = base.OpenRecordset('SELECT DISTINCT societes_departement FROM societes ORDER BY societes_departement ASC', dbOpenDynaset)


Comme il s'agit d'objets, nous devons exploiter la directive Set pour les initialiser et les affecter. La méthode OpenDatabase de l'objet DBEngine permet de pointer sur la base de données dont le chemin d'accès complet lui est passé en paramètre. Dès lors, l'objet base a instancié la classe permettant de piloter les objets de base de données. De fait, nous pouvons exploiter ses propriétés et méthodes. C'est ce que nous réalisons dans la foulée pour initialiser l'objet enr, grâce à la méthode OpenRecordset de l'objet base. Cette méthode permet d'accéder aux enregistrements de la base de données, selon la syntaxe de la requête SQL qui lui est passée en paramètre. La formation Access sur les requêtes présente cette syntaxe.

Le mot clé SELECT permet d'initialiser une requête sélection pour récupérer des données. Seul le champ societes_departement est désigné puisqu'il s'agit de remplir la liste déroulante des départements. La clause DISTINCT en préfixe permet de les sélectionner de façon unique, purgés des doublons. Selon la syntaxe SQL, nous désignons ensuite à partir de quelle table nous prélevons ce champ (FROM societes). Puis, nous ordonnons un tri croissant sur le résultat de l'extraction (ORDER BY societes_departement ASC). En une seule requête, nous réalisons donc l'extraction des données, la suppression des doublons et le tri. Dans la formation Visual Basic Excel précédente, nous avions été obligés de construire un code VBA pour chacune de ces actions. Enfin, l'attribut dbOpenDynaset en second paramètre de la méthode indique que nous accédons à ces données pour les manipuler.

Il s'agit désormais de récupérer les informations des enregistrements ainsi récoltés, en les parcourant un à un à l'aide d'une boucle de traitement.
  • Pour ce faire, à la suite du code, ajouter les instructions suivantes :
Sheets('formulaire').liste_dep.AddItem 'Sélectionnez un département'
enr.MoveFirst
Do
Sheets('formulaire').liste_dep.AddItem enr.Fields('societes_departement').Value
enr.MoveNext
Loop Until enr.EOF = True

enr.Close
base.Close

Set enr = Nothing
Set base = Nothing


Par la méthode AddItem de l'objet ComboBox, nous commençons par ajouter l'information par défaut, à proposer en haut de la liste déroulante. Puis, nous plaçons le pointeur de lecture sur le premier enregistrement de la requête, grâce à la méthode MoveFirst de l'objet Recordset. Ensuite, nous initialisons une boucle (Do) capable de parcourir les enregistrements jusqu'au dernier grâce à la propriété EOF de l'objet Recordset (Loop Until enr.EOF = True). A chaque passage dans la boucle, nous ajoutons l'information du champ (Propriété Fields de l'objet Recordset) pour l'enregistrement en cours (enr.Fields('societes_departement').Value), à la suite dans la liste déroulante (AddItem). Puis, nous n'oublions pas de placer le pointeur de lecture sur l'enregistrement suivant grâce à la méthode MoveNext de l'objet Recordset.

Toute connexion à une base de données doit être fermée pour libérer les ressources. C'est pourquoi, après la boucle, nous exploitons la méthode Close des objets Recordset et Database. Puis, nous détruisons les deux objets de base de données en les réaffectant à Nothing. Nous libérons ainsi la mémoire.

Un dernier ajustement est nécessaire pour le confort de l'utilisateur. Il consiste à sélectionner la liste déroulante et à activer sa première proposition.
  • Pour ce faire, à la suite du code, ajouter les deux instructions suivantes :
Sheets('formulaire').Select
Sheets('formulaire').liste_dep.ListIndex = 0


La propriété ListIndex d'un contrôle liste déroulante (Combobox), permet de choisir l'élément à sélectionner par défaut, en fonction de sa position.
  • Enregistrer les modifications et enfoncer la touche F5 pour exécuter la procédure,
  • Puis, basculer sur la feuille du classeur,
  • Cliquer sur la flèche de la première liste déroulante pour la déployer,
Remplir liste déroulante Excel avec données de base Access par code VBA

Comme vous le constatez, la connexion à la base de données a fonctionné avec succès. Les éléments ont été récupérés selon les directives de la syntaxe de la requête SQL, exécutée sur la table grâce à la méthode OpenRecordset de l'objet enr. Tous les départements sont chargés sans doublons et dans l'ordre alphabétique croissant.

Avant de reproduire le même processus pour remplir les listes déroulantes suivantes, selon les choix réalisés par l'internaute dans les listes en amont, nous proposons d'écrire le code de la procédure nettoyer.
  • Revenir dans l'éditeur de code VBA Excel,
  • Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Module1,
  • Dans les bornes de la procédure nettoyer, ajouter les instructions suivantes :
Dim ligne As Integer: Dim colonne As Integer

ligne = 9
While (Cells(ligne, 2).Value <> '')
For colonne = 2 To 6
Cells(ligne, colonne).Value = ''
Next colonne
ligne = ligne + 1
Wend


Comme nous devons parcourir les lignes de la zone d'extraction sur les colonnes allant de B à F, à la recherche de cellules à purger, nous commençons par déclarer les deux variables permettant cette navigation. La zone d'extraction débute à partir de la ligne 9. Donc nous initialisons la variable sur cet indice. Puis nous débutons une boucle While afin que le traitement se poursuive tant qu'une cellule non vide est détectée en colonne B (Cells(ligne, 2).Value <> ''). A chaque passage dans la boucle, nous passons en revue les colonnes B à F (2 à 6), grâce à une boucle For imbriquée (For colonne = 2 To 6), pour la ligne en cours afin de les purger (Cells(ligne, colonne).Value = ''). Avant de borner la boucle While, nous n'oublions pas d'incrémenter sa variable pour placer le pointeur sur la ligne suivante. Dès qu'une cellule vide est détectée en colonne 2, le traitement itératif se stoppe puisque le critère de la boucle While n'est plus vérifié.

Désormais, au changement de valeur détecté dans la liste déroulante des départements, les deux autres listes doivent être remplies des activités et des villes correspondantes. Nous devons de nouveau accéder aux enregistrements de la base de données. Cette fois, pour effectuer la correspondance sur les départements, nous devons ajouter une clause Where dans la syntaxe de la requête SQL.
  • Basculer sur la feuille du classeur Excel,
  • Cliquer sur l'onglet Développeur en haut de la fenêtre pour activer son ruban,
  • Dans la section Contrôles, cliquer sur le bouton Mode création,
  • Double cliquer alors sur la première liste déroulante, celle des départements,
Nous basculons automatiquement dans l'éditeur de code et avons ainsi créé la procédure événementielle, capable de déclencher un code VBA au changement de valeur détecté.

Private Sub liste_dep_Change()

End Sub


Comme ce code est attaché à la feuille formulaire, nous n'aurons pas besoin de spécifier la feuille en préfixe pour désigner une liste déroulante à piloter. Les instructions doivent être déclenchées seulement si un département est bien sélectionné dans la liste, et non le choix par défaut. On Error Resume Next
If (liste_dep.Value <> 'Sélectionnez un département' And liste_dep.Value <> '') Then

End If


Nous veillons à ce que la valeur sélectionnée ne soit ni vide, ni le choix proposé par défaut. Si ces critères sont vérifiés, alors nous pouvons déclarer les variables et enclencher le code VBA.
  • Entre les bornes de l'instruction If, ajouter les déclarations et affectations suivantes :
Dim chemin_bd As String
Dim enr As Recordset: Dim base As Database

chemin_bd = ThisWorkbook.Path & 'sorties.accdb'
Range('H5').Value = liste_dep.Value: Range('I5').Value = '': Range('J5').Value = ''

liste_villes.Clear
liste_act.Clear


Comme précédemment, nous déclarons les variables permettant respectivement de stocker le chemin d'accès, de piloter les enregistrements et de désigner la base de données Access. Nous reconstruisons ce chemin par concaténation. Puis, nous inscrivons le choix de l'utilisateur dans la zone de critères, plus précisément en H5 (Range('H5').Value). Dans le même temps, nous vidons les potentiels précédents critères des cellules I5 et J5. En effet, un changement de département est synonyme de nouvelle recherche. De fait, nous vidons les deux autres listes déroulantes de leur potentiel précédent contenu, grâce à leur méthode Clear.

Il est temps d'établir la connexion à la base de données, dans un premier temps pour récupérer les enregistrements des villes.
  • A la suite du code, ajouter les deux initialisations et affectations suivantes :
Set base = DBEngine.OpenDatabase(chemin_bd)
Set enr = base.OpenRecordset('SELECT DISTINCT societes_ville FROM societes WHERE societes_departement='' & Range('H5').Value & '' ORDER BY societes_ville ASC', dbOpenDynaset)


Nous déclarons notre objet base de données (base), comme précédemment. Grâce à sa méthode OpenRecordset, nous initialisons l'objet enr. La requête SQL que nous lui passons en paramètre permet de préciser les enregistrements que nous souhaitons récupérer pour le champ societes_ville. La clause DISTINCT permet là encore de purger les résultats des doublons. La clause ORDER BY réalise un tri croissant comme précédemment. Mais notez la présence d'une clause WHERE cette fois :

societes_departement='' & Range('H5').Value & ''

C'est elle qui permet d'établir la correspondance avec le département choisi et donc inscrit en H5. Seules les villes inscrites dans ce département sont sélectionnées. Comme le critère en H5 est une information textuelle, sa valeur est encadrée de simples côtes avant et après les doubles côtes.

Selon le même procédé que celui utilisé dans la procédure de démarrage, nous devons récolter les informations extraites par la requête.
  • En conséquence, à la suite du code, ajouter les instructions suivantes :
liste_villes.AddItem 'Sélectionnez une ville'

enr.MoveFirst
Do
liste_villes.AddItem enr.Fields('societes_ville').Value
enr.MoveNext
Loop Until enr.EOF = True


Une boucle parcourt tous les enregistrements ainsi isolés et pour chacun d'eux, la propriété Fields de l'objet Recordset permet de récupérer l'information de champ (Ville), à charger dans la liste déroulante.

Nous ne devons pas fermer la connexion tout de suite. Nous devons d'abord récupérer les activités pour les charger dans la deuxième liste déroulante. Le processus est le même. Une clause WHERE est nécessaire dans la requête SQL pour faire la correspondance avec le département sélectionné en amont.
  • A la suite du code, toujours dans les bornes du If, ajouter les instructions suivantes :
Set enr = base.OpenRecordset('SELECT DISTINCT societes_activite FROM societes WHERE societes_departement='' & Range('H5').Value & '' ORDER BY societes_activite ASC', dbOpenDynaset)

liste_act.AddItem 'Sélectionnez une activité'

enr.MoveFirst
Do
liste_act.AddItem enr.Fields('societes_activite').Value
enr.MoveNext
Loop Until enr.EOF = True

enr.Close
base.Close

Set enr = Nothing
Set base = Nothing

liste_villes.ListIndex = 0
liste_act.ListIndex = 0
extraire




Nous réinitialisons l'objet Recordset pour lui affecter la requête sélection permettant de sélectionner les activités cette fois. Cette sélection se fait selon le département inscrit dans la zone de critère : WHERE societes_departement='' & Range('H5').Value & ''

Ensuite, nous inscrivons la valeur par défaut dans la liste et la remplissons de chacune des activités, grâce à une boucle parcourant chacun des enregistrements. Puis, comme dans la procédure de démarrage, nous fermons les connexions (Close) et vidons les objets (Nothing). Nous calons les deux listes sur leur premier élément. Enfin, nous appelons la procédure extraire. Cette dernière est vide pour l'instant et donc, sans incidence.

Dans la formation suivante, nous nous occuperons de l'extraction des données selon les choix réalisés dans les listes déroulantes. Nous implémenterons donc cette procédure dont l'appel est déjà fait.
  • Enregistrer les modifications et basculer sur la feuille Excel,
  • Dans le ruban Développeur, cliquer sur le bouton Mode création pour le désactiver,
  • Sélectionner un département avec la première liste déroulante,
Comme vous le remarquez, en même temps que le critère du département s'inscrit en cellule H5, les deux autres listes déroulantes se remplissent instantanément. C'est ce qu'illustre la capture ci-dessous. Seules les activités et les villes correspondant au département effectivement choisi, sont proposées.

Remplir listes déroulantes Excel en fonction autres listes avec données base Access par code VBA

Ainsi l'utilisateur pourra choisir de réaliser une extraction des idées de sorties sur le département et la ville recoupés ou sur l'ensemble des trois critères consolidés.

Nous devons désormais nous soucier du comportement des deux listes déroulantes restantes. Concernant la deuxième, celle des activités, au choix d'une valeur, la donnée doit être inscrite dans la zone de critères en I5. De même la liste des villes doit être remplie pour ne proposer que celles qui correspondent à la fois au département et à l'activité désignés.
  • Dans le ruban Développeur de la feuille Excel, cliquer sur le bouton Mode création,
  • Puis, double cliquer sur la deuxième liste déroulante, celle des activités,
Comme précédemment, nous sommes redirigés dans l'éditeur de code, entre les bornes de la procédure liste_act_change() :

Private Sub liste_act_Change()

End Sub


Nous venons donc de créer le gestionnaire d'événements capable de détecter le changement de valeur dans la liste déroulante des activités. Son code se déclenchera donc en conséquence.
  • Entre les bornes de la procédure, ajouter le code suivant :
On Error Resume Next

If (liste_act.Value <> 'Sélectionnez une activité' And liste_act.Value <> '') Then
Dim chemin_bd As String
Dim enr As Recordset: Dim base As Database

chemin_bd = ThisWorkbook.Path & 'sorties.accdb'
Range('I5').Value = liste_act.Value: Range('J5').Value = ''
liste_villes.Clear

Set base = DBEngine.OpenDatabase(chemin_bd)
Set enr = base.OpenRecordset('SELECT DISTINCT societes_ville FROM societes WHERE societes_departement='' & Range('H5').Value &'' AND societes_activite='' & Range('I5').Value & '' ORDER BY societes_ville ASC', dbOpenDynaset)

liste_villes.AddItem 'Sélectionnez une ville'

enr.MoveFirst
Do
liste_villes.AddItem enr.Fields('societes_ville').Value
enr.MoveNext
Loop Until enr.EOF = True

enr.Close
base.Close

Set enr = Nothing
Set base = Nothing

liste_villes.ListIndex = 0
extraire
End If


Le principe est le même mais en plus simple puisqu'une seule requête suffit. En revanche le critère dans la clause Where est doublé pour trouver les villes qui correspondent à la fois au département et à l'activité. Ce code n'est déclenché que si une valeur différente de la proposition par défaut et non vide, est bien sélectionnée dans cette deuxième liste de choix. Nous l'inscrivons bien dans la zone de critères en I5. Ainsi à l'avenir, la procédure extraction pourra consolider la requête finale pour procéder à l'extraction. Nous vidons en revanche le potentiel critère de la cellule J5, puisqu'un choix d'activité impose de réinitialiser les villes.
  • Enregistrer les modifications et basculer sur la feuille Excel,
  • Cliquer sur le bouton Mode création du ruban Développeur pour le désactiver,
  • Sélectionner un département à l'aide de la première liste déroulante,
  • Puis choisir une activité à l'aide de la deuxième liste déroulante,
Listes déroulantes Excel reliées entre elles et remplies des données Access par code VBA

Si vous déployez la troisième liste, celle des villes, vous constatez que le choix offert est restreint. Il est limité aux communes proposées pour le département et l'activité sélectionnés en amont. Le critère de l'activité vient bien s'ajouter en I5 comme nous l'avons codé.
  • Cliquer sur le bouton Mode création du ruban Développeur pour l'activer,
  • Double cliquer sur la liste déroulante des villes pour générer sa procédure évènementielle,
Son code est plus simple. Plus aucune autre liste n'est à remplir en cascade en fonction de ce dernier choix. En conséquence, aucune connexion à la base de données n'est nécessaire. Elle doit se contenter d'inscrire la commune sélectionnée, dans la zone de critères, précisément en J5.
  • Entre les bornes de la procédure liste_villes_Change, ajouter les instructions suivantes :
On Error Resume Next

If (liste_villes.Value <> 'Sélectionnez une ville' And liste_villes.Value <> '') Then
Range('J5').Value = liste_villes.Value
extraire
End If


Comme toujours nous commençons par vérifier qu'une donnée valide est bien sélectionnée. Nous inscrivons ce choix en J5 et appelons la procédure extraire, vide de code pour l'instant.
  • Enregistrer les modifications et basculer sur la feuille Excel,
  • Cliquer sur le bouton Mode création du ruban Développeur pour le désactiver,
  • Sélectionner un département puis une activité et enfin une ville,
Critères recoupés en cascade par choix dans les listes déroulantes Excel liées

Comme l'illustre la capture ci-dessus, tous les choix en cascade sont parfaitement répercutés dans la zone de critères. Grâce à la connexion aux données d'une base Access par le code VBA Excel, la sélection et le tri des données se sont avérés beaucoup plus simples qu'avec une source située dans une feuille Excel. Nous confirmerons cette thèse dans la prochaine formation qui consistera à consolider la requête, sur la base de ces critères, afin d'extraire les données correspondant aux choix de l'utilisateur.

Remarque : La première ligne de gestion d'erreur que nous avons volontairement reportée en entête de chaque procédure (On Error Resume Next), permet d'éviter de produire une exception au démarrage, lorsque les listes sont recalées mais qu'elles n'ont aucune donnée à fournir.

 
Sur Facebook
Sur G+
Sur Youtube
Les livres
Contact
Mentions légales