IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème excel vba mysql


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut Problème excel vba mysql
    Bonjour,

    dans le cadre d'un projet je dois réaliser la gestion d'une base de données MySql grâce à excel (donc en vba).

    Pour cela j'utilise l'objet ADODB.connection et le driver MySQL ODBC 5.1 pour la connexion à la base.
    Je suis débutante en vba, j'y vais donc pas à pas, j'ai d'abord importer toutes les données de ma table, grâce à un requête sql, dans un fichier excel.

    J'essaye maintenant de voir comment faire pour pouvoir modifier une cellule de ma feuille et mettre à jour la donnée dans MySql.

    Pour cela, j'ai écrit un code test qui permet de récupérer toutes les informations utiles pour la modification. Dans l'état où il est, je sais qu'il manque plusieurs choses mais c'est juste pour tester si on peut écrire sur la base.

    Voilà le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Sub modification()
    Dim ligne As Integer, colonne As Integer, ancien As String, nouveau As String
    Dim cell As Range, attribut1 As String
     
     
    Set conn = CreateObject("ADODB.Connection")
     
    'On définit une chaîne de connexion et on l'affecte à la connexion
    conn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=localhost;DATABASE=projet;UID=root"
    'on ouvre la connexion
    conn.Open
     
    'repère la ligne selectionnée
    ligne = Selection.Row
    'repère la colonne sélectionnée
    colonne = Selection.Column
    'sauvegarde l'ancienne valeur de la selection
    ancien = Selection.Value
    'demande la nouvelle valeur
    nouveau = InputBox("quoi mettre?")
    'mémorise le nom de la table à modifier
    Table = activesheet.Name
     
    'récupère le nom de la première colonne, souvent clé primaire
    attribut1 = Range("$A$1").Value
    'récupère la valeur du champ concerné par le changement
    valeur1 = cells(ligne, 1).Value
     
    'récupère le nom de la 2e colonne, pour le cas des clés composées
    attribut2 = cells(1, 2).Value
    'récupère la valeur de ce champ pour la selection
    valeur2 = cells(ligne, 2).Value
     
    'récupère le nom du champ où il faut modifer la donnée
    champmodif = cells(1, colonne).Value
    'récupère la valeur de ce champ
    valeurmodif = cells(ligne, colonne).Value
     
    'On crée une requête sql qui va récupérer l'enregistrement de la ligne où il faut faire une modification
    Sql = "Select * From " & Table & " WHERE " & attribut1 & " = " & valeur1 & " AND " & attribut2 & " = " & valeur2
    Set requete1 = CreateObject("ADODB.Recordset")
    requete1.Open Sql, conn, adLockOptimistic
    'on se déplace au premier enregistrement trouvé
    requete1.movefirst
    'on affecte à l'attribut "champmodif" la nouvelle valeur
    requete1.fields(champmodif) = nouveau
    requete1.Update
     
    End Sub
    Pour tout ce qui est de récupérer les informations, cela fonctionne sans problème, par contre les 2 dernières lignes génèrent l'erreur suivante:
    Erreur d'éxecution 3251
    "Le jeu d'enregistrements suivant ne prend pas en charge la mise à jour. Il s'agit peut-être d'une limitation du fournisseur ou du type de verrou sélectionné."

    J'ai pourtant ajouté l'option "adlockoptimistic" qui permet de modifier la base (si j'ai bien compris ce que j'ai pu lire un peu partout sur le net). Je ne comprends donc pas ce qui peut coincer.
    A noter qu'avec juste une requête de délétion, cela ne fonctionne pas non plus, je ne pense donc pas que se soit "requete1.fields(champmodif) = nouveau" qui pose problème.

    Si quelqu'un a une idée, je suis preneuse car j'avoue avoir quelques migraines depuis 2 jours.
    Je cherche un peu partout, mais il ce que je trouve s'applique quasiment toujours à des bases de données type Access et ce n'est pas ce dont j'ai besoin.

    Je remercie par avance ceux qui pourront m'aider.

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut et bienvenu
    Je ne connais pas trop la manipulation ADO a partir de VBA (je commence tout juste a m'y mettre en Delphi ^^), mais il me semble que vu le message retourné, tu dois être en ReadOnly quelque part.
    Si je peux me permettre un conseil, ne te braque surtout pas sur la ligne qui provoque l'erreur, l'erreur est souvent liée a un élément précèdent du code, ici a mon humble avis ta connection est déclarée comme étant en lecture seul ou alors le curseur n'est pas du bon coté (client/server) mais la je m'avance peut être ^^.

    Par contre dans ton code, attention a l'utilisation de sélection, cette variable peut représenter une plage de cellule, si tu veux éviter les problème, je te conseil Activcell qui représente la cellule active (forcement unique si non nothing)

    Bon courage
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour,

    Tu cherches à modifier un enregistrement ? si oui dans ta syntaxe SQL, ce n'est pas SELECT qu'il faut utiliser mais UPDATE table SET WHERE...

    table étant une variable de type string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL="UPDATE [" & table & "] SET  WHERE..."
    TOUTES les variables de types string doivent être écrites de cette manière (il manque des déclarations ) ou sous cette forme
    petite remarque: le nom de la table dans MYSQL esi le m^me que la feuille Excel: normal?

    enfin, il semble que dans ce cas, tu n'as pas besoin d'une requête

    tu écris
    Tu commences pas par le + facile pour des débuts en VBA!!! mais, rassures toi, les crises de nerfs sont garanties avec les syntaxes SQL. Ca faisait 2 ou 3 ans que je n'avais pas bidouilé là-dessus donc...

    edit: tu as de nombreux tutos sur ADO sur ce site comme celui de silkyroad (ADO-excel vers fichiers XL fermés) qui peut te fournir des pistes
    http://silkyroad.developpez.com/VBA/ClasseursFermes/

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Par défaut
    J'ai fait quelque chose d'un peu similaire.

    Pour ma part ce que je fais :

    j'écris sur une feuille Excel le résultat de ma requête SQL.

    Là tu modifies ta base de données, et tu fais ensuite une autre requête SQL sur ta base.

    Avec quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
    Set Cn = New ADODB.Connection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Cn
        .Provider = "MSDASQL"
        .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
            "DBQ=" & Fichier & "; ReadOnly=True;"
        .Open
    End With
    La connexion à la feuille Excel (je la lis sans ouvrir le fichier, donc cette étape n'est pas forcément nécessaire!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
    La requête à exécuter sur mon classeur Excel fermé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Rst = New ADODB.Recordset
        Set Rst = Cnbis.Execute(texte_SQL)
    Je lance la requête avec ma première connexion définie (celle au classeur Excel fermé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Set cnbis = New ADODB.Connection
        cnbis.Open "dsn=mabase"
    La je définis la connexion à ma base de données mysql (si tu n'as pas définis de DSN tu peux, c'est pratique je trouve, sinon tu peux très bien utiliser un connexion string "à la main")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Do Until Rst.EOF = True
    Import_sql = "Insert Into saisie (Champ1, Champ2, Champ3) VALUES ('" & Rst.Fields(0) & "', '" & Rst.Fields(1) & "', '" & Rst.Fields(2) & "'
    "ON DUPLICATE KEY UPDATE Champ1 = '" & Rst.Fields(0) & "', Champ2 = '" & Rst.Fields(1) & "', Champ3 = '" & Rst.Fields(2) & "';"
    cnbis.Execute (Import_sql), True
    Rst.MoveNext
    Loop
    Et pour finir ma requête de mise à jour sur la base ! Qui fait les informations de la requête SQL sur mon classeur Excel, sont envoyées dans ma base de données.

    Si ça peut t'aider...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut
    Michel M > J'avais effectivement pensé à un Update au départ, mais çà ne fonctionnait pas, je suis donc revenue au Select. je retenterai peut-être le Update par la suite.

    Il y avait en effet un problème de position du curseur et de type de verrou, que j'ai réglé avec les lignes suivantes pour chaque requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requete.ActiveConnection = conn
    requete.LockType = 3
    requete.Open Sql
    Roums > Je n'ai pas vraiment compris ce que tu as expliqué: tu parles de requêtes sur classeur fermé mais c'est dans quel but? Pour ma part j'ai besoin d'un classeur ouvert, car c'est en modifiant certaines cellules via excel que je souhaite mettre à jour la base de données sur le serveur.

    C'est vrai que c'est pas le plus facile ce projet, mais j'avais déjà manipulé du VBA sous excel et du SQL (séparément), c'est un bon moyen de voir les liens qu'on peut faire entre les 2.

    En tout cas, merci pour vos réponses et votre aide.
    D'ailleurs, l'un de vous saurait-il comment récupérer les erreurs d'exécution des requêtes sql sur VBA? du genre on ne peut pas modifier une cellule car il y a certaines contraintes d'intégrité, etc... (bien sûr je cherche également)

    Merci

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Par défaut
    Et bien en fait j'ai trouvé ce qu'il me fallait!

    Encore merci à ceux qui ont répondu.

Discussions similaires

  1. Problème excel VBA: mots à défiler dans un userform
    Par Paulopiv dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/05/2012, 17h50
  2. Problème EXCEL VBA
    Par olivierm34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/03/2007, 23h52
  3. Problème concaténation excel/vba
    Par rotterdamt dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 28/11/2005, 17h47
  4. Problème avec open() [Excel VBA]
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/11/2005, 16h21
  5. [Excel - VBA] Problème de suppression de lignes...
    Par beholder2 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/01/2005, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo