Insérer une requête SQL dans une textbox

Bonjour je suis en stage et je dois faire un formulaire en VBA sauf que je n'en avait jamais fait avant.
J'ai connecté une base de donnée SQL Server à mon formulaire VBA et je voudrai insérer une requête dans un textbox ici un objectif de production du jour
Voici ma requête SQL : SELECT ObjectifJour FROM Production WHERE DateJour = CAST( GETDATE() AS Date)

Et voici mon code qui contient la connexion à la base de données et la requête :

btnMAJ_Click() 'Clique du bouton MAJ

Dim Connect As Object, requete As String

Set Connect = CreateObject("ADODB.Connection")

With Connect

requete = "SELECT ObjectifJour FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
Connect.Open "Provider = SQLOLEDB;Server=<Nom Serveur>;Database=<Nom Base de données>;Persist Security Into=False;Integrated Security=SSPI;"
.Execute requete
txtObjJour.Value = requete
Connect.Close

End With
Set Connect = Nothing

End Sub

J'ai essayé de mettre ma requête dans une variable (requete1) mais quand j'éxecute mon programme la textbox n'affiche pas le résultat de la requête mais "SELECT ObjectifJour FROM Production..."

Je ne sais pas ou est le problème j'ai peut être mal formulé ma requête mais sur SQL server elle fonctionne donc je ne comprend pas.

Merci d'avance pour votre aide !

Hello,

Oui c'est normal car ta variable :

requete 

est toujours egale à :

"SELECT ObjectifJour FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"

Je n'utilise pas trop les requetes sql dans excel et encore moins afficher le résultat dans une textbox mais pour récupérer un jeu d'enregistrement, il faut faut passer par un recordset il me semble.

comme dans cet exemple :

Sub SQL()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strSQL = "SELECT * FROM [Sheet1$A1:G3]"

rs.Open strSQL, cn

Debug.Print rs.GetString

End Sub

Donc peut-être comme ceci :

btnMAJ_Click() 'Clique du bouton MAJ

Dim Connect As Object, requete As String
Dim rs As ADODB.Recordset
Set Connect = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
With Connect

requete = "SELECT ObjectifJour FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
Connect.Open "Provider = SQLOLEDB;Server=<Nom Serveur>;Database=<Nom Base de données>;Persist Security Into=False;Integrated Security=SSPI;"
.Execute requete

Connect.Close
rs.open requete, Connect
txtObjJour.Value = rs
Connect.Close
End With
Set Connect = Nothing

End Sub

Bonsoir,

Private Sub btnMAJ_Click()
Dim requete As String
With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    .Open "Provider = SQLOLEDB;Server=<Nom Serveur>;Database=<Nom Base de données>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete)
        If Not .EOF Then txtObjJour.Value = .Fields("ObjectifJour")
        .Close
    End With
    .Close
End With
End Sub

Bonjour et merci pour vos réponses j'ai testé les deux propositions. Celle de @Rag02700 ne fonctionne pas elle me met une erreur comme quoi : " Dim rs As ADODB.Recordset" est un type non défini par l'utilisateur, je ne sais pas vraiment ce que ça veut dire.

Pour la proposition de @dysorthographie elle fonctionne ! Mais maintenant j'aimerais exécuté une autre requête pour une autre textbox. J'ai essayé de rajouter ce qui paraissait le plus logique selon moi mais ça me met l'erreur suivante : " Erreur d'exécution 3265, Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé".

Voici mon code :

Dim requete As String
Dim requete2 As String
With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    requete2 = "SELECT NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    .Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete, requete2)

        If Not .EOF Then txtObjJour.Value = .Fields("ObjectifJour") And txtProductionJour.Value = .Fields("NbMachineProduite")
        .Close
    End With
    .Close
End With

Si tu as la réponse ou quelqu'un d'autre ce serait super !

Merci encore pour votre aide.

Bonjour le fil, G_stagiaire

Dim rs As ADODB.Recordset" est un type non défini par l'utilisateur,

C'est ça de vouloir s'improviser développeur

Il fallait cocher la référence

2021 06 18 10h09 26

Ceci dit, je préfère travailler en "Late binding" et utiliser CreateObject("ADODB.Connection")

@+

Re,

Pour la proposition de @dysorthographie elle fonctionne ! Mais maintenant j'aimerais exécuté une autre requête pour une autre textbox. J'ai essayé de rajouter ce qui paraissait le plus logique selon moi mais ça me met l'erreur suivante : " Erreur d'exécution 3265, Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé".

Voici mon code :

Dim requete As String
Dim requete2 As String
With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    requete2 = "SELECT NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    .Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete, requete2)

        If Not .EOF Then txtObjJour.Value = .Fields("ObjectifJour"): txtProductionJour.Value = .Fields("NbMachineProduite")
        .Close
    End With
    .Close
End With

Ouille... youille

Google est ton ami n'oublie pas ça
https://www.google.com/search?q=requête+SQL

Dim requete As String
Dim requete2 As String
With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour, NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    .Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete)

        If Not .EOF Then txtObjJour.Value = .Fields("ObjectifJour") And txtProductionJour.Value = .Fields("NbMachineProduite")
        .Close
    End With
    .Close
End With

@+

Bonjour,

j'ai le sentiment que c'est la même requête !

Private Sub btnMAJ_Click()
Dim requete As String
With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour ,NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    .Open "Provider = SQLOLEDB;Server=<Nom Serveur>;Database=<Nom Base de données>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete)
        If Not .EOF Then 
              txtObjJour.Value   = .Fields("ObjectifJour")
            txtNbMachineProduite.value= .Fields("NbMachineProduite")
.     End if
        .Close
    End With
    .Close
End With
End Sub

Merci de vos réponses j'ai essayé vos 2 propositions mais cela ne fonctionne pas ou alors je fait quelque chose de mal pour la proposition de @dysorthographie ça me met l'erreur suivante : "Objet requis" sur la ligne : txtNbMachineProduite.Value = .Fields("NbMachineProduite"). Je met mon code pour voir si j'ai pas fait une erreur :

Dim requete As String
With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour ,NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    .Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete)
        If Not .EOF Then
              txtObjJour.Value = .Fields("ObjectifJour")
            txtNbMachineProduite.Value = .Fields("NbMachineProduite")
        End If
        .Close
    End With
    .Close
End With

Et pour la proposition de @BrunoM45 ça ne fonctionne pas non plus mais ça ne me met pas de message d'erreur je met le code aussi pour être sûr :

Dim requete As String
Dim requete2 As String
With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour, NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    .Open "Provider = SQLOLEDB;Server=<NomServer>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete)

        If Not .EOF Then txtObjJour.Value = .Fields("ObjectifJour") And txtProductionJour.Value = .Fields("NbMachineProduite")
        .Close
    End With
    .Close
End With

Je tiens à préciser que mes requêtes ont été testé sur sql server et elles fonctionnent.

Je ne trouve pas l'erreur si vous savez n'hésitez pas, merci.

Perso, j'ai laissé une grosse bétise

Il fallait remplacer le "And" par ":", tu auras donc la même erreur

As-tu bien un champ "NbMachineProduite" dans ta base ?

@+

@BrunoM45 Remplacé le "and" par ":" ? Je ne connais pas la signification de ":" en VBA et oui j'ai bien une colonne "NbMachineProduite" dans ma base

Re,

Les ":" servent à la séparation d'instruction

Attention, il faut que ce champ soit dans la table "Production"

Ok d'accord et oui le champ "NbMachineProduite" et bien dans ma table Production (je n'ai qu' une seule table pour le moment)

Donnzs nous les noms de tes TextBox et à quels champs ils correspondent

Salut à tous,

Les requêtes peuvent je pense renvoyer plusieurs éléments non ? il faut peut-être le gérer.

Ok re,
merci pour vos messages la solution de @BrunoM45 m'a bien aidé et a fonctionnée mais je n'arrive pas à insérer une nouvelle requête qui cette fois-ci n'est pas la même que les deux précédentes voici mon code sans la requête que je veux insérer (qui fonctionne) :

Dim requete As String

With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour, NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    requete2 = "SELECT SUM(NbMachineProduite) AS 'Total des machines produites ce mois-ci' FROM Production WHERE DateJour >= DateAdd(Month, DateDiff(Month, 0, GETDATE()) - 1, 0) And DateJour <= DateAdd(Day, -1, DateAdd(Month, DateDiff(Month, 0, GETDATE()) + 1, 0))"
    .Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete)

        If Not .EOF Then txtObjJour.Value = .Fields("ObjectifJour"): txtProductionJour.Value = .Fields("NbMachineProduite")

        .Close
    End With
    .Close
End With

Et voici le code quand j'essaye d'ajouter une nouvelle requête (qui ne fonctionne pas, erreur 438 Propriété ou méthode non gérée par cet objet ) :

Dim requete As String
Dim requete2 As String
With CreateObject("ADODB.Connection")
    requete = "SELECT ObjectifJour, NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
    requete2 = "SELECT SUM(NbMachineProduite) AS 'Total des machines produites ce mois-ci' FROM Production WHERE DateJour >= DateAdd(Month, DateDiff(Month, 0, GETDATE()) - 1, 0) And DateJour <= DateAdd(Day, -1, DateAdd(Month, DateDiff(Month, 0, GETDATE()) + 1, 0))"
    .Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
    With .Execute(requete)
        If Not .EOF Then txtObjJour.Value = .Fields("ObjectifJour"): txtProductionJour.Value = .Fields("NbMachineProduite")

        .Execute (requete2)
        If Not .EOF Then txtTotalProduction.Value = .Fields("NbMachineProduite")
        .Close
    End With
    .Close
End With

J'ai vraiment du mal avec ce langage si vous s'avez n'hésiter pas, merci d'avance.

Bonjour,

attention quand tu nommes tes champs!

 SUM(NbMachineProduite) AS [Total des machines produites ce mois-ci]
Dim requete As String
Dim requete2 As String

requete = "SELECT ObjectifJour, NbMachineProduite FROM Production WHERE DateJour = CAST( GETDATE() AS Date)"
requete2 = "SELECT SUM(NbMachineProduite) AS [Total des machines produites ce mois-ci] FROM Production WHERE DateJour >= DateAdd(Month, DateDiff(Month, 0, GETDATE()) - 1, 0) And DateJour <= DateAdd(Day, -1, DateAdd(Month, DateDiff(Month, 0, GETDATE()) + 1, 0))"

With CreateObject("ADODB.Connection")
   .Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
'************************************************************************************************************************
'requete
    With .Execute(requete)
        If Not .EOF Then txtObjJour.Value = .Fields("ObjectifJour"): txtProductionJour.Value = .Fields("NbMachineProduite")
        .Close
    End With
   .Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"
'************************************************************************************************************************
'requete2
     With .Execute(requete2)
        If Not .EOF Then txtTotalProduction.Value = .Fields("Total des machines produites ce mois-ci")
      .Close
    End With
    .Close
End With

Bonjour merci pour ton message la ligne : ".Open "Provider = SQLOLEDB;Server=<NomServeur>;Database=<NomBD>;Persist Security Into=False;Integrated Security=SSPI;"" (Juste avant la requete2, créer une erreur comme quoi l'objet est déjà ouvert ) J'ai donc enlever cette ligne et ça a marché. Merci beaucoup

Si il est possible de synthétiser ce code je prend vos conseils !

oui désolé un copier collé intempestif bien sure qu'il faut supprimer le deuxième .open

Rechercher des sujets similaires à "inserer requete sql textbox"