Requete SQL SELECT en VBA

satfilter

XLDnaute Nouveau
Bonjour,
je voudrai envoyer une requete en SQL de type SELECT avec VBA.
J'ai créé dans un classeur connecté a la BDD un UserForm, code:
Code:
Private Sub CommandButton1_Click()
Dim NumCde As String
Dim Requete As String
NumCde = TextBox1.Value
Requete = "select ((T2.'GEST' || TO_CHAR(TRUNC(T2.'NU_CDE' ) )) || TO_CHAR(TRUNC(T2.'LIG_CDE' ) )) , T2.'MT_ENGAGE' - T3.'MT_LIQ' , T3.'MT_LIQ' , T2.'MT_ENGAGE' , T1.'NU_LIQ' , T2.'QTE_CDEE' , T2.'LIBELLE_LIGNE_CDE' , T1.'LIG_CDE' , T1.'NU_CDE' , T1.'GEST' , T2.'QTE_RECUE' from ('LIG_COMMANDE' T2 LEFT OUTER JOIN ('RECEP_CDE' T3 LEFT OUTER JOIN 'MANDATS_DE_COMMANDES' T1 on T3.'EH'=T1.'EH' and T3.'GEST'=T1.'GEST' and T3.'NU_CDE'=T1.'NU_CDE' and T3.'LIG_CDE'=T1.'LIG_CDE' and T3.'NU_RECEP'=T1.'NU_RECEP' and T3.'NUM_LIQ'=T1.'NU_LIQ') on T2.'EH'=T3.'EH' and T2.'GEST'=T3.'GEST' and T2.'NU_CDE'=T3.'NU_CDE' and T2.'LIG_CDE'=T3.'LIG_CDE') where T1.'NU_CDE'=" & NumCde _
& " order by 'LIG_CDE' asc"
'MsgBox (Requete)
End Sub
Comment arriver a envoyer la requete et a récupérer les résultats dans la feuille1 du classeur?

Mecri pour votre aide
A+
 

satfilter

XLDnaute Nouveau
Re : Requete SQL SELECT en VBA

re
J'ai essayé avec l'enregistreur de macro mais ca ne marche pas.
Je sais pas si le lien que vous m'avez donné peut m'aider.
Je cherche a acceder a une base sur un serveur oracle.

Voila le code qui marche pas :
Code:
Private Sub CommandButton1_Click()
Dim NumCde As String
Dim Requete As String
NumCde = TextBox1.Value
Requete = "select ((T2.'GEST' || TO_CHAR(TRUNC(T2.'NU_CDE' ) )) || TO_CHAR(TRUNC(T2.'LIG_CDE' ) )) , T2.'MT_ENGAGE' - T3.'MT_LIQ' , T3.'MT_LIQ' , T2.'MT_ENGAGE' , T1.'NU_LIQ' , T2.'QTE_CDEE' , T2.'LIBELLE_LIGNE_CDE' , T1.'LIG_CDE' , T1.'NU_CDE' , T1.'GEST' , T2.'QTE_RECUE' from ('LIG_COMMANDE' T2 LEFT OUTER JOIN ('RECEP_CDE' T3 LEFT OUTER JOIN 'MANDATS_DE_COMMANDES' T1 on T3.'EH'=T1.'EH' and T3.'GEST'=T1.'GEST' and T3.'NU_CDE'=T1.'NU_CDE' and T3.'LIG_CDE'=T1.'LIG_CDE' and T3.'NU_RECEP'=T1.'NU_RECEP' and T3.'NUM_LIQ'=T1.'NU_LIQ') on T2.'EH'=T3.'EH' and T2.'GEST'=T3.'GEST' and T2.'NU_CDE'=T3.'NU_CDE' and T2.'LIG_CDE'=T3.'LIG_CDE') where T1.'NU_CDE'=" & NumCde _
& " order by 'LIG_CDE' asc"
    
    With ThisWorkbook.Sheets(1)
        .Cells.ClearContents
    End With


    With ActiveWorkbook.Connections("IN01 (Par défaut) COMMANDE").OLEDBConnection
        .BackgroundQuery = True
        .CommandText = Array(Requete)
        .CommandType = xlCmdSql
        .Connection = "OLEDB;Provider=MSDAORA.1;User ID=MAG2;Data Source=IN01"
        .RefreshOnFileOpen = False
        .SavePassword = False
        .SourceConnectionFile = ""
        .SourceDataFile = ""
        .ServerCredentialsMethod = xlCredentialsMethodIntegrated
        .AlwaysUseConnectionFile = False
        .ServerFillColor = False
        .ServerFontStyle = False
        .ServerNumberFormat = False
        .ServerTextColor = False
    End With

    ActiveWorkbook.Connections("IN01 (Par défaut) COMMANDE").Refresh
End Sub

erreur incompatibilité de type sur la ligne
.CommandText = Array(Requete)

Merci pour votre aide
A+
 
Dernière édition:

Theze

XLDnaute Occasionnel
Re : Requete SQL SELECT en VBA

Bonjour,

Un tout petit exemple avec une requête assez simple.
Comme ta requête est assez complexe, je pense que pour commencer, tu devrais simplifier au max et ensuite, rajouter au fur et à mesure. Adapte :
Code:
Private Sub ConnecterBase(ConnectBD As ADODB.Connection, _
                          CheminBD As String, _
                          Optional Rs)
              
    Set ConnectBD = New ADODB.Connection
    
    If Not IsMissing(Rs) Then
    
        Set Rs = New ADODB.Recordset
        
    End If
    
    With ConnectBD
    
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        
        .ConnectionString = CheminBD
        
        .Open
        
    End With
    
End Sub

Private Sub Requete()

    Dim ConnectBD As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim ChaineSQL As String
    
    ChaineSQL = "SELECT Champ1, Champ2, Champ3 "
    ChaineSQL = ChaineSQL & "FROM Table_Visee "
    ChaineSQL = ChaineSQL & "WHERE Champ2 > 3500 "
    ChaineSQL = ChaineSQL & "OR Champ3 < 60 "
    ChaineSQL = ChaineSQL & "ORDER BY Champ1"
    
    ConnecterBase ConnectBD, "C:\Dossier\SousDossier\MaBase.mdb", Rs
    
    With Rs
    
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        .Open ChaineSQL, ConnectBD
        
        Do Until .EOF
        
            Debug.Print .Fields("Champ1") _
                & ", " & .Fields("Champ2") _
                & ", " & .Fields("Champ3")
            .MoveNext
            
        Loop
        
    End With
    
    ConnectBD.Close
    
    Set ConnectBD = Nothing
    Set Rs = Nothing

End Sub
Il te faut cocher la référence "ActiveX Data Objects x.x Library, où x.x est ta version installée.

Hervé.
 

satfilter

XLDnaute Nouveau
Re : Requete SQL SELECT en VBA

bonjour,
merci pour votre réponse
le probleme c'est que je n'ai pas de fichier mdb, je tape directement sur un serveur oracle.
En fait, le but c'est d'avoir un UserForm, ou l'utilisateur tapera un numéro de commande.
Je souhaite récupérer ce numéro dans une variable dans la requete qui interroge la BDD puis afficher le résultat en feuille 1

J'avoue que je comprends pas trop la logique ni le cheminement de tout ça.

A+
 
Dernière édition:

satfilter

XLDnaute Nouveau
Re : Requete SQL SELECT en VBA

Code:
Private Sub CommandButton1_Click()
Dim NumCde As String
Dim Requete As String
NumCde = TextBox1.Value
Requete = "select ((T2.'GEST' || TO_CHAR(TRUNC(T2.'NU_CDE' ))) || TO_CHAR(TRUNC(T2.'LIG_CDE'))), T2.'MT_ENGAGE' - T3.'MT_LIQ' , T3.'MT_LIQ' , T2.'MT_ENGAGE' , T1.'NU_LIQ' , T2.'QTE_CDEE' , T2.'LIBELLE_LIGNE_CDE' , T1.'LIG_CDE' , T1.'NU_CDE' , T1.'GEST' , T2.'QTE_RECUE' from ('LIG_COMMANDE' T2 LEFT OUTER JOIN ('RECEP_CDE' T3 LEFT OUTER JOIN 'MANDATS_DE_COMMANDES' T1 on T3.'EH'=T1.'EH' and T3.'GEST'=T1.'GEST' and T3.'NU_CDE'=T1.'NU_CDE' and T3.'LIG_CDE'=T1.'LIG_CDE' and T3.'NU_RECEP'=T1.'NU_RECEP' and T3.'NUM_LIQ'=T1.'NU_LIQ') on T2.'EH'=T3.'EH' and T2.'GEST'=T3.'GEST' and T2.'NU_CDE'=T3.'NU_CDE' and T2.'LIG_CDE'=T3.'LIG_CDE') where T1.'NU_CDE'=" & NumCde _
& " order by 'LIG_CDE' asc"
    With ActiveWorkbook.Connections("IN01 (Par défaut) COMMANDE").OLEDBConnection
        .BackgroundQuery = True
        .CommandText = Requete
        .CommandType = xlCmdSql
        .Connection = "OLEDB;Provider=MSDAORA.1;User ID=MAG2;Data Source=IN01"
        .RefreshOnFileOpen = False
        .SavePassword = True
        .SourceConnectionFile = ""
        .SourceDataFile = ""
        .ServerCredentialsMethod = xlCredentialsMethodIntegrated
        .Refresh
    End With
End Sub

Ce code compile correctement mais quand je tape le numéro de commande et que je clique le CommandButton1, j'ai l'erreur :
impossible d'actualiser la plage de donnée suivante : IN01 (Par défaut) COMMANDE Voulez vous continuer l'actualisation, puis rien ne se passe.
Je comprends meme pas pourquoi cela ne fonctionne pas.
 

satfilter

XLDnaute Nouveau
Re : Requete SQL SELECT en VBA

Re
j'ai un fichier de connection en odc, avec ce code il me dit que le format de base de donnée est inconnu "rrrrrrrrrrrrrr"


En feuille 1:

Code:
Sub ConnecterBase(ConnectBD As ADODB.Connection, _
                          CheminBD As String, _
                          Optional Rs)
              
    Set ConnectBD = New ADODB.Connection
    
    If Not IsMissing(Rs) Then
    
        Set Rs = New ADODB.Recordset
        
    End If
    
    With ConnectBD
    
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        
        .ConnectionString = CheminBD
        
        .Open
        
    End With
    
End Sub

Sub Requete(Req As String)

    Dim ConnectBD As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim ChaineSQL As String
    
    ChaineSQL = "select ((T2.'GEST' || TO_CHAR(TRUNC(T2.'NU_CDE' ))) || TO_CHAR(TRUNC(T2.'LIG_CDE'))), T2.'MT_ENGAGE' - T3.'MT_LIQ' , T3.'MT_LIQ' , T2.'MT_ENGAGE' , T1.'NU_LIQ' , T2.'QTE_CDEE' , T2.'LIBELLE_LIGNE_CDE' , T1.'LIG_CDE' , T1.'NU_CDE' , T1.'GEST' , T2.'QTE_RECUE' from ('LIG_COMMANDE' T2 LEFT OUTER JOIN ('RECEP_CDE' T3 LEFT OUTER JOIN 'MANDATS_DE_COMMANDES' T1 on T3.'EH'=T1.'EH' and T3.'GEST'=T1.'GEST' and T3.'NU_CDE'=T1.'NU_CDE' and T3.'LIG_CDE'=T1.'LIG_CDE' and T3.'NU_RECEP'=T1.'NU_RECEP' and T3.'NUM_LIQ'=T1.'NU_LIQ') on T2.'EH'=T3.'EH' and T2.'GEST'=T3.'GEST' and T2.'NU_CDE'=T3.'NU_CDE' and T2.'LIG_CDE'=T3.'LIG_CDE') where T1.'NU_CDE'=" & Req & " order by 'LIG_CDE' asc"
    ConnecterBase ConnectBD, "\\CLR1DONNEES\0160xxxx\0160*****\My Documents\Mes sources de données\IN01 (Par défaut) COMMANDE.odc", Rs
    
    With Rs
    
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        .Open ChaineSQL, ConnectBD
        
        Do Until .EOF
        
            Debug.Print .Fields("Champ1") _
                & ", " & .Fields("Champ2") _
                & ", " & .Fields("Champ3")
            .MoveNext
            
        Loop
        
    End With
    
    ConnectBD.Close
    
    Set ConnectBD = Nothing
    Set Rs = Nothing

End Sub

mon user form :

Code:
Private Sub CommandButton1_Click()
Dim NumCde As String
NumCde = TextBox1.Value
Worksheets(1).Requete (NumCde)
End Sub

J'ai vraiment du mal


HELP !!!!
 

satfilter

XLDnaute Nouveau
Re : Requete SQL SELECT en VBA

Je met en PJ le fichier.

Les fichiers de connection que me créé excel sont des .odc :confused:
je précise que j'interroge un serveur oracle.

le but serai de récupérer le String du user form quand on clique ok et de l'intégrer dans la requete sql.
Ensuite, afficher le résultat de cette requete en feuille 1.

Merci pour votre aide
A+
 

Pièces jointes

  • satfilter_Sql.xlsm
    95.6 KB · Affichages: 67

Statistiques des forums

Discussions
311 705
Messages
2 081 725
Membres
101 805
dernier inscrit
abrigy