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
Rechercher des sujets similaires à "ouvrir maj fermer classeur vba"