Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Récupérer les données d'une autre base
A l'occasion des deux volets précédents, nous avons appris Ã
télécharger un fichier distant et à le
décompresser en local par le
code VBA Access . Il en a résulté une
base de données Access . Dans ce nouveau volet et pour parachever la solution, nous souhaitons accéder aux
enregistrements de tables de cette base externe, pour les
importer automatiquement dans la base de données en cours.
Base de données Access à télécharger
Pour terminer le développement, nous devons nous appuyer sur la
base de données hébergeant les travaux précédents.
Il est doté d'un
sous-formulaire vierge pour l'instant. Il est censé restituer les données de la
table societes . C'est précisément dans cette table que nous devons
importer les enregistrements de la base de données téléchargée et décompressée.
A ce titre, si vous cliquez sur le
bouton de téléchargement dans l'
entête du formulaire , vous obtenez bien dans le dossier de l'application, le
fichier compressé téléchargé et la
base de données résultante après
décompression . Elle se nomme
base-distante.accdb .
La procédure d'importation
Aux
deux procédures VBA existantes, nous devons en ajouter une troisième. Elle doit donc se charger d'
accéder aux enregistrements de la
base de données externe . Bien sûr, elle devra être appelée après le téléchargement et la décompression pour que la récupération des informations soit automatisée.
Vous notez la présence de
deux procédures VBA . Elles se nomment respectivement
telecharger_MouseUp et
decompresser . La première se lance au clic sur le bouton du formulaire. Elle se charge du
téléchargement du fichier distant et appelle la seconde. La seconde se charge de
décompresser le fichier téléchargé .
Sous la procédure decompresser, créer la procédure recuperer, comme suit :
Sub recuperer(cheminFichier As String)
End Sub
Nous la déclarons avec un paramètre en attente. Il s'agit du
chemin d'accès à l'archive zippée que nous devons lui transmettre. Nous l'exploiterons pour reconstituer le
chemin d'accès au fichier décompressé . Seule l'extension change.
La déclaration des variables
Nous avons besoin de plusieurs variables pour réaliser cette importation de masse. Tout d'abord des
objets sont nécessaires pour
piloter la
base de données en cours mais aussi la
base externe et
ses enregistrements . Nous avons aussi besoin d'une variable pour mémoriser la
syntaxe SQL d'insertion des données. Enfin, nous avons besoin de variables pour stocker les informations des
champs de la table externe que nous allons parcourir.
...
Dim cetteBase As Database: Dim baseDistante As Database
Dim enr As Recordset: Dim requete As String
Dim nom As String: Dim act As String: Dim dep As String: Dim ville As String: Dim cp As String
...
Nous commençons par déclarer
deux objets de
type Database pour manipuler les
deux bases de données . L'
objet de type Recordset doit servir à atteindre les
enregistrements de la
base externe . La
variable requete typée comme un
texte (As String) doit accueillir la
syntaxe Sql d'ajout pour chaque enregistrement externe que nous allons parcourir. Les cinq dernières variables de texte doivent récolter les informations de chaque champ pour chaque enregistrement.
L'initialisation des variables
Maintenant que ces variables sont déclarées, il est question de procéder à l'initialisation de certaines. Nous devons pointer sur les deux bases de données mais aussi sur les enregistrements de la seconde.
Après les déclarations, ajouter les affectations suivantes :
...
cheminFichier = Replace(cheminFichier, ".zip", ".accdb")
Set baseDistante = OpenDatabase(cheminFichier)
Set enr = baseDistante.OpenRecordset("societes")
Set cetteBase = CurrentDb()
...
Tout d'abord, nous exploitons la
fonction Replace pour remplacer l'
extension zip par l'
extension accdb et ainsi pointer sur le fichier de la
base de données décompressée . Ensuite, c'est la
méthode OpenDatabase avec le
chemin d'accès au fichier (cheminFichier) qui permet d'initialiser l'
objet baseDistante sur la
base de données téléchargée . Dès lors, sa
méthode héritée OpenRecordset permet d'initialiser l'
objet enr sur les
enregistrements de la table societes de cette base. Enfin, c'est la
fonction CurrentDb qui permet d'initialiser l'
objet cetteBase sur la
base de données en cours .
Parcourir les enregistrements de la base externe
C'est une
boucle Do à exercer sur l'
objet enr qui est maintenant nécessaire pour
parcourir un à un,
tous les enregistrements de la
base de données externe .
A la suite du code, créer la boucle Do comme suit :
...
enr.MoveFirst
Do
enr.MoveNext
Loop While Not enr.EOF
...
Nous exploitons tout d'abord la
méthode MoveFirst de l'
objet enr pour placer le
pointeur de lecture sur le
premier enregistrement de la
table societes de la
base de données externe . Ensuite, nous parcourons tous les enregistrements (Do Loop) jusqu'au dernier (While Not enr.EOF). C'est la
propriété EOF (End Of File) de l'
objet enr qui renvoie cette indication. Bien sûr, pour ne pas faire du sur place, à chaque passage dans cette boucle, nous déplaçons le
pointeur de lecture sur l'
enregistrement suivant , grâce à la
méthode MoveNext de l'
objet enr .
Récupérer les informations de champs
Les
champs de la
table societes , que ce soit pour la base en cours ou pour la base de données externe, portent les mêmes noms (societes_nom, societes_activite etc...). Ces deux tables ont logiquement la même structure. C'est la
propriété Fields de l'
objet enr qui permet de les atteindre.
Dans la boucle Do, avant la méthode MoveNext, ajouter les instructions VBA suivantes :
...
Do
nom = enr.Fields("societes_nom").Value
act = enr.Fields("societes_activite").Value
dep = enr.Fields("societes_departement").Value
ville = enr.Fields("societes_ville").Value
If IsNull(enr.Fields("societes_cp").Value) Then
cp = ""
Else
cp = enr.Fields("societes_cp").Value
End If
enr.MoveNext
Loop While Not enr.EOF
...
Pour l'enregistrement en cours d'analyse, nous stockons donc chaque information de champ dans les variables prévues à cet effet. A chaque passage, elles porteront des données différentes qu'il est donc question d'insérer entre temps dans la
table societes de la
base de données en cours . Vous notez que nous réalisons une gestion d'exception sur le dernier champ (societes_cp). Il porte en effet des valeurs nulles, soit des informations qui n'ont jamais été insérées. Pour ne pas compromettre le programme, nous exploitons la
fonction de test logique IsNull . Si le test est concluant, nous insérons une donnée textuelle vide ("") dans le champ en question.
Insérer les données dans la table
A chaque fois que les données de champs sont récoltées, elles doivent être insérées dans la table de la base de données en cours, pour pouvoir porter l'analyse sur l'enregistrement suivant grâce à la boucle Do. Pour cela, nous devons construire une classique
syntaxe SQL d'insertion .
Toujours à la suite de la boucle et avant le MoveNext, ajouter les instructions suivantes :
...
End If
requete = "INSERT INTO societes(societes_nom, societes_activite, societes_departement, societes_ville, societes_cp) VALUES ('" & nom & "','" & act & "','" & dep & "','" & ville & "','" & cp & "')"
cetteBase.Execute requete
enr.MoveNext
...
Nous insérons (Insert Into) dans la
table societes , pour
tous les champs qu'elle contient et énumérés dans l'ordre entre parenthèses, les informations (VALUES) correspondantes détenues par les variables que nous venons d'affecter. Toutes ces données sont textuelles. C'est pourquoi nous les encadrons de côtes. Mais comme la syntaxe est déjà écrite entre doubles côtes, nous alternons les simples et les doubles. Nous exécutons cette syntaxe sur la base de données en cours grâce à la
méthode Execute .
Détruire les objets inutilisés
Comme il est de coutume à l'issue du traitement, nous devons fermer et détruire les objets qui ne sont plus utilisés. C'est ainsi que nous libèrerons la mémoire de l'ordinateur.
Après la boucle, ajouter les instructions VBA suivantes :
...
Loop While Not enr.EOF
enr.Close
baseDistante.Close
cetteBase.Close
Set enr = Nothing
Set baseDistante = Nothing
Set cetteBase = Nothing
...
Grâce à la
méthode Close , nous fermons chacun des trois objets que nous détruisons dans l'enchaînement en les réinitialisant (Set) à Nothing.
Rafraîchir le sous formulaire
Nous n'en avons pas tout à fait terminé. Souvenez-vous, le
sous-formulaire est lié à la
table societes de la
base de données en cours . Pour qu'il restitue les informations importées à l'issue du processus, sa vue doit être rafraîchie. Une méthode simple et transparente pour l'utilisateur consiste à fermer et rouvrir le formulaire parent.
A la fin de la procédure, ajouter les instructions VBA suivantes :
...
Set cetteBase = Nothing
DoCmd.Close acForm, "fRecup"
DoCmd.OpenForm "fRecup"
End Sub
...
L'
objet DoCmd est décidément précieux en
VBA Access . Grâce à sa
méthode Close sur un objet de type formulaire (acForm), nous ordonnons la
fermeture du formulaire fRecup . Grâce à sa
méthode OpenForm , nous ordonnons sa réouverture immédiate. L'utilisateur n'y verra que du feu.
Appeler la procédure
Enfin et ne l'oublions pas, ce code VBA doit être appelé au clic sur le bouton du formulaire après le téléchargement et la décompression du fichier distant.
Dans la procédure telecharger_MouseUp, ajouter l'appel suivant :
...
flux.Close
decompresser chemin, CurrentProject.Path & "\"
recuperer chemin
Else
...
Nous l'appelons naturellement en lui passant le chemin d'accès à l'archive à décompresser.
Enregistrer les modifications (CTRL + S) et revenir sur le formulaire (ALT + Tab),
Puis, cliquer sur le bouton de téléchargement en haut du formulaire,
Comme vous pouvez l'apprécier, les enregistrements de la base de données distante sont importés en un temps record dans la base de données active. Pourtant et entre temps, le code VBA a aussi procédé à son téléchargement et à sa décompression.