Liaison excel avec une base mySQL en VBA

bonite

XLDnaute Nouveau
Bonjour,

à nouveau besoin d'aide, après avoir pu connecter une base mySQL à une feuille Excel.

Je souhaiterais pouvoir accéder à cette base MySQL directement dans un code VBA pour modifier un UserForm (chargement des champs de sélection) et pour lancer directement des SELECT, UPDATE, DELETE sur cette base en codifiant les accès comme je le fait en PHP.

Cela est-il possible ? et comment

Remerciements et salutations.
 

CAPRI_456

XLDnaute Occasionnel
Re : Liaison excel avec une base mySQL en VBA

Bonjour le Forum, Tatiak,..

J'ai un soucis de connexion dans le classeur exemple que tu donnes lors de l'utilisation du bouton INSERER DONNEES

Sub InsertData()
Dim Rs As ADODB.Recordset
Dim Derligne As Integer, i As Integer
Dim Requete As String

Set Rs = New ADODB.Recordset
Call ConnectionDB
With Sheets(1)
Derligne = .Range("A65000").End(xlUp).Row
For i = 2 To Derligne
Requete = "INSERT INTO voitures(id, marque, modele, cv) VALUES(" & _
.Cells(i, 1) & ", '" & _
.Cells(i, 2) & "', '" & _
.Cells(i, 3) & "', " & _
.Cells(i, 4) & ")"
Rs.Open Requete, oConnect, adOpenDynamic, adLockOptimistic
Next i
End With
oConnect.Close
Set Rs = Nothing
End Sub

La ligne en rouge cause un problème et le code s'arrête là et le débogage affiche
-- "ce pilote ODBC ne prend pas en charge les propriétés demandées" --

d'où peut bien venir se problème.
J'ai vérifier mes connexions, elles sont bonne, je travaille en localhost:81
les autres paramètres dans l'onglet config sont aussi corrects.

Merci pour votre contribution.

Bien à vous

CAPRI_456
 

Innocent

XLDnaute Nouveau
Salut, je ne sais pas si ca peut encore aider puisque trois ans sont passés. Je viens de trouver une solution pour ce problème. Mettez juste avant :
Rs.Open Requete, oConnect, adOpenDynamic, adLockOptimistic
ces trois lignes de codes et ca passera:
Rs.CursorLocation = 3
Rs.CursorType = 0
Rs.LockType = 1
 

babast

XLDnaute Nouveau
Bonjour,
Je viens d'essayé ce fichier et il correspond tout a fait à ce que je veux faire. j'ai juste un problème. Lors du premier click sur insère donné la macro fonctionne correctement par contre quand je change une donnée ou que je rajoute une ligne j'ai le message suivant :
1027562
1027563

Est ce que le problème vient du connecteur, de la version de mysql je suis un peu dans le flou.
D'avance je remercie la personne qui pourrait m’éclairer.
 

babast

XLDnaute Nouveau
Bonjour et merci pour cette réponse rapide. J'ai fait un essai et j'ai une erreur image ci-jointe.
1027589

Comme vous le voyez je ne suis pas un expert en excel mais j'ai besoin de mettre à jour régulièrement une base de donnée MySQL avec un fichier excel. Je m'explique. J'ai un fichier excel qui s actualise régulièrement (+ de 1000 ligne) et je veux actualisé la base mysql pour rajouter des lignes et modifié les lignes quand elles sont modifiés dans un premier temps. Dans un deuxième temps je voudrais comparer les données de la base mysql et le fichier excel et quand les données n'apparaisse pas dans le fichier excel passer les données de la base mysql en un état quelconque ou alors les copier dans une table archive.
Votre code m’intéresse car au moins pour la première parties de mon problème je penses qu il fait ce que je veux faire.
J'espère avoir été claire dans mes explications et je vous remercie d'avance si vous pouviez m'aider dans cette tache.
D'avance merci.
Sébastien
 

babast

XLDnaute Nouveau
Bonjour Pierre,
Merci de prendre du temps. Je te joint le code car j'ai toujours la même'erreur.

VB:
Option Explicit

Public oConnect As ADODB.Connection

Private Sub ConnectionDB()
Dim S As String
    Set oConnect = New ADODB.Connection
    S = "DRIVER={MySQL ODBC 5.1 Driver};" & _
        "SERVER=" & Sheets("config").Range("B1").Text & ";" & _
        "DATABASE=" & Sheets("config").Range("B2").Text & ";" & _
        "USER=" & Sheets("config").Range("B3").Text & ";" & _
        "PASSWORD=" & Sheets("config").Range("B4").Text & ";" & _
        "Option=3"
    oConnect.Open S
End Sub


Sub InsertData()
Dim Rs As ADODB.Recordset
Dim Derligne As Integer, i As Integer
Dim Requete As String
  
    Set Rs = New ADODB.Recordset
    Call ConnectionDB
    On Error GoTo errhdlr
    With Sheets(1)
        Derligne = .Range("A65000").End(xlUp).Row
        For i = 2 To Derligne
            Requete = "SELECT * FROM voitures WHERE id=" & .Cells(i, 1)
            Rs.Open Requete, oConnect
            If Rs.EOF And Rs.BOF Then
                Rs.Close
                Requete = "INSERT INTO voitures(id, marque, modele, cv) VALUES(" & _
                    .Cells(i, 1) & ", '" & _
                    .Cells(i, 2) & "', '" & _
                    .Cells(i, 3) & "', " & _
                    .Cells(i, 4) & ")"
            Else
                Requete = "UPDATE voitures SET " & _
                    " marque='" & .Cells(i, 2) & "', " & _
                    " modele='" & .Cells(i, 3) & "', " & _
                    " cv=" & .Cells(i, 4) & _
                    " WHERE id=" & .Cells(i, 1)
            End If
            Rs.Open Requete, oConnect, adOpenDynamic, adLockOptimistic
            Rs.Close
        Next i
    End With
    oConnect.Close
    Set Rs = Nothing
    Exit Sub
  
errhdlr:
    oConnect.Close
    MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description
End Sub

Je te remercie d'avance de regarder ce qui coince.
 

babast

XLDnaute Nouveau
Tout fonctionne. Je vais maintenant l'adapter à mon fichier excel.
Je te remercie car je vais pouvoir avancé sur mon projet. je reviendrai vers toi, car je suis comme tu l'a vu nul en vba, d'une pour te dire si mon adaptation à fonctionné et ou si j'ai un autre problème.
Encore merci
Sébastien
 

babast

XLDnaute Nouveau
Me revoilà, quand je supprimes une ligne par exemple la ligne id2 donc on passe de id1 à id3 j 'ai un message d'erreur. Est ce qu on peut adapter le code pour qu il fasse : création de id2 update de l'id 2 mais si l'id2 n'est plus là pas d'erreur.
J'espère avoir été claire.
Sébastien
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 925
Membres
101 841
dernier inscrit
ferid87