Faire travailler Excel avec Access
Bonjour tous,
Je viens vers vous car je souhaiterais développer sur excel userform un interface qui échangerai avec ACCESS.
CAD : Le userform de excel pourrait : Qestionner/Consulter/Ecrire dans Acces.
Cela est il deja possible? si oui (je l'espere :) )
Mon besoin serait le suivant, pourriez vous me dire comment :
1-> connexion entre access et excel
2-> Ecrire de user form excel à access
3-> Lire access dans userform excel
4-> Modifier access avec userform excel
Je sais que le sujet est trés large. juste savoir si cela et faisable....
Merci pour votre retour
Cordialement
Headfree
Bonjour,
Pas de souci pour créer/lire/écrire/modifier des données dans des tables Access depuis Excel.
Voici une démo (un peu ancienne) mais c'est surtout le code qui faut voir
Pierre
Bonjour,
En premier : Merci Pierrep56 pour ton retour.
D'un point de vu de excel vba & Userform je suis confirmé, mais et il y a toujours un mais. serais tu d'accord pour que l'on aborde le sujet étape par étapes.
Le premier étant d'expliquer la méthode de connexion entre excel & access stp
Merci pour ton retour
Coridalement
Headfree
Ok, no soucy,
Alors voici un de mes scripts de connexion à un accdb (copié/collé d'une de mes appli) :
Sub Connect_Access(Accdb As String)
Set Cnx = CreateObject("ADODB.Connection")
Cnx.provider = "MSDASQL"
Cnx.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & Accdb & ";"
Set Rst = CreateObject("ADODB.Recordset")
End SubEt tant qu'à faire, voici mes scripts de fermeture de connexion :
Sub Close_Cnx(Optional x As Byte)
On Error Resume Next
If x > 0 Then Rst.Close
If Cnx_IsOpen Then Cnx.Close
Set Cnx = Nothing
Set Rst = Nothing
End Sub
Function Cnx_IsOpen() As Boolean
On Error Resume Next
Cnx_IsOpen = (Cnx.State = 1)
End FunctionCes scripts se situent dans un module dans lequel sont déclarées 3 variables au début :Public Cat As Object, Cnx As Object, Rst As Object
* Cat est pour un "ADOX.Catalog" (pour manipuler les tables d'access)
* Cnx pour une "ADODB.Connection" (pour la connection)
* et Rst pour le "ADODB.Recordset" (pour les données à lire
Une fois connecté, il y a 4 actions principales courantes : INSERT UPDATE SELECT DELETE.
Pour les INSERT, UPDATE et DELETE => un simple Cnx.Execute Requete suffit
Requete étant une string du Genre => Requete = "DELETE FROM [Table] WHERE `Id`=" & valeur
Pour les SELECT, j'ai un script mis au point depuis longtemps et qui fonctionne bien :
Function Select_Db(Req As String, Optional noHead As Integer = 1) As Variant
Dim T As Variant, Rcd As Variant, f As Integer
Dim lig As Long, col As Long, i As Long, j As Long
On Error GoTo errhdlr
ReDim Rcd(1 To 1, 1 To 1)
Rst.Open Req, Cnx, 3
lig = Rst.RecordCount
If lig > 0 Then
Rst.MoveFirst
T = Rst.GetRows
col = Rst.Fields.Count
ReDim Rcd(1 To lig + 1, 1 To col)
For j = 0 To col - 1
Rcd(1, j + 1) = Rst.Fields(j).Name
For i = 0 To lig - 1
Rcd(i + 1 + noHead, j + 1) = IIf(IsNull(T(j, i)), Null, T(j, i))
Next i
Next j
End If
Select_Db = Rcd
Exit Function
errhdlr:
Rcd(1, 1) = "Erreur n°" & Err.Number & vbCrLf & Err.Description
Select_Db = Rcd
f = FreeFile()
Open ThisWorkbook.Path & "\Log.txt" For Append As #f
Print #f, Now() & " | " & Rcd(1, 1) & vbCrLf
Close #f
End FunctionC'est une fonction qui retourne un tableau de valeurs qu'on peut réutiliser par la suite comme on veut.
Par exemple pour une Requete= "SELECT `Champs1`,`Champs2` FROM [Table] WHERE `Id`=" & valeur
J'écris la fonction suivante :
Function Get_Exemple(valeur As Long) As Variant
Dim Requete As String
Requete= "SELECT `Champs1`,`Champs2` FROM [Table] WHERE `Id`=" & valeur
Connect_Access chemin & nom_de_la_base_access
Get_Exemple = Select_Db(Req, 1)
Close_Cnx
End Functionpour pouvoir l'appeler tout simplement comme suit :
Dim T as variant
T = Get_Exemple(3) ' pour appeler par exemple l'enregistrement n° 3et ainsi je récupère le `Champs1` dans la variable T(2,1) et le `Champs2` dans la variable T(2,2)
Rq, et si besoin, les entêtes seront dans T(1,1) et T(1,2)
Voilà le principe général que j'utilise couramment
Bonne lecture
Pierre
D'autres infos dans mes articles suivants :
http://tatiak.canalblog.com/archives/2016/05/25/33865554.html
http://tatiak.canalblog.com/archives/2017/10/29/35815984.html
SUper merci, je regarde cela en Weekend.
encore plus compliqué.si je souhaite faire une liste déroulante dans mon userform qui appelle dans une table access et attention avec une condition.
Possible ?
Merci
Cordialement
Headfree
Trop facile!
Avec le code proposé, on récupère un tableau à une ou plusieurs colonnes.
Il suffit de faire rentrer ce tableau dans la liste déroulante.
Par exemple, si j'ai une requête du genre :
"SELECT DISTINCT(`Champs_bidule`) FROM FROM [Table] WHERE " & Condition_machin
dans une function nommée "Get_Ma_Liste_des_Champs_bidule"
il suffit alors de dire :
Mon_Usf.Combobox_truc.list=Get_Ma_Liste_des_Champs_bidule
Et la Condition_machin peut être plus ou moins complexe en fonction du contexte. exemple de clause Where tirée d'une de mes appli :
" WHERE NOT `Salariés`=''" & _
" AND (NOT (`Fin Contrat` < " & Replace(deb, ",", ".") & _
" OR `Début Contrat` > " & Replace(fin, ",", ".") & ")" & _
" OR (ISNULL(`Fin Contrat`) AND `Début Contrat` < " & Replace(fin, ",", ".") & "))"Pour des exemples en situation, on peux se référer au fichier "Chantier-v1.5c" proposé ici
https://forum.excel-pratique.com/excel/planning-hebdomadaire-vba-147478#p908239
ou ici "Activité-copie"
https://forum.excel-pratique.com/excel/planning-hebdomadaire-vba-133965/10#p908353
(les requêtes se font sur du Xl mais le principe est le même, seul le script de connexion est différent )
Pierre
Respect !
Bon je m'attaque à cela !
Encore merci de ton support.
Je ferme pas le sujet car je risque de revenir ;-)
Cordialement
Headfree