Ouvrir/MàJ/Fermer classeur en VBA
Bonjour à tous,
Je suis en train de travailler sur une macro qui me permettrait de faire la mise à jour de mes connexions à l'ouverture de mon fichier maître. J'ai fait des recherches sur comment ouvre/fermer un fichier, pour ouvrir pas de soucis mais impossible de le fermer. J'ai l'impression qu'il essaye d'abord de fermer le fichier avant même de l'avoir ouvert (Erreur 424 : Objet requis sur le premier Workbooks.().close, puis les fichiers s'ouvrent mais ne se ferme pas)
Voici le code que j'ai utilisé
Sub Ouverture_MaJ_Fermeture()
'
' Ouverture_MaJ_Fermeture Macro
' Ouvre tous les plans de charges à l'ouverture du classeur Master_Project
' Réalise la mise à jour des plans de charges dans le classeur Master_Project
' Ferme les plans de charges
'
'
With ThisWorkbook
CreateObject("Shell.Application").Open ("C:\Users\nom\Documents\Plan de charge\Picard.xlsx")
CreateObject("Shell.Application").Open ("C:\Users\nom\Documents\Plan de charge\Sephora_RTLE.xlsx")
CreateObject("Shell.Application").Open ("C:\Users\nom\Documents\Plan de charge\Sephora_UPGRADE.xlsx")
ActiveWorkbook.RefreshAll
Workbooks(Picard.xlsx).Close False
Workbooks(Sephora_RTLE.xlsx).Close False
Workbooks(Sephora_UPGRADE.xlsx).Close False
End With
End Sub
Merci d'avance pour votre aide !
Bonjour Padou,
Essaye comme ça
Sub Ouverture_MaJ_Fermeture()
With ThisWorkbook
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Picard.xlsx")
Set WbkS = ActiveWorkbook
ActiveWorkbook.RefreshAll
WbkS.Close False
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Sephora_RTLE.xlsx")
Set WbkS = ActiveWorkbook
ActiveWorkbook.RefreshAll
WbkS.Close False
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Sephora_UPGRADE.xlsx")
Set WbkS = ActiveWorkbook
ActiveWorkbook.RefreshAll
WbkS.Close False
End With
End Sub
Bonjour,
voilà le code que j'utilise lorsque je veux ouvrir et fermer un fichier :
Workbooks.Open Filename:="R:\DATA\2017\...\Etat hebdo.xls", _
UpdateLinks:=True
Windows("Etat hebdo.xls").Close
essaye de l'adapter à ton cas, mais je préfère utiliser "Windows" que "Workbooks" pour fermer les fichiers personnellement.
A plus !
Merci beaucoup pour vos réponses !
J'ai testé les deux et les deux fonctionnent niquel pour l'ouverture/fermeture des classeurs.
Le soucis maintenant est la mise à jour du fichier maître. Si j'ai bien compris dans ton code nunos31, tu ouvres un classeur, le défini en tant que classeur actif, le mets à jour puis le ferme ?
Moi ce que j'aimerais c'est non pas de mettre à jour le fichier que l'on ouvre, mais le fichier "maître".
Je vais essayer d'être plus précis sur le fonctionnement.
J'ai plusieurs classeurs faisant référence à un projet en particulier (RTLE, Upgrade et Picard) qui contient les plans de charge de mes projets, j'ai un classeur maître qui doit venir récupérer tous les plans de charge pour tout avoir au même endroit et pouvoir avoir une visu global rapide et faire des indicateurs de performances.
J'ai réussi à faire la connexion entre le classeur maître et les projets via l'outils de connexion de table windows. Quand je clique sur "actualiser tout" dans l'onglet données du classeur maître, tout se met à jour correctement SI les classeurs projet sont ouvert. Donc pour éviter au pilote projet de devoir ouvrir tous les classeur projet avant de pouvoir faire la mise à jour je souhaite avoir une macro qui ouvre tout les classeurs projet, faire une mise à jour dans le classeur maître pour récupérer les tables, puis refermer les classeurs projet qui ne servent donc qu'à fournir leur table et c'est tout.
J'ai tenté un mix des codes comme ci-dessous, me disant que vu que j'ouvre la macro depuis le fichier maître, il sera considéré comme le ActiveWorkbook pour execturer ActiveWorkbook.RefreshAll, mais cela ne fonctionne pas. Ca ouvre/ferme bien encore une fois mais pas de mise à jour de mes tables
Sub Ouverture_MaJ_Fermeture()
With ThisWorkbook
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Picard.xlsx")
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Sephora_RTLE.xlsx")
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Sephora_UPGRADE.xlsx")
ActiveWorkbook.RefreshAll
Windows("Picard.xlsx").Close
Windows("Sephora_RTLE.xlsx").Close
Windows("Sephora_UPGRADE.xlsx").Close
End With
End Sub
Une autre solution serait de trouver un moyen pour mon fichier maître de faire la récupération des données des tables projets alors que les classeurs projets sont fermés, mais pas trouvé
Merci encore pour votre aide !
Re,
Tu as mis un
With ThisWorkbook
en début de code, alors plutôt que d'utiliser "ActiveWorkbook" il te suffit de mettre
.RefreshAll
qui sera attribué à "ThisWorkbook" automatiquement et comme "ThisWorkbook" sera ton fichier maitre, cela devrait fonctionner !
A plus
J'avais mis ça suite à un "code erreur 9 l'indice n'appartient pas à la sélection", apparemment rajouté ceci permet de ne pas avoir l'erreur, mais je ne connais pas les conséquences de mettre ce genre de chose (je n'ai jamais fais de VBA)
J'ai essayé de ne pas mettre de la ActiveSheet et ne laisser que le .refreshall, mais ça ne fonctionne toujours pas
Sub Ouverture_MaJ_Fermeture()
' Déprotection automatique de toutes les feuilles du classeur
Dim nombre As Integer
Dim Motdepasse As String
Motdepasse = InputBox("Entrer le mot de passe :", "Oter la protection de toutes les feuilles", "")
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Unprotect Password:=Motdepasse
Next i
With ThisWorkbook
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Picard.xlsx")
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Sephora_RTLE.xlsx")
Workbooks.Open ("C:\Users\nom\Documents\Plan de charge\Sephora_UPGRADE.xlsx")
.RefreshAll
Windows("Picard.xlsx").Close
Windows("Sephora_RTLE.xlsx").Close
Windows("Sephora_UPGRADE.xlsx").Close
End With
' Protection automatiques des feuilles du classeur avec le mot de pas précédemment rentré
For j = 1 To nombre
Worksheets(j).Protect Password:=Motdepasse
Next j
End Sub
Et bien tu peux toujours faire comme ceci :
Windows("LeNomDeTonFichierMajeur.xlsm").Activate
ActiveWorkbook.RefreshAll
Si ca ne marche pas, ce sera très étrange.
A plus
PARFAIT !!
Ca marche du tonnerre ! Merci beaucoup pour votre aide !
Voici le code final si un futur membre à un soucis similaire, avec un programme de protection/déprotection automatique des feuilles (trouver sur le forum) en supplément
Sub Ouverture_MaJ_Fermeture()
' Déprotection automatique de toutes les feuilles du classeur
Dim nombre As Integer
Dim Motdepasse As String
Motdepasse = InputBox("Entrer le mot de passe :", "Oter la protection de toutes les feuilles", "")
nombre = ActiveWorkbook.Sheets.Count
Application.ScreenUpdating = False
For i = 1 To nombre
Worksheets(i).Unprotect Password:=Motdepasse
Next i
With ThisWorkbook
Workbooks.Open ("Chemin d'accès fichier 1")
Workbooks.Open ("Chemin d'accès fichier 2")
Workbooks.Open ("Chemin d'accès fichier 3")
Windows("Master_Project_CdS.xlsx").Activate
ActiveWorkbook.RefreshAll
Windows("fichier1.xlsx").Close
Windows("Fichier2.xlsx").Close
Windows("Fichier3.xlsx").Close
End With
' Protection automatiques des feuilles du classeur avec le mot de pas précédemment rentré
For j = 1 To nombre
Worksheets(j).Protect Password:=Motdepasse
Next j
End Sub