Excel, MySQL, VBA et fonction

ricorico94 Messages postés 3 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 18 octobre 2005 - 17 oct. 2005 à 11:05
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 - 18 oct. 2005 à 13:44
Bonjour,

[J'ai en fait posté ce message sur le forum VBA, mais il n'y a pas beaucoup de passage dans cette rubrique, et j'ai donc souhaité le déplacer.. sauf que je n'ai pas trouvé comment éditer/déplacer un message sur ce forum. Si un admin peut suppirmer mon autre message, ce serait sympa pour éviter de dupliquer. Merci beaucoup!]

Je cherche à faire en VBA pour Excel une fonction qui fasse une reherche dans une base de données MySQL et retourne une unique valeur (un peu comme un VLookup de Excel).
J'ai utilisé l'enregistrement d'une macro pour créer une procédure d'attaque de ma base MySQL, mais je ne vois pas comment faire pour transformer cette procédure en fonction, car elle écrit systématiquement la valeur retournée dans une cellule (range défini dans la propriété Destination) et même en retournant le contenu de cette cellule, ma fonction en marche pas (elle ne se met pas à jour systématiquement, par exemple, ou renvoie #value, etc..).
Voici le texte de ma fonction:

Function Macro2(valeur As String)
'
' Macro2
' Macro recorded 13.10.2005 '
With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DATABASE=testamoi;DSN=myodbc;OPTION=0;PORT=0;SERVER=localhost;UID=root", _
Destination:=Range("A1"))
.CommandText = Array( _
"SELECT tabletest_0.F3" & Chr(13) & "" & Chr(10) & "FROM testamoi.tabletest tabletest_0" & Chr(13) & "" & Chr(10) & "WHERE (tabletest_0.F1=" & valeur & ")" _
)
.Name = "Query from myodbc"
.FieldNames = False
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
Macro2 = Range("A1").Value

End Function

Pourriez-vous m'aider ?

Merci beaucoup!
Eric

3 réponses

Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
17 oct. 2005 à 11:47
Je ne vois pas trop ce que tu veux faire.
Ta question, c'est bien de pouvoir retourner le résultat de ta requête (valeur unique si j'ai bien suivi) dans une cellule de ton choix ?

Si c'est bien ça, la solution est toute simple :
Avant l'exécution de ta requête (avant le With ... ), tu rajoutes une variable que tu alimentes avec la destination de ta cellule.

par exemple :
Dim temp as string
temp = "C20"

Et dans le code de ta requête, tu remplaces
Destination:=Range("A1"))
par
Destination:=Range(temp))


Ca te permet comme ça de choisir la cellule où tu veux copier la valeur, en fonction même de critères que tu as fixé avec des IF, etc ...

De la même façon d'ailleurs, tu peux mettre ta requête dans une variable, du style :
Dim requête as string
requête = SELECT tabletest_0.F3" & Chr(13) & "" & Chr(10) & "FROM testamoi.tabletest tabletest_0" & Chr(13) & "" & Chr(10) & "WHERE (tabletest_0.F1=" & valeur & ")"

et tu remplaces :
CommandText = Array( _
"SELECT tabletest_0.F3" & Chr(13) & "" & Chr(10) & "FROM testamoi.tabletest tabletest_0" & Chr(13) & "" & Chr(10) & "WHERE (tabletest_0.F1=" & valeur & ")" _
)
par
CommandText = Array( _
requete )


Ta fonction ressemblerait donc à quelque chose comme ça :

temp = ...
requete = ...

With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DATABASE=testamoi;DSN=myodbc;OPTION=0;PORT=0;SERVER=localhost;UID=root", _
Destination:=Range(temp))
.CommandText = Array( _
requete _
)
.Name = "Query from myodbc"
.FieldNames = False
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With


Si je suis à côté de la plaque ... Désolée :p
Molenn
0
ricorico94 Messages postés 3 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 18 octobre 2005
18 oct. 2005 à 13:31
Bonjour Molenn,

Merci pour ta réponse. Tu a sbien compris ce que je veux faire: renvoyer par ma fonction la valeur cherchée par ma requête et utiliser cette fonction dans une feuille Excel (une cellule dans laquelle j'aurais '=Macro2(A5)' pour faire une recherche sur le contenu de la cellule A5 ).
Le problème, c'est que ça ne marche pas...
Si j'utilise la macro telle qu'enregistrée par Excel, alors ça marche (mais ce n'est pas une fonction: c'est une procédure, qui remplit une info dans une cellule). Mais si je la transform en fonction (même avec tes conseils ci-dessus), je récupère invariablement un #Value dans ma cellule.. ;-(

En mode Debug, le code semble s'arrêter en plein milieu du With (parmi les déclarations de variables).
En fait, si j'écris la requête 'en dur' comme cela: query = "SELECT F2 FROM tabletest WHERE (F1='test1a')" (puis .CommandText = Array(query) ) pour rechercher la valeur test1a dans ma BDD, alors ça me retourne une valeur exacte, mais si j'écris dim valeur as string, puis query = "SELECT F2 FROM tabletest WHERE (F1=" & valeur & ")", en appelant ma fonction avec valeur="test1a", alors ça ne marche plus.
Mais, même si j'écris la rquête en dur, alors si j'appelle 2 fois la fonction dans ma feuille excel, une seule cellule est mise à jour, l'autre retrouve #Value! .
Comprends pas du tout..

Une question (peut-être) : faut-il (et comment ?) nettoyer les connections créées par mon appel de fonction ?

Merci encore de votre aide!
Eric
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
18 oct. 2005 à 13:44
Ton problème se situe dans l'écriture de ta requête, à ce niveau là du code :

dim valeur as string, puis query = "SELECT F2 FROM tabletest WHERE (F1=" & valeur & ")"

Si j'ai bien compreis, ta requête se fait sur un critère de champ Texte.
Ta requête n'est donc pas interprêtée comme il le faut.
Si tu regardes bien (ajoute juste après par exemple un Msgbox Query, tu constateras ce que je veux te dire), la requête que tu écris est :
SELECT F2 FROM tabletest WHERE (F1=valeur)
Ce qui ne fonctionne pas. Ce que tu veux toi, c'est obtenir :
SELECT F2 FROM tabletest WHERE (F1="valeur")

Et pour cela, il faut définir la requête comme suit :
query = "SELECT F2 FROM tabletest WHERE (F1=" & """" & valeur & """" & ")"
(On peut simplifier un tout petit peu l'écrite, mais je préfère toujours mettre & """" pour être sûr de ne pas les rater).

Bon test et tiens moi au courant ^^

Molenn
0
Rejoignez-nous