Lire une valeur dans une base de donnée Access
Bonjour,
Je suis nouveau sur ce forum et dans VBA.
(Je compte sur votre aide pour me remettre sur le droit chemin si je commets quelques erreurs de jeunesse
L'objectif est de sécuriser les données dans une base de données et de faire en sorte de chercher uniquement les informations nécessaire (idéalement en demandant un accord ou mot de passe).
A partir d'une liste de produits (dans un fichier excel 2016) je souhaiterai qu'une macro inscrive une fonction ou recherche les données correspondantes aux produits qui se trouvent dans une base de données Acces 2016 (Voir ex. fichiers joints).
En résumé, le fichier excel se présente de la manière suivante en col A le "nomduproduit" et en col B la "couleurduproduit" . Il s'agit d'afficher la couleur correspondante en cherchant la valeur dans une base Access pour le produit équivalent.
(Cette base est faite de 800 articles (en lignes) avec une 100ène de caractéristiques (en colonne) dont la couleur à trouver pour l'article correspondant (en début de ligne).)
Ci-dessous, j'ai repris une fonction, trouvée sur un ancien post. Cependant celle-ci n'affiche que la valeur du premier enregistrement (peu importe le produit en référence). Impossible de trouver le bug.
Au préalable j'avais des erreurs concernant les Références-VBAProject (Dans VBA Menu outils/Références..) ceci semble solutionné.
Cf copie écran des références actuelles sélectionnées.
Peut-être existe-il une autre méthode plus simple.
Votre aide serait la bienvenue !
Merci d'avance
Salutations
Function ReadDatabase(DatabaseFilePath As String, Table As String, Column As String, Value As String, Field As String) As Variant
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
'¤ Arguments de la fonction ¤
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
'DatabaseFilePath Chemin de la base de donnée
'Table Nom de la table
'Column Nom du champ de référence
'Value Valeur de référence
'Field Nom du champ recherché
'ReadDatabase("C:\Entreprise\DB.accdb";"Factures";"N° de Facture";"1";"TPS à payer")
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
'¤ Références nécessaire ¤
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
'Microsoft Visual Basic pour Application
' --> Outils
' ---> Références…
' Microsoft ActiveX Data Objects 6.1 Library
' Microsoft ADO Ext. 6.0 for DLL and Security
Dim AccessDatabase As String
Dim Command As New ADODB.Command
Dim Connection As ADODB.Connection
Dim Recordset As ADODB.Recordset
Dim SQL As String
AccessDatabase = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & DatabaseFilePath & ";"
Set Connection = New ADODB.Connection
Connection.Open AccessDatabase
Set Recordset = New ADODB.Recordset
Recordset.Open Table, Connection, adOpenKeyset, adLockOptimistic, adCmdTable
SQL = "SELECT * FROM Table WHERE Column = 'Value'"
ReadDatabase = Recordset.Fields(Field)
Recordset.Close
Set Recordset = Nothing
Connection.Close
Set Connection = Nothing
End Function
FICHIERS JOINTS
Acces.png
Excel rech vers acces.xlsm
(16.42 Kio) Pas encore téléchargé
2018-01-08_18h03_46.png
2018-01-08_18h03_46.png (62.67 Kio) Vu 1 fois
Bonjour ToforChris
Effectivement tu es nouveau et ça se voit
Merci d'éditer ton post et de mettre ton code entre balises [ code][ /code] en supprimant l'espace après [
Sinon, pour revenir à cette fonction, ReadDatabase peut te retourner un tableau dans le cas d'enregistrements multiples et n'est donc pas utilisable comme une simple fonction, sinon tu n'auras toujours que la première valeur
A+
Ok Merci
C'est en forgeant que ....
Si d'autres suggestions te viennent n'hésite pas Merci
Re,
Je n'avais pas totalement compris ton problème avant d'essayer
1) ta requête n'est pas construite comme il faut, tes variables ne doivent pas se trouver dans les guillemets
SQL = "SELECT * FROM [" & Table & "] WHERE " & Column & "='" & Value & "';"
2) Il manque l'exécution de la requète dans l'ouverture de ton recordset
Recordset.Open SQL, Connection, adOpenKeyset, adLockOptimistic
3) Comme le nom de la base et le nom de la table ne changent pas en principe, je l'ai mis en dur dans le code
Chemin de la base = chemin du fichier Excel + Nom de la base = ton pseudo
Ce qui fait que tu as moins d'arguments à donner en cellule B2
=ReadDatabase("NomProduit";A2;"Couleur")
Et voici donc le code en entier
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
'¤ Références nécessaire ¤
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
'Microsoft Visual Basic pour Application
' --> Outils
' ---> Références…
' Microsoft ActiveX Data Objects 6.1 Library
' Microsoft ADO Ext. 6.0 for DLL and Security
Function ReadDatabase(Column As String, Value As String, Field As String) As Variant
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
'¤ Arguments de la fonction ¤
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
'DatabaseFilePath Chemin de la base de donnée
Dim DatabaseFilePath As String
DatabaseFilePath = ThisWorkbook.Path & "\ToforChris.accdb"
'Table Nom de la table
Dim Table As String
Table = "Table1"
'Column Nom du champ de référence
'Value Valeur de référence
'Field Nom du champ recherché
Dim AccessDatabase As String
Dim Connection As New ADODB.Connection
Dim Recordset As New ADODB.Recordset
Dim SQL As String
' Créer le texte de connexion à la base
AccessDatabase = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & DatabaseFilePath & ";"
' Ouvrir la base
Connection.Open AccessDatabase
' Préparer la réquête SQL
SQL = "SELECT * FROM [" & Table & "] WHERE " & Column & "='" & Value & "';"
' Ouvrir le recodrset en exécutant la requête
Recordset.Open SQL, Connection, adOpenKeyset, adLockOptimistic
' récupérer l'enregistrement
ReadDatabase = Recordset.Fields(Field)
' Fermer tout
Recordset.Close
Set Recordset = Nothing
Connection.Close
Set Connection = Nothing
End Function
Bonne soirée
A+
Merci pour cette belle réponse !
Cependant j'obtiens le résultat suivant : #VALEUR!
J'ai déjà fait une modif sur le chemin, il me semble que tu voulais dire chemin du fichier Access et non excel
"Chemin de la base = chemin du fichier Excel + Nom de la base = ton pseudo"
Je continue de chercher (pour info le références VBAproject sont ok)
Merci
Bonne soirée A+
Re,
NON.... je voulais bien dire : chemin du fichier Excel
ThisWorkbook.Path
donne le chemin d'accès du classeur ouvert
Par défaut et pour essai, j'ai mis chez moi la base Access dans le même répertoire !
Bonjour
Mille Merci !!! Trop Fort !
Que la force soit avec toi
Bonne journée
bonjour,
très intéressant ce sujet, j'allais poster un peu le même^^
Sauf que j'ai une contrainte de plus : ma base de données Access est en .mdb... Et bien sur le seul logiciel avec laquelle j'arrive à l'ouvrir est Access 2003, pas plus récent. mais j'ai Excel 2016.
Quelqu'un saurait si je peux convertir cette base ?
merci à vous !
Bonjour mezio47-63
Normalement il suffit de changer le provider de la chaîne de connexion.
Lequel, soit doit se trouver : provider+access 2003
A+