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:

Discussions similaires


Haut Bas