formateur informatique

Importer des données d'une feuille Excel en VBA Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Importer des données d'une feuille Excel 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 :


Importer depuis Excel

A l'occasion de précédentes astuces, nous avions appris à exporter des données dans une feuille d'un classeur Excel, mais aussi à les consolider en exportant les informations à la suite des précédentes. Ici, nous proposons de réaliser le cheminement inverse. Il est donc question d'importer les données d'un tableau Excel dans une table Access, par le code VBA.

Base de données Access à télécharger
Pour développer cette nouvelle solution, nous suggérons d'appuyer l'étude sur une base de données Access offrant déjà un formulaire ainsi que sur un classeur Excel hébergeant des données à réceptionner. Comme vous le voyez, la décompression livre le fichier de la base de données. Il est nommé importer-depuis-excel.accdb et il est accompagné d'un sous dossier intitulé source.
  • Double cliquer sur ce sous dossier pour l'ouvrir,
Vous y découvrez la présence d'un fichier Excel. Il est nommé tableau-excel.xlsx.
  • Double cliquer sur ce dernier pour l'ouvrir dans Excel,
  • Puis, cliquer sur le bouton Activer la modification du bandeau de sécurité,
Données de feuille Excel à importer dans base Access par le VBA

Vous découvrez la base de données Excel dont il s'agit d'importer le contenu structuré dans Access. Ce sont les colonnes B, C, D et E qui nous intéressent sur le nom de l'activité, l'activité précisément, le département et la ville. Il s'agit donc des rangées 2, 3, 4 et 5.

Si vous réalisez le raccourci clavier CTRL + Fin, vous atteignez la fin du fichier, sur la ligne 1244. Vous constatez que le nom de l'activité est Restaurant Thi-Mi. Nous allons devoir bâtir un code VBA Access adaptatif capable de rapatrier toutes ces données, jusqu'à la dernière, dans la table Access.
  • Fermer le classeur Excel en cliquant sur la croix de sa fenêtre,
  • Revenir à la racine du dossier de décompression,
  • Puis, double cliquer sur le fichier importer-depuis-excel.accdb pour l'ouvrir dans Access,
  • Cliquer sur le bouton Activer le contenu du bandeau de sécurité,
  • Dans le volet de navigation sur la gauche, double cliquer sur le formulaire fImport,
Ainsi, nous l'exécutons.

Formulaire Access pour importer des données Excel en VBA

Ce formulaire est composé d'un contrôle activeX progressBar pour rendre compte de l'état d'avancement du processus d'importation par le code VBA que nous allons construire. Il est aussi doté de deux boutons. Le premier est celui qui nous intéresse. Il est intitulé Importer. C'est aussi son nom d'objet. C'est lui qui doit lancer le traitement VBA consistant à interroger toutes les cellules du classeur Excel mentionné par l'utilisateur, pour rapatrier toutes les valeurs dans la table Access. Cette table est nommée societes.
  • Double cliquer sur le nom de cette table depuis le volet de navigation,
Ainsi, nous l'affichons en mode feuille de données. Elle est vide bien entendu. En consultant les noms de ses champs, vous constatez qu'elle attend de réceptionner les informations du tableau Excel.

Table Access pour réceptionner les données de feuille Excel

C'est le code VBA que nous devons déclencher au clic sur le bouton Importer qui doit s'en charger.

Les librairies externes
Nous devons commencer par ajouter deux références au projet. La première doit permettre de piloter les boîtes de dialogue standard d'Office. La seconde doit fort naturellement permettre de manipuler une instance d'Excel.
  • Fermer la table puis à 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 Importer pour le sélectionner,
  • Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
  • Cliquer sur le petit bouton associé à son événement Au clic,
  • Dans la boîte de dialogue, choisir le Générateur de code et valider par Ok,
Nous basculons ainsi dans l'éditeur VBA Access, entre les bornes de la procédure événementielle importer_Click.
  • En haut de l'éditeur, déployer le menu Outils,
  • Dans les propositions, choisir l'option Références,
Les deux librairies nécessaires sont déjà cochées. Nous avions anticipé. Elles se nomment respectivement Microsoft Excel 16.0 Object Library et Microsoft Office 16.0 Object Library. Mais si elles n'avaient pas été présentes, il aurait fallu les ajouter pour les besoins de ce développement spécifique.
  • Cliquer sur le bouton Ok de la boîte de dialogue pour revenir sur la feuille de code.
La déclaration des variables
Ensuite, un certain nombre de variables sont nécessaires. Il s'agit notamment de piloter l'instance d'Excel, la boîte de dialogue d'ouverture de fichiers en encore la base de données en cours.
  • Dans les bornes de la procédure, ajouter les déclarations et affectations suivantes :
...
Dim boite As FileDialog: Dim chemin As String
Dim instanceE As Excel.Application
Dim base As Database: Dim requete As String
Dim ligne As Long: Dim nbLignes As Long
Dim nom As String: Dim act As String: Dim dep As String: Dim ville As String

Set boite = Application.FileDialog(msoFileDialogFilePicker)
If boite.Show Then chemin = boite.SelectedItems(1)
...


Nous déclarons l'objet boite comme un FileDialog grâce à la deuxième des deux références ajoutées au projet. C'est lui qui permettra de piloter cette boîte de dialogue d'ouverture. Dans la variable chemin, nous stockerons le chemin d'accès au classeur Excel désigné par l'utilisateur, par le biais de cette boîte de dialogue. L'objet instanceE typé comme un Excel.Application permettra d'instancier la classe du tableau Office. La variable base est typée comme un objet Database pour pouvoir piloter la base de données en cours. Nous le verrons au moment de son initialisation. Sur cette dernière, la variable requete doit mémoriser la syntaxe de la requête insertion à y exécuter. Les deux variables suivantes sont déclarées comme des entiers longs (As Long). La première doit suivre les lignes parcourues dans le tableau de la feuille Excel. La deuxième (nbLignes) doit mémoriser le nombre total de lignes du tableau Excel. Nous l'utiliserons pour étalonner la barre de progression. Enfin, les quatre dernières variables sont typées comme des textes (As String). Enregistrement par enregistrement, elles doivent récolter les informations de champs depuis le tableau Excel, pour les importer dans la table Access.

Ensuite, nous initialisons (Set) notre objet boite sur une boîte de dialogue d'ouverture de fichiers (msoFileDialogFilePicker). Nous ouvrons cette boîte de dialogue (Show). Puis, nous récoltons le chemin d'accès au classeur désigné par l'utilisateur, dans la variable chemin. La collection SelectedItems représente tous les fichiers sélectionnés. Mais comme cette boîte non configurée n'accepte pas la multi sélection, nous savons que le fichier désigné se trouve en première position (1) de la collection.

Vérifier le fichier désigné
La suite du traitement ne doit être entreprise que dans la mesure où nous avons la certitude que l'utilisateur a bien désigné un fichier et donc qu'il n'a pas cliqué sur le bouton Annuler de la boîte de dialogue. D'ailleurs et à ce sujet, nous aurions pu émettre un filtre sur cette boîte pour qu'elle n'autorise que les fichiers Excel. Mais ça, nous savons le faire et ce n'est pas l'optique direct de cette formation.
  • A la suite du code, ajouter les instructions VBA suivantes :
...
If chemin <> "" Then
Set instanceE = CreateObject("Excel.Application")
instanceE.Visible = False
instanceE.Workbooks.Open chemin

End If
...


Nous créons une instruction conditionnelle destinée à vérifier que le chemin d'accès n'est pas vide (<>""). Si le critère est honoré, nous entreprenons l'instanciation de la classe Excel, grâce à la fonction VBA CreateObject. Dès lors, nous exploitons les méthodes et propriétés héritées pour ouvrir ce fichier (Open) désigné (chemin), en arrière-plan (Visible = False).

Parcourir les lignes de la feuille Excel
Maintenant que l'instance Excel est créée, nous pouvons accéder au contenu du fichier désigné, par le code VBA Access. Sur ce contenu, nous allons engager une boucle destinée à parcourir toutes les lignes du tableau, tant que la première cellule vide n'est pas détectée, donc tant que la fin des données n'est pas atteinte.
  • A la suite du code de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
nbLignes = instanceE.Sheets(1).Cells.SpecialCells(xlCellTypeLastCell).Row
Set base = CurrentDb()
ligne = 2

While instanceE.Sheets(1).Cells(ligne, 2).Value <> ""

Wend
...


Tout d'abord, nous travaillons sur l'instance Excel. Nous exploitons la méthode SpecialCells de la collection Cells pour connaître la ligne (Row) de la dernière cellule non vide de la feuille (xlCellTypeLastCell). Nous stockons cette information dans la variable nbLignes. Nous l'avons dit, nous l'exploiterons pour étalonner la barre de progression sur le formulaire.

Ensuite, nous utilisons la fonction VBA Access CurrentDb pour initialiser (Set) notre objet base de données (base) pour qu'il hérite des propriétés et méthodes lui permettant de piloter la base de données en cours. Nous initialisons la variable ligne sur le premier indice (2) à partir duquel il s'agit de récupérer les données, depuis la feuille Excel. Et précisément, sur cette feuille, grâce à l'instance Excel, nous engageons une boucle pour parcourir toutes les lignes du tableau, tant que la première cellule vide n'est pas détectée (Cells(ligne, 2).Value<> "").

Récupérer les données d'Excel
A chaque passage dans cette boucle, nous devons récupérer les informations de champs, ligne à ligne. Pour pointer sur chaque colonne, nous devons exploiter l'objet VBA Excel Cells.
  • Dans les bornes de la boucle, ajouter les instructions VBA suivantes :
...
With instanceE.Sheets(1)
nom = .Cells(ligne, 2).Value
act = .Cells(ligne, 3).Value
dep = .Cells(ligne, 4).Value
ville = .Cells(ligne, 5).Value

ligne = ligne + 1
End With
...


Sur la première feuille du classeur (Sheets(1)), nous récoltons les données de chaque champ (2, 3, 4 et 5) pour la ligne en cours (ligne) pour les stocker dans les variables respectives, prévues à cet effet. A chaque passage bien sûr, nous n'oublions pas d'incrémenter la variable ligne (ligne = ligne + 1), pour déplacer l'analyse sur la ligne suivante du tableau Excel.

Importer les données dans Access
Une fois ces données stockées, nous devons les exploiter pour les insérer dans la table Access. Pour cela, nous devons construire une requête d'ajout.
  • A la suite, avant l'incrémentation de la variable ligne, ajouter les instructions VBA suivantes :
...
dep = .Cells(ligne, 4).Value
ville = .Cells(ligne, 5).Value

requete = "INSERT INTO societes(societes_nom, societes_activite, societes_departement, societes_ville) VALUES ('" & nom & "','" & act & "','" & dep & "','" & ville & "')"
base.Execute requete

evolution.Value = Int((ligne * 100) / nbLignes)


ligne = ligne + 1
End With
...


Il s'agit d'une syntaxe SQL classique permettant d'enrichir chaque champ de la table de destination , listés dans les premières parenthèses, avec les informations récoltées, concaténées et listées dans les secondes parenthèses. Après, c'est la méthode héritée Execute par l'objet base qui permet d'exécuter cette syntaxe. Enfin, nous calibrons la barre de progression (nommée evolution) pour qu'elle progresse en même temps que l'analyse des lignes du tableau Excel.

Décharger les objets
Pour finir proprement, nous devons décharger les objets de programmation et à avertir l'utilisateur que le traitement est terminé.
  • A la fin du code, ajouter les instructions VBA suivantes :
...
Wend
instanceE.Quit
Set instanceE = Nothing
base.Close
Set base = Nothing

End If

MsgBox "L'importation des données Excel est terminée"

Set boite = Nothing

End Sub
...
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
  • Exécuter ce formulaire en enfonçant par exemple la touche F5 du clavier,
  • Cliquer sur le bouton Importer,
  • Avec la boîte de dialogue, double cliquer sur le fichier Excel depuis le sous dossier source,
Importer les données de cellules Excel dans une table Access en VBA

Comme vous pouvez le voir, le processus s'enclenche et la barre de progression rend compte de l'avancement. A l'issue, la boîte de dialogue programmée, informe l'utilisateur de la fin du traitement d'importation des données Excel.

Et si vous ouvrez la table societes qui était vide, vous en avez instantanément le coeur net. Toutes les informations externes ont été récupérées par le code VBA Access.

Données Excel importées dans une table Access par le code VBA

 
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