Parcourir les feuilles d'un fichier excel fermé

dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011 - 18 juil. 2011 à 12:01
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011 - 22 juil. 2011 à 12:13
Bonjour,

Je viens demander main forte au prés des spécialiste du VBA.
Je suis novice dans ce langage et je dois mettre en place un un tableau de synthése à partir d'autre fichier excel. J'ai un petit soucis concernant le parcours de toutes les feuilles d'un fichier fermé pour faire mon traitement, sachant que je n'établie pas de connexion entre fichier, j'utilise juste la fameuse "ExecuteExcel4Macro".
Merci d'avance.

Ps: aperçu du code:

Dim Feuille As Worksheet
Dim Classeur As Workbook

For Each Fichier In DirSource.Files
If Right(Fichier.Name, 5) = ".xlsx" Then

Set Classeur = "'" & ThisWorkbook.Path & "" & "[" & Fichier.Name & "]"
For Each Feuille In Classeur.Sheets
' Faire le traitement
Next Feuille
Next Fichier

20 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 juil. 2011 à 12:11
Bonjour,

Etape1 : intéresse-toi à GetObject (ton aide VBA)
Etape2 : reviens si encore face à une difficulté, en la précisant.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
19 juil. 2011 à 09:21
Merci ucfoutu pour ta réponse..! j'ai en effet mis en place une solution se basant sur "getobject" cependant j'ai vu le temps d'execution monter en fleche..! Je voudrais savoir si cette méthode ouvrer le fichier concernant.. parceque moi je fai le traitement sur les fichiers sans les ouvrir.
Merci d'avance
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juil. 2011 à 10:55
Attends.
En te relisant, j'ai un petit doute.
J'ai un petit soucis concernant le parcours de toutes les feuilles d'un fichier fermé pour faire mon traitement, sachant que je n'établie pas de connexion entre fichier, j'utilise juste la fameuse "ExecuteExcel4Macro"



peux-tu détailler plus explicitement le mécanisme que tu veux mettre en oeuvre ?
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
19 juil. 2011 à 11:36
Rebonjour,

Je cherche à mettre en place un tableau de synthése à partir de plusieurs fiches d'audits. Une ficher d'audite est constitué de plusieurs feuille excel! j'arrive bien à faire le traitement sur les fiches une à une sans les ouvrir ( ie parcourir le dossier et lister les classuers).. mais quand je veux parcourir les feuilles de chaques fiches.. je beug..!
j'espére que j'ai éclairci un peu la problématique!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juil. 2011 à 11:41
Je ne comprends pas :
soit truc l'objet classeur ==>>
un objet classeur contient plusieurs objets Feuille (collection WorkSheets)

=>> as-tu essayé :

for each feuille in classeur.worksheets
 ..../.
 next

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
19 juil. 2011 à 11:45
oui.. sauf qu'il n'y a pas de collection pour les classeurs fermés!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juil. 2011 à 12:38
Montre le code que tu as écrit, s'il te plait.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
19 juil. 2011 à 13:24
biensur.. voici le code:

Dim NbTrames As Integer
Const Compteur As Long = 10 'Parcours de conformité


Private Sub ListeTramesDans(NomDirSource As String)
Dim FSO As Scripting.FileSystemObject
Dim DirSource As Scripting.Folder
Dim Fichier As Scripting.File
Dim r As Long
Dim le_local As String

Dim Feuille As Worksheet
Dim Classeur As Workbook

Set FSO = New Scripting.FileSystemObject
Set DirSource = FSO.GetFolder(NomDirSource)

NbTrames = 1
r = Sheets("recap").Range("A65536").End(xlUp).Row + 1


'Balayage du dossier et affichage des noms des trames

For Each Fichier In DirSource.Files
If Right(Fichier.Name, 5) = ".xlsx" Then

Set Classeur = GetObject(ThisWorkbook.Path & "" & Fichier.Name)
For Each Feuille In Classeur.Sheets


Cells(r, 2) = TesterCheckbox(ThisWorkbook.Path & "", Fichier.Name, Feuille.Name, "R10C9")
'traitement à faire sur les feuilles

Call Traitement_cellule(le_local, r, "recap")
Call determinerConf(r, "recap")

NbTrames = NbTrames + 1
r = r + 1
Next Feuille
End If

Next Fichier


Set Fichier = Nothing
Set DirSource = Nothing
Set FSO = Nothing
End Sub



avec :

Private Function TesterCheckbox(ByVal Dossier As String, ByVal Fichier As String, ByVal Feuille As String, ByVal Cel As String)
Dim Argument As String
Argument = "'" & Dossier & "[" & Fichier & "]" & Feuille & "'!" & Cel 'cel sous la forme RxCy
TesterCheckbox = ExecuteExcel4Macro(Argument)
End Function


ce code fonctionne.. mais l'execution est assez lente.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 juil. 2011 à 18:14
regarde ce que fait ceci (testé à l'instant chez moi) :

 Dim appExcel As Excel.Application
  Dim wbExcel As Excel.Workbook
  Dim wsExcel As Excel.Worksheet
  Set appExcel = GetObject(, "Excel.Application")

  '===>> ta boucle sur tes fichiers commence ici.
  Set wbExcel = appExcel.Workbooks.Open("D:\Classeur1.xlsm")
  '=====>> traitement du classeur comme toi tu l'entends, au lieu de ce qui suit.
  Dim feuille As Worksheet
  For Each feuille In wbExcel.Worksheets
    MsgBox "la cellule A1 de la feuille " & feuille.Name & " du classeur " & _
    wbExcel.FullName & " contient la valeur " & feuille.Range("A1").Value
  Next
'======= fin de ta boucle sur les fichiers


Toi, tu dois utiliser cela dans une boucle
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
20 juil. 2011 à 09:02
Merci pour ta réponse, mais je remarque que tu ouvres le classeur avant d'effectuer le traitement..!

Set wbExcel = appExcel.Workbooks.Open("D:\Classeur1.xlsm")


Et moi je voudrais éviter l'ouverture étant donné que j'ai une centaine de classeurs à traiter à la fois.. :s! c'est pour ça que j'avais parlé de collection de fichiers fermés!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 juil. 2011 à 10:10
Non.
Le classeur n'est pas réellement ouvert. Il n'apparait d'ailleurs pas, ni dans la barre des tâches, ni dans le gestionnaire des tâches(que ce soit en appli ou en processus)

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
20 juil. 2011 à 10:37
Je viens de tester à l'instant la solution avec Open, elle ouvre bien les fichiers excel ( en premier plan même) et le temps d'execution montre en fleche.. :s!!
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
21 juil. 2011 à 15:07
Pas d'autres idées sur ce sujet là?!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 juil. 2011 à 16:55
je ne comprends pas ce qui se passe chez toi.

Bon...
Je viens de procéder encore autrement, puisqu'il ne s'agit que de lire dans l'autre classeur
J'ai placé un bouton de commande nommé commandbutton1 sur un userform de mon classeur appelant, avec ce code :
Private Sub CommandButton1_Click()
  Dim appExcel As Excel.Application
  Dim wbExcel As Excel.Workbook
  '===>> ta boucle sur tes fichiers commence ici.
  Application.ScreenUpdating = False 'pour éviter des sautillements désagréables
  Set wbExcel = GetObject("D:\Classeur1.xlsm") '===>> exemple, hein !
  '=====>> traitement du classeur comme toi tu l'entends, au lieu de ce qui suit.
  Dim feuille As Worksheet
  For Each feuille In wbExcel.Worksheets
    MsgBox "la cellule A1 de la feuille " & feuille.Name & " du classeur " & _
    wbExcel.FullName & " contient la valeur " & feuille.Range("B3").Value
  Next
  Application.ScreenUpdating = False ' pour rétablir
  Set wbExcel = Nothing ' pour soulager ta mémoire
  '===========================ta boucle sur tes fichiers jusqu'ici
End Sub

Et je n'ai aucun problème : je lis bien la cellule B3 de chaque feuille de D:\Classeur1.xlsm et ce dernier n'apparaît ni dans ma barre des tâches, ni dans le gestionnaires des tâches>.
Ma version d'Excel : 2010

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 juil. 2011 à 07:36
Autrement, tu as toujours la possibilité de traiter un fichier excel comme une base de données en utilisant une connexion ADO (tu trouveras sur la toile de nombreux exemples), mais il te faudra préciser la feuille (ce qui s'écarte de ton but).


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
22 juil. 2011 à 09:07
Je te remercie encore pour ta solution ucfoutu..! comme je te disais elle marchait bien.. mais chez moi la méthode open ouvre le fichier en question. Concernant la méthode getobject c'est sur qu'elle n'ouvre pas le fichier en forground mais il est explicitement ouvert en background.. chose qui fait monter le temps d'execution en fléche.. surtout que derriére je dois faire le traitement de quelques centaines de fichiers.. soit plus de mille fuilles.

Je vais tester ta proposition ..
Sinon concernant la méthode ADO j'ai regardé sur le net et j'ai mis en place une procédure.. mais qui ne veut pas marcher.. je te laisse jettez un coup d'oeil si tu peux me debeuguer..
Sub Requete2007(fichier As String, NomFeuille As String, cel As String)
    Dim Cn As ADODB.Connection
    Dim texte_SQL As String
    Dim Rst As ADODB.Recordset
    Dim ADOCommand As ADODB.Command
    
    Set Cn = New ADODB.Connection
    
    '--- Connexion ---
    Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
           & fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
'        .Provider = "Microsoft.Jet.OLEDB.4.0"
'        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
'            & fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
'        .Open
'    End With
    '-----------------
    
    ' la requête ...
    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Cn
        .CommandText = "SELECT * FROM [" & NomFeuille & cel & "]"
    End With
                  
    Set Rst = New ADODB.Recordset
    Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
                  
    Set Rst = Cn.Execute("[" & NomFeuille & cel & "]")
    
    Cells(2, 1).CopyFromRecordset Rst
    MsgBox (Cells(2, 1).Value)
    
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing

End Sub



Merci bcp pour tes réponses encore une fois.

ps: je travaille sous excel 2007.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 juil. 2011 à 10:46
chose qui fait monter le temps d'execution en fléche

Quelle que puisse être la méthode choisie (getobject ou utilisation "en base de données"), il faudra bien que les données passent en mémoire, pour les exploiter
J'abdique, là !
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
22 juil. 2011 à 11:46
Ouai bien entendu.. mais peut être que le fait de garder le fichier fermé réduira ce temps..!
En tout cas merci beaucoup pr tes idées et tes réponses :)!
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 juil. 2011 à 11:59
mais peut être que le fait de garder le fichier fermé réduira ce temps

Je n'y crois pas trop, car la seule différence réelle en temps d'utilisation résulterait de l'utilisation des mises en forme ===>> affichage.
Or (voir mon code) :
application.screenupdating = False t'en affranchirait.
Tu peux également inhiber les calculs, s'il y en a à l'ouverture de tes feuilles (m'étonnerait et de toutes manières, dans un tel cas, le résultat même de ces calculs pourrait modifier précisément certaines valeurs, dont celles qui t'intéressent... mais c'est à voir ...)

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
dalaae Messages postés 11 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 25 juillet 2011
22 juil. 2011 à 12:13
Tu as touché du doigts le probléme..
Tout le traitement est effectué au démarrage du fichier de synthsé...! et dés que je dépasse un certain nombre de fichiers ( une petite dizaine) l'application beug à son démarrage..! alors que je dois faire le traitement d'une centaine de fichier.. chacun contenant une centaine de feuilles!
0
Rejoignez-nous