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 :

DAO et ADO : Copier dans une variable et non dans une feuille [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut DAO et ADO : Copier dans une variable et non dans une feuille
    Bonjour à tous,

    Depuis quelques heures je me penche sur les connections que l'on peut faire avec les classeurs Excel et/ou Access fermés. J'ai bien entendu lu et fait à la lettre le tuto suivant http://silkyroad.developpez.com/VBA/ClasseursFermes/.

    Néanmoins je reste toujours sans réponse à une question :
    Est-il possible de copier dans un vecteur les données extraites ? ou doit on forcément les coller dans une feuille ? (Range().CopyFromRecordset)

    Pour mon cas je dois :
    - chercher une certaine colonne dans un classeur Excel fermé répondant à un critère. Je cherche par exemple la colonne ayant pour entête "a" parmi toutes les colonnes existantes, en prenant le soin de vous préciser que l'entête de la colonne n'est pas à la première ligne ;
    - copier toute les valeurs de la dite colonne dans un vecteur ;
    - réutiliser ce vecteur "plus tard".

    Avez-vous une idée ?

    Merci d'avance.

    Bonnes fêtes à tout le monde !

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 153
    Points : 215
    Points
    215
    Par défaut
    Bonjour,

    Je dirais un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Arr() As Variant
    Dim i As Integer
    Dim rst As ADODB.Recordset
     
    i = 0
    While Not rst.EOF
        ReDim Preserve Arr(UBound(Arr) + 1)
        Arr(i) = rst.Fields(0)
        rst.movenext
        i = i + 1
    Wend
    Pas vraiment testé mais ça donne l'idée

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql="select Champs1,Champ2 from [feuille1$A2:F129] where Champ1='toto'"
    Tu sélectionne les champs que tu veux récupérer, sur la feuille et la plage qui t'intéresses, filtré (where) sur les valeurs du champ que tu veux.

    Tu peux même trier et/ou supprimer le doublons.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Mr Poulpe Voir le message
    Bonjour,

    Je dirais un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Arr() As Variant
    Dim i As Integer
    Dim rst As ADODB.Recordset
     
    i = 0
    While Not rst.EOF
        ReDim Preserve Arr(UBound(Arr) + 1)
        Arr(i) = rst.Fields(0)
        rst.movenext
        i = i + 1
    Wend
    Pas vraiment testé mais ça donne l'idée

    Merci pour le code c'est ça marche pas. Je montre mon code

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    Sub extractionValeurCelluleClasseurFerme()
        Dim Source As ADODB.Connection
        Dim Rst As ADODB.Recordset
        Dim ADOCommand As ADODB.Command
        Dim Fichier As String, Cellule As String, Feuille As String
     
     
        Cellule = "A1:A10"
     
        Feuille = "Feuil1$"
     
        Fichier = "P:\test.xlsm"
     
        Set Source = New ADODB.Connection
     
        Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"""
        Set ADOCommand = New ADODB.Command
        With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
        End With
     
        Set Rst = New ADODB.Recordset
        Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
     
        Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
     
        Range("A1").CopyFromRecordset Rst
     
     
            Dim Arr() As Variant
            Dim i As Integer
            ReDim Arr(0)
     
            i = 0
            While Not Rst.EOF
                ReDim Preserve Arr(UBound(Arr) + 1)
                Arr(i) = Rst.Fields(1)
                Rst.MoveNext
                i = i + 1
            Wend
     
        Rst.Close
        Source.Close
        Set Source = Nothing
        Set Rst = Nothing
        Set ADOCommand = Nothing
    End Sub
    En gros ce que je souhaite c'est juste copier cette colonne là dans un vecteur :
    Nom : Capture.JPG
Affichages : 193
Taille : 14,3 Ko

    Avec ton code je ne comprend pas pourquoi Rst.EOF = True. Donc il ne rentre pas dans la boucle.

    J'ai réussi une fois à rentrer dans la boucle mais ça mettait "vide" pour chaque valeur.

    Et puis aussi, je pense que ton idée est la meilleure, je ne pense pas que ta solution marche avec un début de colonne (une entête quoi) ne se trouvant pas sur la ligne 1.

    Je continue de chercher je te tiens au jus :p


    @rdurupt

    En fait ce que j'aimerais savoir c'est comment faire pour stocker le résultat de ta requête sql (string) dans une variable.



    EDIT :

    En fait il faut supprimer la ligne de code où je copie dans Range("A1").
    Là ça marche.

    En revanche pour ce qui est de l'entête qui n'est pas la ligne 1 je cherche :/

    Y a sans doute une option offset dans tout le bazar.

    EDIT2 :

    Ça y est j'ai trouvé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rst.Fields("nom_de_l'entete")
    avec le header = YES
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
    Nikel merci pour votre aide les gars (ou filles).



    Bonnes fêtes à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/04/2015, 15h46
  2. Contenu d'une variable devenant lui même une variable
    Par Copyright83 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 14/11/2012, 17h24
  3. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  4. [Smarty] Récuper une variable php à partir d'une variable Smarty
    Par SPKlls dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/04/2008, 17h40
  5. [Free Pascal] [2.2] Impossible d'assigner une variable de type T à une variable de type T
    Par Hibou57 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 12/10/2007, 12h31

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