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 :

Creation d'un tableau VBA à partir de l'instruction CopyFromRecordset


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut Creation d'un tableau VBA à partir de l'instruction CopyFromRecordset
    Chéres amies, chers amis

    J'utilise ADO, et une requête SQL pour récupérer des données dans un classeur fermé.

    Pour l'instant la requete s'affiche sur une feuille de calcul:

    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
    Dim Source_1 As ADODB.Connection
        Dim Requete As ADODB.Recordset
        Dim Fichier_1, xSQL As String
        Dim i As Long
        xSQL = "requete ..."
     
        Set Source_1 = New ADODB.Connection
        Source_1.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier_1 & ";Extended Properties=""Excel 12.0;" & "HDR=YES;IMEX=1;"""
     
        Set Requete = New ADODB.Recordset
        Set Requete = Source_1.Execute(xSQL)
     
        For i = 0 To Requete.Fields.Count - 1
            Cells(1, i + 1) = Requete.Fields(i).Name
        Next
     
        Feuil3.Range("A2").CopyFromRecordset Requete
     
        Source_1.Close
     
        Set Source_1 = Nothing
        Set Requete = Nothing
    Cependant, j'aurais besoin de plutot remplir un tableau dont la taille s'ajusterait automatiquement.

    Auriez vous une idée SVP?

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Regarde du coté de GetRows.

    Philippe

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Si je comprends bien et que tu as au moins une version 2007 et plus, regarde du côté des Données Externes, onglet Données. Tu pourras lier tes données à ce tableau et faire un RefreshAll pour le mettre à jour quand nécessaire.

    Il te faudra créer une connexion selon le besoin.

  4. #4
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Je ne comprend pas bien cette solution, c'est en VBA?

    J'ai utilisé getrows ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Requete As ADODB.Recordset
    ...
    Dim Tab_Query() As Variant
    ...
    Tab_Query = Requete.GetRows(-1)
    j'ai la première colonne qui est est bien dans le tableau puis toutes autres valeurs sont NULL.

    De plus, la premières ligne avec le nom des colonnes sont manquantes.
    Alors lorsque je fais apparaître directement sur une feuilles le résultat avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil3.Range("A2").CopyFromRecordset Requete
    toutes les valeurs sont affiché.
    Auriez vous une idée SVP?

    Merci
    NB: pour afficher les nom des colonnes sur la feuille j'utilise ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 0 To Requete.Fields.Count - 1
            Cells(1, i + 1) = Requete.Fields(i).Name
        Next

  5. #5
    Invité
    Invité(e)
    Par défaut
    Pas sur mais généralement il faut transposer les données issues de la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tab_Query = Application.WorksheetFunction.Transpose(Requete.GetRows)

  6. #6
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Merci

    Cela ne fonctionne pas j'ai une erreur d'incompatibilité de type.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Il me semble que le tableau doit être de type 'Variant'.

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonsoir,


    Exemple de récupération d'un champ dans un tableau a() avec GetRows


    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
     
    Sub RecupChampGetRows()
      ' Microsoft ActiveX DataObject doit être coché
      Set cnn = New ADODB.Connection
      répertoire = ThisWorkbook.Path & "\"
      fichier = "AdoSource.xls"
      cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & répertoire & fichier ' Fichier .xls
      Set rs = cnn.Execute("[A1:C100]")
      a = rs.GetRows                                     (tableau a(,)
      [A2].Resize(3, UBound(a) + 1) = Application.Transpose(a)
      rs.Close
      cnn.Close
      Set rs = Nothing
      Set cnn = Nothing
    End Sub
    Jacques Boisgontier

  9. #9
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Merci

    J'ai toujours le problème d'incompatibilité de type

    Autant pour moi, j'ai mal regarder mon espion en fait c'est la composition du tableau, il ya beaucoup de case vide, d'ou les valeurs NULL, en fouillant un peu plus loing que le bout de mon nez j'ai pu constater que toutes les valeurs sont retourné sauf les entete de colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tab_Query = Requete.GetRows
    Cepandant je ne sais pas comment faire avec les entete car j'ai une erreur lorsque je met HDR=NO

    Merci

  10. #10
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Il semblerait que le HDR=NO fonctionne sur des requete simple, du genre
    Cependant dès que cela devient complexe, les entete sont utiliser et là on peux plus les faire passer pour des valeurs.

    Je passe alors par ce bout code pour ajouter à posteriorie sur la derniere ligne les entete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Set Requete = Source_1.Execute(xSQL)
     
        Data_Query_Array = Requete.GetRows
     
        nrow = UBound(Data_Query_Array, 1) - 1
        ncol = UBound(Data_Query_Array, 2) + 1
     
        ReDim Preserve Data_Query_Array(nrow + 1, ncol)
        For i = 0 To nrow
            Data_Query_Array(i, ncol) = Requete.Fields(i).Name
        Next
    Dès lors que je souhaite travailler sur un tableau vba, la position de l'entete importe peu, du moment que je sais ou ils sont.

    Cependant si vous avez mieux je suis preneurs.

    Merci

Discussions similaires

  1. [MySQL] Creation d'un tableau avancé à partir de dates en mysql
    Par Riri80 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/09/2012, 09h44
  2. [XL-2003] [VBA]remplisage d'un tableau a partir d' une liste
    Par olivier370 dans le forum Excel
    Réponses: 2
    Dernier message: 24/08/2009, 10h13
  3. creation de nouvelles feuilles a partir d'un tableau
    Par firaponte dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 22/07/2008, 12h05
  4. Réponses: 6
    Dernier message: 31/01/2007, 10h19
  5. Creation d'une table à partir d'un tableau
    Par fafabzh6 dans le forum Access
    Réponses: 10
    Dernier message: 20/09/2006, 17h10

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