Access et VBA
Liens VBA vers Microsoft Access depuis Excel
Pour avoir accès aux objets d'une autre application, donc pour manipuler les informations du serveur, on doit référencer sa bibliothèque d'objets (un fichier .olb) via le menu Outils / Références de l'éditeur VBA. Ce menu est la liste des serveurs OLE enregistrés dans la base de registre de Windows.
La technologie Automation
Automation, appelée également OLE (Object Linking and Embedding) ou OLE Automation, est une technologie qui permet de manipuler les objets d'une autre application directement à partir d'Excel. Pour utiliser la technologie Automation, on doit définir dans le code VBA une variable objet associée aux objets de type application.Pour réaliser notre exemple (Afficher des données Access dans Excel), il faut d'abord sélectionner une référence au module externe Access via le menu Outils / Références de l'éditeur VBA. On coche l'option Microsoft Access 12.0 Object Library (11.0 correspond à 2003, 12.0 pour 2007 et 14.0 pour 2010).
Afficher la liste des tables d'une base Access dans Excel
Ouvrir le fichier Access "comptoir.mdb" et lister le nom des tables dans la feuille courante.
Sub Proc_Afficher_Noms_Tables_Access()
' Création de la variable objet :
Dim acc As Access.Application
' Initialisation de la variable :
Set acc = New Access.Application
Dim i As Integer
acc.OpenCurrentDatabase ("c:\comptoir.mdb")
For i = 0 To acc.CurrentData.AllTables.Count - 1
Range("A" & i + 1).Value = acc.CurrentData.AllTables(i).Name
Next i
acc.CloseCurrentDatabase
End Sub
' Création de la variable objet :
Dim acc As Access.Application
' Initialisation de la variable :
Set acc = New Access.Application
Dim i As Integer
acc.OpenCurrentDatabase ("c:\comptoir.mdb")
For i = 0 To acc.CurrentData.AllTables.Count - 1
Range("A" & i + 1).Value = acc.CurrentData.AllTables(i).Name
Next i
acc.CloseCurrentDatabase
End Sub
Note : -1 car 16 tables! Si je part à 0, j'affiche 17 tables alors qu'il n'y en a que 16.
On aurait pu demander uniquement les tables qui commence pas le mot "msys" :
For i = 0 To acc.CurrentData.AllTables.Count - 1
If Left(UCase(acc.CurrentData.AllTables(i).Name), 4) <> "MSYS" Then
Range("A" & i + 1).Value = acc.CurrentData.AllTables(i).Name
End If
Next i
If Left(UCase(acc.CurrentData.AllTables(i).Name), 4) <> "MSYS" Then
Range("A" & i + 1).Value = acc.CurrentData.AllTables(i).Name
End If
Next i
Pour aller plus loin : requête qui affiche la liste des codes client de la table Clients
Sub proc_liste_des_code_client()
Dim i As Integer
Dim acc As Access.Application
Set acc = New Access.Application
' Ouvre la base
acc.OpenCurrentDatabase ("C:\comptoir.mdb")
' Création d'un jeu de données
Dim rec As Object
Set rec = acc.CurrentDb.OpenRecordset("Clients")
'Affiche le nombre de champs
Range("A1").Value = rec.Fields.Count
'Affiche le nombre d'enregistrement
rec.MoveLast
Range("A2").Value = rec.RecordCount
' Affichage des Champs de la table Clients :
' Code client, Société, Contact, Fonction, Adresse, Ville
rec.MoveFirst
i = 1
While Not rec.EOF
Cells(i, 2).Value = rec.Fields("Code client")
rec.MoveNext
i = i + 1
Wend
rec.Close
End Sub
Dim i As Integer
Dim acc As Access.Application
Set acc = New Access.Application
' Ouvre la base
acc.OpenCurrentDatabase ("C:\comptoir.mdb")
' Création d'un jeu de données
Dim rec As Object
Set rec = acc.CurrentDb.OpenRecordset("Clients")
'Affiche le nombre de champs
Range("A1").Value = rec.Fields.Count
'Affiche le nombre d'enregistrement
rec.MoveLast
Range("A2").Value = rec.RecordCount
' Affichage des Champs de la table Clients :
' Code client, Société, Contact, Fonction, Adresse, Ville
rec.MoveFirst
i = 1
While Not rec.EOF
Cells(i, 2).Value = rec.Fields("Code client")
rec.MoveNext
i = i + 1
Wend
rec.Close
End Sub
Note: While produit une boucle jusqu'à ce que l'expression devienne fausse.
Elle se termine par WEND (While END).