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

2018 01 08 18h03 46 acces

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

Salut et merci

Mille Merci !!! Trop Fort !

Tu voulais dire... ToFor non

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+

Rechercher des sujets similaires à "lire valeur base donnee access"