IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupérer le resultat d'une requête SQL dans un variant (VBA)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Asset Management
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Asset Management
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut Récupérer le resultat d'une requête SQL dans un variant (VBA)
    Bonjour à tous,

    Je souhaiterais rentrer le résultat d'une requête SQL dans un variant VBA.
    Je sais copier le résultat directement dans une feuille excel en indiquant la cellule de base (celle qui sera en haut à gauche) via cells.copyfromrecordset.
    mais aucune idée pour le mettre directement dans un variant vba (sans passer par l'étape feuille excel).

    Voici le code, les XXX sont rentrés avec les bons paramètres.
    c'est la partie en gras qui ne fonctionne pas, rs n'étant pas un tableau il n'a pas de "taille".
    Ce que je voudrais c'est rentrer le résultat de la requête dans V. Ensuite je vais faire des calculs et sortir le résultat de ma fonction.

    Merci!

    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
    Function OSSql(a As Variant) As Variant
    Dim dbConnection As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim dbParameters As String
    Dim query As String
    Dim v As Variant
    
    dbParameters = "Provider=XXX;Data Source=XXX;" & _
                "Initial Catalog=XXX;" & _
                "Integrated Security=SSPI;"
        
        Set dbConnection = New ADODB.Connection
        Set rs = New ADODB.Recordset
        
        dbConnection.Open dbParameters
        
        query = "SELECT XXX FROM XXX"
            
        Set rs = dbConnection.Execute(query)
    
        Redim(C(ubound(rs))
        
        V.CopyFromRecordset rs
        
        
    End Function

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je pense que tu cherches la méthode "getrows" ?

    extrait d'une fonction perso, requeteSQL est de type Variant, Requet est de type Object

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Set Requete = Source.Execute(xSQL)
     
        With Requete
            If .EOF Then
                Exit Function
            Else
                requeteSQL = Application.Transpose(.getrows)
            End If
     
            .Close
        End With
    ensuite, la partie "procédure appelante" : C'est Tabl (type Variant) qui reçoit le résultat
    Bon, ici je l'injecte ensuite sur une feuille excel, mais ce n'est qu'un détail

    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
    Sub DesTestsSQL()
    Dim LaRequete As String
    Dim Tabl As Variant
     
    OuvertureConnexion
     
    ActiveSheet.Cells.Delete
    LaRequete = "SELECT FORMAT(DATE, 'yyyy-mm-dd') AS DATE_ACTIVITE,AGENT,SUM(QUANTITE) AS PRODUCTIVITE " & _
                "FROM [" & LaFeuille & "$] " & _
                "GROUP BY DATE,AGENT " & _
                "ORDER BY DATE,AGENT"
    Tabl = requeteSQL(LeFichier, LaRequete)
     
    If Not IsArray(Tabl) Then
        MsgBox "aucun résultat"
    Else
        Cells(2, 1).Resize(UBound(Tabl, 1), UBound(Tabl, 2)).Value = Tabl
    End If
     
    FermetureConnexion
     
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Asset Management
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Asset Management
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Bonjour Joe,

    Merci pour ton aide, le début fonctionne bien! j'arrive ainsi à récupérer la taille ainsi que le premier champ de l'équivalent de ton requeteSQl chez moi.
    En revanche je ne peux pas passer par une feuille excel pour "populer" mon tableau car je suis dans une fonction et non une procédure.

    Il faut donc que j'arrive à remplir l'équivalent de ton "tabl" avec les résultats de la requête.
    Et là je ne sais pas trop comment faire.

    Voici mon code actuel, avec l'endroit où (j'imagine) ça coince en gras.
    Pour le moment c'est un tableau à une colonne, l'idée ensuite sera de pvr en remplir à n col.


    Merci d'avance pour votre aide

    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
    Function OSSql(a As Variant) As Variant
    Dim dbConnection As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim dbParameters As String
    Dim query As String
    Dim v As Variant
    Dim tabl() As Variant
    Dim i As Integer
    
    
    
    dbParameters = "Provider=XX;Data Source=XX;" & _
                "Initial Catalog=XX;" & _
                "Integrated Security=SSPI;"
        
        Set dbConnection = New ADODB.Connection
        Set rs = New ADODB.Recordset
        
        dbConnection.Open dbParameters
        
        query = "SELECT XX FROM XX"
            
        Set rs = dbConnection.Execute(query)
        
        With rs
            If .EOF Then
                Exit Function
            Else
            v = Application.Transpose(.GetRows)
            End If
            .Close
        End With
        
        ReDim tabl(UBound(v))
        For i = LBound(v) To UBound(v)
            tabl(i) = v(i).Value
        Next i
         
    OSSql = tabl(3)
    
    End Function




    E/ NVM, en fait je peux travailler directement sur V j'avais simplement oublié qu'il fallait préciser v(X,1) pour avoir v(x)...
    Encore merci Joe pour ton aide précieuse!

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    mais ......... ta variable V est :

    - déjà un Array : pourquoi vouloir remplir un autre tableau avec ton tableau ? V n'est pas un array UNIQUEMENT si tu n'avais aucun résultat (d'où le test .EOF pour vérifier si le retour de la requête est vide). V est dans ce cas un variant sans aucun affectation de valeur .. et peut donc être n'importe quoi.

    - un array à deux dimensions : tu dois impérativement indiquer la dimension dans tes boucles et manipulations, contrairement à un array unidimensionnel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Debug.Print V(1,1) ' Première ligne, première colonne de ton resultat
    ' en partant du principe que tu es en Base 1
    Je suis assez surpris de la façon dont tu as construit ta fonction : elle contient en dur ta requête, et elle ne renvoit qu'un seul élément (qui semble être un string) via un retour de type variant (dangereux du coup).

    Et de plus, ta fonction gérant elle-même l'identification d'un élément pour le retourner à la procédure appelante ... si tu n'as aucun résultat ta fonction ne retourne rien, il est donc primordiale de laisser ta fonction faire la basse besogne (récupération) et de laisser ta procédure appelante analyser et gérer ce qu'on lui retourne.

    Je te conseille vraiment :

    - de laisser cette fonction uniquement réaliser la requête : tu lui envoie les paramètres nécessaires
    - la fonction te renvoi un variant représentant le .getrows (s'il y a des résultat)
    - la procédure appelante stocke ça dans un tableau qu'ensuite tu manipules

    Si vraiment ton besoin primaire est de ne retourner qu'un seul résultat, alors :

    - tu peux ajouter un paramètre à ta fonction qui te renverra le bon élément
    - tu affines ta requête SQL pour filtrer en amont


    Clairement, la logique de l'exemple que je t'ai montré semble correspondre à ton besoin, mais je te laisse décrire plus précisément ce que tu fais, et pourquoi tu voulais juste la troisième ligne de résultat

  5. #5
    Membre averti
    Homme Profil pro
    Asset Management
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Asset Management
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Hello! Merci pour ta réponse

    Oui j'avais oublié de préciser les 2 dim... du coup je pensais qu'il fallait passer par une étape supplémentaire.

    Sinon globalement pour l'utilité de la fonction, celle là n'en a aucune évidement je voulais juste comprendre le mécanisme pour pouvoir ensuite l'adapter à mes besoins. L'idée c'est que les paramètres de la fonctions changent la requête et que je puisse faire des calculs sur mon variant pour ensuite sortir un résultat.

    je ne voulais pas spécialement sortir la v(3), c'était un simple test pour vérifier si ça fonctionnait

    j'ai l'impression que j'ai tout ce qu'il me faut maintenant pour avancer.
    encore merci

  6. #6
    Membre averti
    Homme Profil pro
    Asset Management
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Asset Management
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Par défaut
    Bon j'ai réussit à faire tout ce que je voulais sur des requêtes qui me renvoient qu'une seule colonne.
    Quid des requêtes qui en renvoient plusieurs?
    on peut rentrer le résultat de la colonne 1 dans un array, de la colonne 2 dans un autre etc?

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/09/2010, 14h15
  2. Réponses: 5
    Dernier message: 26/02/2008, 12h45
  3. Récupérer les valeurs d'une requête SQL dans un champs html SELECT
    Par tamiii dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/11/2007, 13h27
  4. [SQL-VBA] récupérer le résultat d'une requète SQL dans un fichier txt
    Par djidanestribbal dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/02/2007, 15h25
  5. récupérer le résultat d'une requête sql dans un edit
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/07/2005, 14h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo