Enregistrer sous Fichier déjà ouvert

Bonjour à tous,

Toujours à la ramasse sur VBA, j'ai besoin d'aide sur une macro qui permette de "restaurer" un fichier déjà ouvert.

Explications :

- J'ai 2 fichiers identiques : "original" et "backup"

- Lorsque je suis sur le fichier original, j'aimerais un code qui permette d'ouvrir le fichier "backup", et que ce backup écrase le fichier original.

Çà permettrait de restaurer les modifications que l'utilisateur a commis (car le backup n'est jamais modifié, tandis que l'original est très sollicité)

J'ai fais plusieurs tentatives, notamment celle-ci

Sub RestaurerFichier()

Application.ScreenUpdating = False

If MsgBox("Restaurer le fichier ?", vbYesNo, "Confirmation") = vbYes Then

Workbooks.Open ("C:******\fichier backup.xlsm")

Application.Run "fichier backup.xlsm!RestaurerFichier2"

End If

End Sub

Sub RestaurerFichier2()

Workbooks("C:*****\fichier original.xlsm").Close

Application.DisplayAlerts = False

    Workbooks("fichier backup").SaveAs filename:= _
        "C:\*******\fichier original.xlsm" _
        , FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False

ThisWorkbook.Close

Application.DisplayAlerts = True

Workbooks.Open ("C:\*********\fichier original.xlsm")

End Sub

Malheureusement, ça me dit ceci :

Erreur d’exécution 1004

Impossible d’exécuter la macro RestaurerFichier2. Il est possible qu'elle ne soit pas disponible dans ce classeur ou que toutes les macros soient désactivées.

Quelqu'un saurait me dépanner ?

Merci par avance

Cordialement.

Bonjour,

Il faut mettre des cotes de part et d'autre du nom de classeur :

Application.Run "'fichier backup.xlsm'!RestaurerFichier2"

De toute façon, cela ne fonctionnera pas car l'instruction Close du classeur actif mettra fin au programme. Même si l'exécution de la macro se fait dans le classeur Backup, c'est le classeur Original qui est actif.

Pour que cela fonctionne, il faut lancer la Macro de restauration à partir du Backup (l'original étant fermé).

La macro de restauration peut être présente dans les 2 classeurs, il faut juste rajouter un test pour que la restauration ne se fasse que si l'on est dans le classeur Backup.

Comme ceci

Sub RestaurerFichier2()

Dim i, a$

If ThisWorkbook.Name = "Fichier Backup.xlsm" Then ' uniquement si on est sur un backup

    ' Vérif si original est ouvert
    For i = 1 To Workbooks.Count
        If Workbooks(i).Name = "fichier original.xlsm" Then
            ' Rejet le classeur est ouvert
            MsgBox "L'original est ouvert", vbOKOnly, "Restaurer"
            Exit Sub
        End If
    Next i

    ' Copie
    Application.DisplayAlerts = False

    On Error Resume Next

    ThisWorkbook.SaveAs Filename:= _
        "C:\*******\fichier original.xlsm" _
        , FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False

    Application.DisplayAlerts = True

    i = Err.Number: a$ = Err.Description

    On Error GoTo 0

    If i <> 0 Then
        MsgBox "Erreur " & i & " : " & a$, vbOKOnly, "Restaurer; "
    Else
        MsgBox "L'original est restauré", vbOKOnly, "Restaurer"
    End If

Else
    MsgBox "Le classeur doit être un Backup", vbOKOnly, "Restaurer"

End If

End Sub

A mettre au point selon ton projet.

Bonne journée

Eric

Bonjour Eric,

Je te remercie!

J'ai tenté ton code mais cela ne fonctionne pas. J'ai tenté de l'arranger, sans succès.

Voici ce que j'ai compris :

- Vérifier si l'original est ouvert. S'il l'est, on arrête tout

- S'il ne l'est pas ET que le fichier qui exécute le code s'appelle "backup" ET est ouvert, on écrase l'original

Donc ça oblige forcément l'utilisateur à déclencher le code via le backup ?

Il faudrait que je fasse un système à 2 clics peut-être ?

L'un permettant d'ouvrir le backup,

L'autre permettant de fermer l'original + exécuter le code du backup ?

Je m'embrouille un peu sûrement.

Merci à toi

Cordialement

Bonsoir,

- Vérifier si l'original est ouvert. S'il l'est, on arrête tout

Oui, car on ne pourra pas l'écraser s'il est ouvert.

- S'il ne l'est pas ET que le fichier qui exécute le code s'appelle "backup" ET est ouvert, on écrase l'original

C'est cela, il est forcément ouvert puisqu'on exécute le code qui s'y trouve.

Donc ça oblige forcément l'utilisateur à déclencher le code via le backup ?

Bien sûr, je pensais que c'était le but recherché.

Il faudrait que je fasse un système à 2 clics peut-être ?

L'un permettant d'ouvrir le backup,

L'autre permettant de fermer l'original + exécuter le code du backup ?

On revient au problème de départ, la fermeture de l'original mettra fin au programme.

La solution la plus simple serait de recopier l'intégralité des données du backup dans l'original.

1 : On est sur le classeur Original

2 - Clic sur le bouton "Restaurer"

3 - Ouverture du Backup (Tester si existe)

4 - Recopie des données du Backup dans l'original

5 - Refermer le Backup

6 - Enregistrer l'original

Pour créer le backup il suffira de faire une macro avec un save as...

Tout ça est à étudier

Bonne soirée

Rechercher des sujets similaires à "enregistrer fichier deja ouvert"