VBA Ouvrir fichier Excel particulier dans plusieurs dossiers
Bonjour à tous.
Cela fait maintenant un moment que je ne parviens pas à réaliser la macro que j'aimerais créer. J'en ai réalisé une mais elle ne fonctionne pas (voir plus bas). La macro que j'aimerais créer aurait la fonction suivante:
Il existe un répertoire (SharePoint mais c'est un détail) composé de plusieurs dossiers. Dans chaque dossiers se trouve plusieurs fichiers dont un fichier excel dont le nom commence par "SIMULATION_". La macro vient ouvrir dans chacun des dossier du SharePoint, ce fichier excel. Ensuite j'éxécute plusieurs instructions qui me permettent de copier/coller certaines données de ces fichiers excel pour les rassembler dans un fichier excel global où la macro se trouve.
Voici la macro que j'ai réalisé mais qui bloque avec une erreur de type 91 Variable non définie ou variable de bloc with non définie à l'instruction soulignée. Je pense que c'est parce que je lui demande d'ouvrir une variable qui est un "Object" et non un "Workbook". Le souci est que j'utilise derrière une boucle "For each" avec cette même variable, et cette boucle ne fonctionnera pas avec une variable du type "Workbook".
Voici la macro:
Dim i As Long
Sub Consolider_Simu()
Dim S_Commande As Worksheet
Dim Chemin As String
Dim Extension As String
Set S_Commande = ThisWorkbook.Sheets("Commande")
Chemin = S_Commande.Cells(3, 2).Value
Extension = S_Commande.Cells(4, 2).Value
i = 6
Nb = BoucleFichiers(Chemin, Extension)
End Sub
Function BoucleFichiers(Chemin As String, Extension As String) As Integer
Dim Fso As Object
Dim Dossier As Object
Dim Fichier As Object
Dim WB_TargetFichier As Workbook
Dim TargetSheet As Worksheet
Dim MainSheet As Worksheet
Set Fso = CreateObject("Scripting.FileSystemObject")
Set WB_TargetFichier = Workbooks.Open(Fichier)
Set TargetSheet = WB_TargetFichier.Sheets("SIMULATION")
Set MainSheet = ThisWorkbook.Sheets("Main")
BoucleFichiers = 0
For Each Dossier In Fso.GetFolder(Chemin).SubFolders
For Each Fichier In Dossier.Files
If Fichier = "SIMULATION_" & "*" Then
TargetSheet.Range("F6:G13").Select
Selection.Copy
MainSheet.Range("D" & i).PasteSpecial Paste:=xlPasteValues
MainSheet.Range("D" & i).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
i = i + 22
BoucleFichiers = BoucleFichiers + 1
WB_TargetFichier.Close savechanges:=False
Else: i = i + 22
End If
Next Fichier
Next Dossier
End Function
Ma macro ne fonctionne malheureusement pas, j'ai le message d'erreur 91 Variable objet ou variable de bloc With non définie. Je pense que c'est parce que je lui demande d'ouvrir une variable qui est un "Object" et non un "Workbook". Le souci est que j'utilise derrière une boucle "For each" avec cette même variable, et cette boucle ne fonctionnera pas avec une variable du type "Workbook". Quelqu'un pourrait-il m'aider sur le sujet ?
À bientôt (j'espère !
SkillzZ
Bonjour,
Je ne vois pas la ligne surlignée...
En première lecture, je ne vois que If Fichier.Name = qui peut poser problème. (Il ne me semble pas qu'on puisse l'omettre...)
Cordialement.
Bonjour à tous, bonjour MFerrand !
Zut j'ai oublié de la surligner .. Voici le code avec la ligne surlignée:
Dim i As Long
Sub Consolider_Simu()
Dim S_Commande As Worksheet
Dim Chemin As String
Dim Extension As String
Set S_Commande = ThisWorkbook.Sheets("Commande")
Chemin = S_Commande.Cells(3, 2).Value
Extension = S_Commande.Cells(4, 2).Value
i = 6
Nb = BoucleFichiers(Chemin, Extension)
End Sub
Function BoucleFichiers(Chemin As String, Extension As String) As Integer
Dim Fso As Object
Dim Dossier As Object
Dim Fichier As Object
Dim WB_TargetFichier As Workbook
Dim TargetSheet As Worksheet
Dim MainSheet As Worksheet
Set Fso = CreateObject("Scripting.FileSystemObject")
Set WB_TargetFichier = Workbooks.Open(Fichier)
Set TargetSheet = WB_TargetFichier.Sheets("SIMULATION")
Set MainSheet = ThisWorkbook.Sheets("Main")
BoucleFichiers = 0
For Each Dossier In Fso.GetFolder(Chemin).SubFolders
For Each Fichier In Dossier.Files
If Fichier.Name = "SIMULATION_" & "*" Then
TargetSheet.Range("F6:G13").Select
Selection.Copy
MainSheet.Range("D" & i).PasteSpecial Paste:=xlPasteValues
MainSheet.Range("D" & i).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
i = i + 22
BoucleFichiers = BoucleFichiers + 1
WB_TargetFichier.Close savechanges:=False
Else: i = i + 22
End If
Next Fichier
Next Dossier
End Function
Une idée MFerrand ou quelqu'un d'autre par rapport à ça ? Merci de ta réponse ! Et j'ai rajouté le Fichier.Name
Bonne journée !
SkillzZ
Les informations à fournir en cas d'erreurs sont le numéro de l'erreur (le message en cas d'absence de numéro), la ligne sur laquelle survient l'erreur, les valeurs des variables au moment de l'erreur autant que possible, et le contexte dans lequel l'erreur survient.
Bon !
On voit donc mal comment le classeur pourrait être ouvert si tu ne fournis rien...
Cordialement.
En fait je t'ai donné toutes les informations concernant l'erreur dans le post précédent que tu as normalement lu puisque tu y as répondu
Merci pour ta réponse MFerrand, je vais voir ce que je peux faire, mais comme je disais, j'ai défini Fichier comme un "object" pour l'inclure dans une boucle for each mais je sais bien qu'il devrait être de type "string" pour pouvoir utiliser Open ! C'est une partie de mon souci, qui encore une fois, a été expliqué dans mon premier post
J'arrive pas à trouver le moyen d'utiliser ce open mais aussi la boucle for each qui me semble nécessaire en fait
J'ai finalement un tout petit peu modifié mon code et il s'execute sans message d'erreur mais j'ai l'impression qu'il n'effectue rien. Du moins il ne fait pas ce que je souhaite. MFerrand pourrais-tu me donner une technique pour que je puisse contrôler les actions de mon code si cela existe ? J'ai déjà entendu parler de ces choses là mais je n'y connais rien.
Mon nouveau code est le suivant:
Dim i As Long
Sub Consolider_Simu()
Dim S_Commande As Worksheet
Dim Chemin As String
Dim Extension As String
Set S_Commande = ThisWorkbook.Sheets("Commande")
Chemin = S_Commande.Cells(3, 2).Value
Extension = S_Commande.Cells(4, 2).Value
i = 6
Nb = BoucleFichiers(Chemin, Extension)
End Sub
Function BoucleFichiers(Chemin As String, Extension As String) As Integer
Dim Fso As Object
Dim Dossier As Object
Dim Fichier As Object
Dim WB_TargetFichier As Workbook
Dim TargetSheet As Worksheet
Dim MainSheet As Worksheet
Set Fso = CreateObject("Scripting.FileSystemObject")
Set MainSheet = ThisWorkbook.Sheets("Simulations")
BoucleFichiers = 0
For Each Dossier In Fso.GetFolder(Chemin).SubFolders
For Each Fichier In Dossier.Files
If Fichier.Name = "SIMULATION_" & "*" Then
Set WB_TargetFichier = Workbooks.Open(Fichier.Name)
Set TargetSheet = WB_TargetFichier.Sheets("SIMULATION")
TargetSheet.Range("F6:G13").Select
Selection.Copy
MainSheet.Range("D" & i).PasteSpecial Paste:=xlPasteValues
MainSheet.Range("D" & i).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
i = i + 22
BoucleFichiers = BoucleFichiers + 1
WB_TargetFichier.Close savechanges:=False
End If
Next Fichier
Next Dossier
End Function
Inutile de lire les deux posts qui précèdent j'ai bien avancé. Mais je fais face à un dernier obstacle !
Lorsque je compile mon nouveau code:
Dim i As Long
Dim j As Integer
Sub Consolider_Simu3()
Dim S_Commande As Worksheet
Dim Chemin As String
Dim Extension As String
Set S_Commande = ThisWorkbook.Sheets("Commande")
Chemin = S_Commande.Cells(3, 2).Value
Extension = S_Commande.Cells(4, 2).Value
i = 6
Nb = BoucleFichiers(Chemin, Extension)
End Sub
Function BoucleFichiers(Chemin As String, Extension As String) As Integer
Dim Fso As Object
Dim Dossier As Object
Dim Fichier As Object
Dim WB_TargetFichier As Workbook
Dim TargetSheet As Worksheet
Dim MainSheet As Worksheet
Set Fso = CreateObject("Scripting.FileSystemObject")
Set MainSheet = ThisWorkbook.Sheets("Simulations")
BoucleFichiers = 0
j = 9
For Each Dossier In Fso.GetFolder(Chemin).SubFolders
For Each Fichier In Dossier.Files
If Left(Fichier.Name, 11) = "SIMULATION_" Then
Set WB_TargetFichier = Workbooks.Open(Chemin & Dossier & "\" & Fichier.Name)
Set TargetSheet = WB_TargetFichier.Sheets("SIMULATION")
TargetSheet.Range("F6:G13").Select
Selection.Copy
MainSheet.Range("D" & i).PasteSpecial Paste:=xlPasteValues
MainSheet.Range("D" & i).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
i = i + 22
BoucleFichiers = BoucleFichiers + 1
WB_TargetFichier.Close savechanges:=False
End If
Next Fichier
Next Dossier
End Function
J'ai le message d'erreur suivant à propos de la ligne surlignée:
"Erreur d'éxécution 1004: Excel ne peut pas accéder au fichier "<< \\sharefrance...\SIMULATION_ADS.xlsx >>"
Mais l'adresse donnée est exactement celle où je veux accéder
Veuillez m'excuser, il y avait une erreur dans mon chemin.. Aussi petite soit-elle, l'accès était bloqué !
Merci beaucoup MFerrand pour ton aide, bon week-end de trois jours à toi, et aux autres membres du forum !
SkillzZ
Bonsoir,
Intermède de travaux jardin prolongés un peu !
Essaie aussi de dissocier l'ouverture de l'affectation à la variable : tu ouvres, puis tu affectes ensuite le classeur actif, pour voir si cela change quelque chose ou non.
Cordialement.