Extraire des données sans ouvrir le fichier

Bonjour à tous, j'espère que vous allez bien !

Pourriez-vous m'aider sur un sujet svp !

je souhaite extraire des données d'un fichier 2 et de les copier dans le ficher A mais sans ouvire le fichier 2.

J'ai trouvé une macro qui fonctionne très bien, mais le soucis, c'est que je veux filtrer sur une valeure avant de faire l'extraction.

je vous laisse mon code, si c'est possible de me dire comment appliquer un filtre :

'Adresse de la cellule contenant la donnée à récupérer
    Cellule = "E4:H1000" 'je souhaite filter cette plage sur "maintenance"
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

    Feuille = "FMIN$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
    'Chemin complet du classeur fermé
    'Fichier = "C:\Users\Yannick\Desktop\2015\3.xlsx"
    'Fichier = ThisWorkbook.Path & "\3.xlsx"
     Fichier = "C:\Users\i432342\AppData\Local\Temp\MicrosoftEdgeDownloads\049c3e50-077d-469f-b7b5-6461e0541981\3.xlsx"
    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=No;"";"

    'Adresse de la cellule contenant la donnée à récupérer
    Cellule = "E4:H1000" 'je souhaite filter cette plage sur "maintenance"
    Cellule2 = "AO4:AP1000"

    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
    End With
    Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
    Range("A" & Range("B65536").End(xlUp).Row + 1).CopyFromRecordset Rst
    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT * FROM [" & Feuille & Cellule2 & "]"
    End With
    Set Rst = Source.Execute("[" & Feuille & Cellule2 & "]")
      Range("E" & Range("E65536").End(xlUp).Row + 1).CopyFromRecordset Rst
    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
End Sub

merci d'avance

Bonjour,

"SELECT * FROM [" & Feuille & Cellule & "]"

En SQL, SELECT * permet d'extraire toutes les données d'une table spécifiée après le FROM.
C'est donc ici que ça se jouera. Mais sans connaitre ta base de données ni le filtre que tu veux appliquer, on aura du mal à t'aider.

Qui plus est, aujourd'hui PowerQuery fera cela sans doute mieux. Quelques pros du domaine devraient vite passer par ici.

Bonjour,

Je confirmes les dires de Joyeux Noel, Avec power query cela se ferait en quelque clicks. Merci de fournir un exemple représentatif de la source et du rendu afin de vous montrez les possibilités.

Cdt

Je vous laisse mes deux fichiers, fichier source c'est "3.xlsx"

fichier destinataire c'est "Extraire des données sans ouvrir le fichier source.xlsm".

Je sohaite extraire que les données qui correspondent à "maintenance" du fichier source.

merci d'avance

523.xlsx (31.67 Ko)

Si tu poursuivais dans ta logique, ce serait quelque chose du genre :

"SELECT * FROM [" & Feuille & Cellule & "] WHERE type = 'Maitenance'"

Mais comme ce n'est pas un tableau structuré et que tu ne fais pas référence aux entêtes dans ta plage, je ne sais pas comment il faudrait l'écrire vraiment pour que ça fonctionne.

Ci joint Via Power query

J'ai mis votre tableau de base en tableau struturé. Je l'ai renomé "T_source" C'est important de le renomé comme cela.

Ce qu'il va rester à faire est à modifier la source dans la requette power query :

Pour voir les requêtes utilisés, il suffit de faire : onglet "données" => "Requêtes et connexion" Les requêtes s'afficheront à droite. Double clicker dessus pour voir les étapes utiliser dans Power query (complément excel totalement intégré depuis 2016).

L'étape à modifier est l'étape "Source" Il faudra mettre le chemin vers votre fichier source : il faut appuyer sur la roue cranté

image

Puis modifier le lien

image

Pour mettre à jour le tableau de sortie faire : onglet "données" => " Actualiser tout

C'est plus clair ? Cela parait Lourd au premier abord mais power Query est vraiment un outil formidable de gain de temps

463.xlsx (34.39 Ko)

Bonjour valentin,

ça marche super bien, mais est-ce que je peux supprimer la macro que j'ai créé dans ce cas ?

Bien entendu , Si votre macro servait exclusivement à cette tache, elle est maintenant d'aucune utilité.

EDIT : Joyeux Noël est mort vive 21Formatic ?

Bonjour à tous,

Pour le "plaisir", une approche "fichier externe" via Power Query :

EDIT : Joyeux Noël est mort vive 21Formatic ?

Ahah, Exact. Je pensais passer par la section présentations pour officialiser la chose. Ça me fait encore tout bizarre.

Bonjour JFL,

J'ai vraiment pas le reflexe d'utiliser le CheminFichier, C'est surtout pour l'apprentissage et pour le partage que tu conseils de faire cela ? ou tu y vois un autre gain ?

Valentin, super merci !

Je souhaite affichier d'autres colonne sur mon fichier "3.xlxs"

comment les ajouter ?

merci

JFL, j'ai pas encore vu votre proposition, je vous tiens au courant

Bonjour JFL,

J'ai vraiment pas le reflexe d'utiliser le CheminFichier, C'est surtout pour l'apprentissage et pour le partage que tu conseils de faire cela ? ou tu y vois un autre gain ?

Il fait cela car contrairement à ce qu'il dit il n'a pas une longueur de retard, mais d'avance. Et j'allais justement poser la question de comment faire avec un lien dans une cellule

Dans l'étape "Autre colonne suprimés" vous avez la possibilité de sélectioner les colonnes à afficher :

image image

J'ai bien compirs ou c'était autre chose ?

Bonjour

Voici comment faire des requetes avec la clause where

Cet exemple montre comment extraire les hommes du fichier gym

image
Sub extractionsql()

    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

    Feuille = "IDF$" 'n'oubliez pas d'ajouter $ au nom de la feuille d'ou on exrait les données

    'Chemin complet du classeur fermé
     Fichier = ThisWorkbook.Path & "\gym.xlsx" ' dans le meme dossier que ce fichier

    Set Source = New ADODB.Connection          'activer les Microsoft activeX Dataobjects 2.5 librairy
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=No;"";"

    'Adresse de la cellule contenant la donnée à récupérer
    Cellule = "A1:C100" ' contient  les données sur la feuil IDF citée plus haut

    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Source
    End With

    req = "SELECT * FROM [" & Feuille & Cellule & "] where [F3] ='H' " ' A1:C100 sont les colonnes selectionnées de IDF.  F1 represnte la colonne A F2 la B F3 la C .

    Set Rst = New ADODB.Recordset
        Rst.Open req, Source, adOpenStatic, adLockReadOnly

    Range("A" & Range("B65536").End(xlUp).Row + 1).CopyFromRecordset Rst

    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
End Sub

Cordialment

Bonjour de nouveau,

Bonjour JFL,

J'ai vraiment pas le reflexe d'utiliser le CheminFichier, C'est surtout pour l'apprentissage et pour le partage que tu conseils de faire cela ? ou tu y vois un autre gain ?

Avoir une feuille "Paramètres" est pour moi une bonne pratique. Cela permet de "variabiliser" le chemin sans avoir besoin, le cas échéant, de modifier le code, ultérieurement.

Valentin , merci bcp pour cette proposition magique

une question : est-il possible d'utiliser cette méthode avec des plages et non des tableaux structurés ?

Merci fg2b pour cette réponse !

Je n'aurais pas vu cela comme ça ! Pourquoi F pour représenter les colonnes ?

Bonjour fg2b,

ça marche super bien aussi,
merci pour ce temps consacré, merci tous pour vos proposition,

passez une agréable journée

Valentin , merci bcp pour cette proposition magique

une question : est-il possible d'utiliser cette méthode avec des plages et non des tableaux structurés ?

Quel serait l'utilité de travailler sur une plage ?

Rechercher des sujets similaires à "extraire donnees ouvrir fichier"