Lire dans classeur fermé

Début-lent

XLDnaute Nouveau
Bonjour à tous,
je débarque dans le forum et comme vous pouvez lire dans mon nom... je vais pas vite!!!
Ca fait 2 jours que je surf (ou plutôt patauge ce serait plus conforme à la réalité)
sur le net pour résoudre mon problème...

Je rève d'une fonction "générique" (ou macro) qui pourrait lire une cellule ou plage de cellules dans un classeur fermé, on pourrait l'appeller comme ça :
LireClasseurFermé(chemin;fichier;onglet;plage) avec
  • dans chemin on lui passerait le string de l'arborescence
  • dans fichier le string du nom de fichier (avec ou sans ".xlsx ou m ou rien...à voir)
  • dans onglet idem
  • dans plage on lui passerai en string "A1" ou "A12:B15" pour les grandes plages (pas que de l'altalantique...)
et en retour on aurait le résultat.... pas mal !!!
Ca doit bien exister quelque part .. mais je n'ai pas trouvé!!!
ça devrait tourner autour de "Indirect.ext()"
mais voilà pour rendre la fonction générique bonjour pour moi !!
alors si qqun a qqchose
je suis preneur
Merci à tous
 

tatiak

XLDnaute Barbatruc
Bonjour,
Arrête de rêver, voici ta "fonction" :
VB:
Sub LireClasseurFermé(Chemin As String, Fichier As String, Onglet As String, Plage As String, Destination As Range)
Dim T As Variant

    Ndf = Chemin & "\" & Fichier
    Req = "SELECT * FROM [" & Onglet & "$" & Plage & "]"
    T = Tquery
    Destination.Resize(UBound(T, 1) + 1, UBound(T, 2) + 1) = T
End Sub
Exemple d'appel :
VB:
Sub test()
    LireClasseurFermé ThisWorkbook.Path, "Data_Demo_ADO.xlsx", "Donnees", "A1:C12", Sheets("Feuil1").Range("A1")
End Sub
Tu remarquera que dans ma proposition j'ai ajouté la destination, cellule de référence pour y coller le résultat
Voir mise en œuvre dans le zip joint
Démo_Fct_Générique.xlsm + fichier de données de test

Pierre
 

Fichiers joints

Dernière édition:

Début-lent

XLDnaute Nouveau
Yes... merci beaucoup pour la rapidité.
Je vais essayer de comprendre et de mettre en oeuvre illico!!.

Ca y est. Je viens de tester et ça roule, bon j'ai pas tout compris et m^me assez peu de chose...
au point que je ne sais même pas comment la modifier pour lui faire ramener qu'une seule cellule...
je n'ose pas toucher dans les 2 boucles afin que ça sorte à la 1ère itération et m^me sans itérer du tout...
en tout cas merci beaucoup
ca répond à la demande
mais si j'ai bien compris je ne peux que l'activer avec un bouton pour lancer la macro
et je comprend maintenant la problématique de la cellule de destination...
ce n'est pas une fonction personelle que je peux écrire direct dans une cellule comme ça :
=LireClasseurFermé("C:\Prive\Outils\Excel", "EssClassFerm", "Feuil1", "A1")
et dans ce cas là, la destination ne se posait pas...
Mais je vais utiliser avec Macro c'est pas mal non plus!!!
 

tatiak

XLDnaute Barbatruc
Oulààà malheureux!!

Va t'en pas mettre le bazar dans le code de "TQuery", fonction éprouvée depuis de moultes et moultes années!

Pour récupérer le contenu d'une seule cellule, je ne conseille pas cette méthode, il y en a d'autres et je laisse aux autres le soin de te les montrer

En fait, la méthode ADO est plutôt adaptée pour lire ET écrire dans des fichiers fermés (et fichier Access, Mysql, SqlServer, ...)

Pierre
 
Dernière édition:

tatiak

XLDnaute Barbatruc
Juste pour info, voici une variante pour récupérer dans une cellule une valeur du fichier extérieur.
Ici une fonction "Lire_Ext" appelée depuis une cellule => par exemple en E1 : =lire_ext("H123") et en D8 : =lire_ext("C12")
Le chemin, le fichier et l'onglet sont spécifiés dans le code de la fonction
VB:
Function Lire_Ext(Adr As String)
    If UBound(Tdata) = 0 Then Init ThisWorkbook.Path, "Data_Demo_ADO.xlsx", "Donnees"
    With ActiveSheet.Range(Adr)
        Lire_Ext = Tdata(.Row - 1, .Column - 1)
    End With
End Function
Cette méthode permet une lecture unique du fichier extérieur et permet de récupérer une valeur unique dans une cellule unique.
Nb : le reste de code reste inchangé par rapport à ma première proposition.

Pierre
 
Dernière édition:

arthour973

XLDnaute Barbatruc
Supporter XLD
Bonjour Pierre, le Forum,

@Pierre
Ton fichier fonctionne super bien, encore un grand merci.
Je reviens sur ce fil pour un besoin d'une variante si cela est possible.
L'importation des infos du fichier fermé se fait (ce qui est logique); à l'identique du fichier d'importation.
c’est-à-dire colonnes à côté les unes des autres

Dans mon travail, j'importe des données de plusieurs classeurs fermés
Afin de de pas alourdir mon fichier de destination
Donc, pour éviter la création de plusieurs onglets d'importation + un onglet de regroupement
J'ai besoin d'importer les infos par classeur, les unes au dessous des autres
classeurs : tous même structure,même nom d'onglet


J'ai tenté quelques codes sans succès.
Si pas trop compliqué, pourrais-tu solutionner mon souci ?
Comme présenté dans le classeur test joint onglet "Résultat attendu".

Un grand merci encore une fois :)

Amicalement,
lionel,
 

Fichiers joints

C.H.U

XLDnaute Nouveau
Hello,


D'abord bravo pour la fonction. Ca m'a l'air bien pratique.

Sinon il y a aussi la fonction Pull de Wilson So. Elle est flexible car elle fonctionne comme indirect (on lui indique les composantes du chemin et elle va trouver les valeurs) mais elle est assez lourde en terme d'execution. Si on peut flexibiliser celle-ci je suis preneur aussi :)

Bonne année à tous !!!!
 

Dudu2

XLDnaute Occasionnel
Bonjour,
Ötez-moi d'un doute...
Ce Tquery de l'espace, il ouvre bien le fichier fermé d'une manière ou d'une autre pour en lire le contenu, non ?
Ou bien il est magique et sait lire dans les yeux de Windows ?
S'il ouvre le classeur, pourquoi utiliser le Tquery de l'espace au lieu d'un simple Workbooks.Open ?
Merci pour les éclaircissements.
D.
 

James007

XLDnaute Barbatruc
Bonjour à tous,

A côté de la solution ADO proposée par Pierre, il existe des fonctions personnalisées assez anciennes ...

Elles permettent d'extraire des valeurs ..SANS OUVRIR LE FICHIER SOURCE ...

Les plus connues sont : La fonction Pull concue par Harlan Grove et la fonction GetValue de John Walkenbach (tip82)

@Dudu2 ... effectivement ... il y a quelque chose de Magique à extraire des valeurs SANS Workbooks.Open ... !!!o_O
 
Dernière édition:

tatiak

XLDnaute Barbatruc
Bonjour à tous,

En effet, ADO permet de lire des données (excel, access, Mysql, Sql server, dbf, ...) SANS OUVERTURE du fichier source

Pierre
 

laurent950

XLDnaute Impliqué
Bonjour tatiak, le forum,

Merci tatiak de m'avoir donné l'idée d'avoir pu travailler avec les requêtes SQL en me servant d'excel et vos nombreux exemples. C'est en effet très très puissant sur des très gros tableaux excel !

j'ai eu l'occasion de vous croiser sur ce forum et je vous remercie de m'avoir aidé dans le passé et peux être le futur pour profiter de votre savoir et professionnalisme, Je vous souhaite une bonne année tatiak

Laurent950
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas