Bonjour,
comme j'ai (très) souvent cette requête à faire pour récupérer l'id_produit dans ma base:
select products_id from products where products_model="ma_ref";
Je souhaite me créer une petite function de ce type dans personal.xlsm
=model_to_id(la_cellule) ou ma_ref est dans "la_cellule"
Je bute sur la méthode pour récupérer le recordset (qui sera toujours unique) et le mettre en résultat.
Une idée.
VB:
Function model_to_id(la_cellule1)
Dim Password As String
Dim SQLStr As String
Dim Server_Name As String
Dim User_ID As String
Dim Database_Name As String
Dim table_name As String
Set Rs = CreateObject("ADODB.Recordset")
Server_Name = "mon_serveur"
Database_Name = "ma_base"
User_ID = "mon_utilisateur"
Password = "monmotdepasse"
Set cn = CreateObject("ADODB.Connection")
cn.Open "Driver={MySQL ODBC 3.51 Driver};Server=" & _
Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"
SQLStr = "select products_id from products where products_model='" & la_cellule1 & "'"
Rs.Open SQLStr, cn, adOpenStatic
'je colle le resultat dans la bonne cellule
model_to_id = ????
End Function
Si vous voulez tester ce qui cloche, utilisez votre fonction dans la fenêtre d'exécution (CTRL+G) en l'appelant comme ci-dessous (point d'interrogation inclus) et avant de valider, insérez un point d' arrêt au début de votre fonction pour pouvoir la dérouler ensuite en pas à pas par F8. Affichez également la fenêtre variables locales si vous avez choisit le modèle avec variables.
moi je suis en MySQL ODBC 8.0, mais voila ce qui fonctionne chez moi!
VB:
Public Const PassWord = "xxxx", Server = "localhost", User = "root", DataBase = "toto", Port = 3306
Public Const Connexion = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=" & Server & ";Port=" & Port & ";Database=" & DataBase & ";User=" & User & ";Password=" & PassWord & ";"
Function model_to_id(la_cellule1 As String) As Integer
With CreateObject("ADODB.connection")
.Open Connexion
With .Execute("select products_id from products where products_model='" & la_cellule1 & "'")
If Not .EOF Then model_to_id = .Fields(0)
.Close
End With
.Close
End With
End Function
Sub test()
model_to_id "toto"
End Sub
non puisque products_model est un txt, il doit etre entre quote ou double quote.
En règle générale, je termine tjrs mes requêtes par un ; mais d'expérience que ce soit en en php ou vba cela n'a que rarement d'impact.
Si vous voulez tester ce qui cloche, utilisez votre fonction dans la fenêtre d'exécution (CTRL+G) en l'appelant comme ci-dessous (point d'interrogation inclus) et avant de valider, insérez un point d' arrêt au début de votre fonction pour pouvoir la dérouler ensuite en pas à pas par F8. Affichez également la fenêtre variables locales si vous avez choisit le modèle avec variables.
Vous aurez ainsi accès au message d'erreur, que vous ne pouvez pas avoir en l'appelant d'une cellule.
Cordialement
Ben, c'est normal, vous appelez un procédure (sub), pas une fonction (function) !
Une sub ne retourne pas de valeur, une fonction oui
Il vous faut transformer votre Sub en fonction :
VB:
Function model_to_id()
Dim Password As String
Dim SQLStr As String
Dim Server_Name As String
Dim User_ID As String
Dim Database_Name As String
Dim table_name As String
Set RS = CreateObject("ADODB.Recordset")
Server_Name = r"
Database_Name = ""
User_ID = ""
Password = ""
Set Cn = CreateObject("ADODB.Connection")
Cn.Open "Driver={MySQL ODBC 3.51 Driver};Server=" & _
Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"
SQLStr = "select products_id from products where products_model='" & Range("B16") & "'"
MsgBox SQLStr
RS.Open SQLStr, Cn, adOpenStatic
modele_to_id = RS.Fields(0)
End Sub
Ben, c'est normal, vous appelez un procédure (sub), pas une fonction (function) !
Une sub ne retourne pas de valeur, une fonction oui
Il vous faut transformer votre Sub en fonction :
VB:
Function model_to_id()
Dim Password As String
Dim SQLStr As String
Dim Server_Name As String
Dim User_ID As String
Dim Database_Name As String
Dim table_name As String
Set RS = CreateObject("ADODB.Recordset")
Server_Name = r"
Database_Name = ""
User_ID = ""
Password = ""
Set Cn = CreateObject("ADODB.Connection")
Cn.Open "Driver={MySQL ODBC 3.51 Driver};Server=" & _
Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"
SQLStr = "select products_id from products where products_model='" & Range("B16") & "'"
MsgBox SQLStr
RS.Open SQLStr, Cn, adOpenStatic
modele_to_id = RS.Fields(0)
End Sub
Function model_to_id(la_cellule1 As String) As Integer
Dim Password As String
Dim SQLStr As String
Dim Server_Name As String
Dim User_ID As String
Dim Database_Name As String
Dim table_name As String
Set Rs = CreateObject("ADODB.Recordset")
Server_Name = "r"
Database_Name = ""
User_ID = ""
Password = ""
Set Cn = CreateObject("ADODB.Connection")
Cn.Open "Driver={MySQL ODBC 3.51 Driver};Server=" & _
Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"
SQLStr = "select products_id from products where products_model='" & la_cellule1 & "'"
MsgBox SQLStr
Rs.Open SQLStr, Cn, adOpenStatic
If Not Rs.EOF Then model_to_id = Rs("products_id")
End Function
Bonjour à tous,
je progresse mais il me reste un souci.
Je n'ai plus le souci de nom de fonction (quel idiot !)
la requête est bien exécutée.
elle renvoie bien un résultat.
si je fais un msgbox sur Rs("products_id"), la valeur affichée est correcte.
en revanche, le résultat dans la cellule est 0.
et si je m'amuse à faire ceci
le_resultat = 10
If Not Rs.EOF Then model_to_id = le_resultat
Bonjour
je sais pas mais si tu tape avant le rs(EOF) il est évident que tu aura q'une partie du recordset
si je me trompe pas on pourrait traduire EOF par "jusqu'a la fin" ou "en entier"