Parcourir les feuilles d'un fichier excel fermé

Signaler
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011
-
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011
-
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

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

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!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

oui.. sauf qu'il n'y a pas de collection pour les classeurs fermés!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

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.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

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!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

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!!
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

Pas d'autres idées sur ce sujet là?!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

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.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

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 :)!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
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
Messages postés
11
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
25 juillet 2011

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!