[Non résolu] Fonction lire dans un classeur fermé

Laosurlamontagne

XLDnaute Occasionnel
Bonjour à tous,

Je cherche à lire des données provenant de multiples classeurs excel. J'ai vu que la quasi-totalité des solutions passait par des macro avec des boucles mais pour plus de simplicité, je voudrais utiliser une formule perso.


J'avais initialement trouvé celle-ci:
Code:
Function RECUP(Fichier As String, Feuille As String, _
 Ligne As Long, Col As Integer)
 With CreateObject("Excel.Application").Workbooks.Open(Fichier)
 RECUP = .Worksheets(Feuille).Cells(Ligne, Col)
 .Close False
 End With
 End Function

Mais elle est affreusement longue et pesante (il y a 150 fichier à lire). Du coup, j'ai tenté celle-ci, mais elle ne marche pas...

Code:
  Function ExtraireValeur(Dossier As String, Fichier As String, Feuille As String, Cellule As String)
Dim Argument As String
    Fichier = Replace(Fichier, "'", "''")
    Argument = "'" & Dossier & "[" & Fichier & "]" & Feuille & "'!" & Range(Cellule).Address(, , xlR1C1)
    ExtraireValeur = ExecuteExcel4Macro(Argument)
End Function

Mais je n'arrive pas à trouver pourquoi...

Pourriez-vous m'aider?
 

Roland_M

XLDnaute Barbatruc
Re : [Non résolu] Fonction lire dans un classeur fermé

Bonsoir,

c'est tout à fait comme ça que ça fonctionne !

sans compter qu'il faut tester la version d'application, exp
If Int(Val(Application.Version)) < 12 Then
ADOConnect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & ChemFichSource & ";Extended Properties=""Excel 8.0;HDR=No;"";"
Else
ADOConnect.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ChemFichSource & ";Extended Properties=""Excel 12.0;HDR=No;"";"
End If


ci-joint un module avec des exemples bien documentés
ils ont déjà servi pour des forumeurs donc certaines données traînent encore et peuvent servir d'exemples

évidemment ce n'est pas du sur mesure il faudra un peu s'investir mais ça va t'éclairer
une fois que tu auras préparé ta macro perso, si tu as un problème tu reviens !
 

Pièces jointes

  • ModuleADOConnect.xls
    47 KB · Affichages: 23

Modeste geedee

XLDnaute Barbatruc
Re : [Non résolu] Fonction lire dans un classeur fermé

Bonsour®
dans un classeur fermé
si la localisation des fichiers est fixe et connue(stable)
si l'adresse de la plage est connue
il suffit alors d'établir une liaison vers ces références
la mise à jour est automatique à chaque ouverture du classeur maitre (avec possibilité d'omettre le message d'alerte)
 

Laosurlamontagne

XLDnaute Occasionnel
Re : [Non résolu] Fonction lire dans un classeur fermé

Merci Roland_M, je vais regarder et tenter d'être inspirer...

@ Modeste geedee: oui, le nom, la localisation sont fixes et bien identifiés. Malheureusement, malgré mes tentatives, je n'ai pas réussi à établir une liaison.

Ma dernière tentative est:

Code:
=INDIRECT(CONCATENER("'";T7;"\[";U7;"]donnee'!";"$B$17"))

en colonne T: le répertoire (ex. "c:\data\dossier1")
en colonne U: le nom de fichier avec son extention (ex. "truc.xlms")

Une idée?
 

Lone-wolf

XLDnaute Barbatruc
Re : [Non résolu] Fonction lire dans un classeur fermé

Bonsoir Laosurlamontagne,

Fait un test avec le fichier joint.

Change le chemin du fichier, dans la feuille 1; dans la feuille Fidback il y a une liste en L1 qui sert de recherche. Le code est seulement pour 1 classeur, si tu as 10 classeur à récupérer bein... tu aura du boulot.


Le code est seulement pour 1 classeur
Je retire ce que j'ai dit.


J'ai retouver le fichier où je copie les données des classeurs situés dans divers endroits.





A+ :cool:
 

Pièces jointes

  • Ma Classe.xls
    90.5 KB · Affichages: 29
Dernière édition:

Roland_M

XLDnaute Barbatruc
Re : [Non résolu] Fonction lire dans un classeur fermé

Bonjour,

Salut Lone-wolf, on ne pourra pas nous reprocher de ne pas avoir essayé !



bon, laosurlamontagne, tu vas descendre de ta montagne et voir un ce qui se passe dans la plaine !
tu vas voir cette routine très claire et très simple pour un essai sur un seul fichier,
ensuite on verra pour traiter l'ensemble de tes fichiers avec les infos que tu nous fourniras.

Code:
'necessite d'activer la reference Microsoft ActiveX Data Objects x.x Library
'==============================================
'compléter les variables et taper F5 ! cette routine fonctionne parfaitement!
'==============================================
Sub Essai()
Dim ChemSource$, FichSource$
Dim FeuilSource$, RangSource$
Dim FeuilDestin$, RangDestin$
'source
FichSource = "Fichier.xls" 'nom du fichier source
ChemSource = "C:\Dossier" 'nom du dossier source
FeuilSource = "Feuil1" 'nom de la feuil source
RangSource = "A10:A10" 'range source préciser ainsi! "F5:F5" "B1:C5" ...
'destination
FeuilDestin = "Feuil1" 'nom de la feuille de destination
RangDestin = "A1"      'l'adresse de destination
'appel routine
ImportUneCellOuUnRangDuClasseurFerme ChemSource$, FichSource$, FeuilSource$, RangSource$, FeuilDestin$, RangDestin$
End Sub


'****************************** NE RIEN MODIFIER CI-DESSOUS **********************************
Sub ImportUneCellOuUnRangDuClasseurFerme(ChemSource$, FichSource$, FeuilSource$, RangSource$, FeuilDestin$, RangDestin$)
'test les vars
Dim ChemFichSource$, TextSQL$
If Right(FeuilSource, 1) <> "$" Then FeuilSource = FeuilSource & "$"
If Right(ChemSource, 1) <> "\" Then ChemSource = ChemSource & "\"
ChemFichSource = ChemSource & FichSource
TextSQL = "SELECT * FROM [" & FeuilSource & RangSource & "]"

'ouverture selon version excel
Dim ADOConnect As Object, ADORecord As Object
Set ADOConnect = CreateObject("ADODB.Connection")
If Int(Val(Application.Version)) < 12 Then
   ADOConnect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & ChemFichSource & ";Extended Properties=""Excel 8.0;HDR=No;"";"
Else
   ADOConnect.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ChemFichSource & ";Extended Properties=""Excel 12.0;HDR=No;"";"
End If
    
'load les données
Set ADORecord = CreateObject("ADODB.Recordset")
Set ADORecord = ADOConnect.Execute(TextSQL)
      
'recopie dans ce classeur
Sheets(FeuilDestin).Range(RangDestin).CopyFromRecordset ADORecord

'fermeture connection
ADOConnect.Close
Set ADORecord = Nothing: Set ADOConnect = Nothing
End Sub
 

Laosurlamontagne

XLDnaute Occasionnel
Re : [résolu] Fonction lire dans un classeur fermé

Bonjour à tous,

Merci pour vos retour et vos différentes réponses. Elles m'ont bien inspiré.

Je m'en suis sortie en utilisant:


Code:
Formule = "='" & Dossier & "\[" & Fichier & "]Data" & "'!" & "E10"

Puis

Code:
ShFichiers.Range("F" & r + 2).Formula = Formule

Bon, c'est pas la méthode la plus propre que j'espérais car il faut retoucher le code en cas d'ajout de colonne mais elle marche bien...
 

Discussions similaires

Réponses
1
Affichages
298
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin