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:
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:
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
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.
Partager