Pbm d'exécution - copie d'une page dans un nouveau fichier avant chaque sauvergarde

CharlotteG

XLDnaute Nouveau
Rebonjour le forum !

Après plusieurs heures perdues à essayer de comprendre pourquoi ma macro ne fonctionne pas, je me tourne vers vous en espérant que quelqu'un pourra m'aider :)

J'ai une macro qui s'exécute automatiquement avant chaque sauvergarde. Son but : copier un énorme tableau dans un nouveau fichier qu'elle enregistre sous un nom (Matrice au [date du jour] à [heure]).

Tout fonctionne bien SAUF quand le tableau est filtré, là il y a une erreur d'exécution 1004 : "impossible de copier coller les informations car les zones copier et de collage sont de forme et de taille différentes".
Quand je fais l'opération manuellement (avec le tableau d'origine filtré), il n'y a pas de beug. Pourquoi alors y a-t-il un problème quand la macro s'exécute??

Voici le code :


Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Application.ScreenUpdating = False

' But de la macro = effectuer une sauvegarde dès enregistrement.

Dim CLM As String                        ' Nom de la feuille active
Dim rng As String                        ' Nom de la cellule active
Dim Classeur_Maître As String            ' Nom du classeur actif
Dim Classeur_Slave As String             ' Nom du classeur destination
Dim ChDir As String                      ' Emplacement du classeur
Dim stHeureExport As String              ' heure (hh/mm/ss)
Dim Nomfichier As String                 ' Nom d'enregistrement de la sauvegarde automatique.
Dim datejour As String                   ' Date d'aujourd'hui

CLM = ActiveSheet.Name
rng = ActiveCell.Address
datejour = Format(Now(), "dd-mm-yyyy")
stHeureExport = Format(Hour(Time), "00") & "'" & Format(Minute(Time), "00") & "'" & Format(Second(Time), "00")
        
Classeur_Maître = ActiveWorkbook.Name

' Mémorise le chemin du classeur.
ChDir = Application.ActiveWorkbook.Path 'chemin courant
ChDir = ChDir & "\Historique des matrices"

' On enregistre la matrice dans un nouveau fichier. On met l'heure sous forme heure / minutes / secondes (comme ça il n'y a pas de doublon).
Nomfichier = "\Matrice au " & datejour & "_" & stHeureExport
Classeur_Slave = ChDir & Nomfichier

Application.DisplayAlerts = False
   ActiveSheet.Copy
    Cells.Select
    Selection.Copy

       Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
        , SkipBlanks:=False, Transpose:=False
    ActiveWorkbook.SaveAs Filename:=Classeur_Slave
       
    ActiveWorkbook.Close
    
' On revient à la cellule où l'utilisateur se trouvait.
        
Sheets(CLM).Select
Range(rng).Select



End Sub


Pourrait-il y avoir d'autres risques de beug lors de l'exécution de cette macro (cellules fusionnées, lignes ou colonnes masquées, volets figés...)?

J'espère que quelqu'un pourra m'aider :)

Un grand merci d'avance !
 
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Pbm d'exécution - copie d'une page dans un nouveau fichier avant chaque sauverga

Bonjour CharlotteG,

Que se passe-t-il lorsque tu écris ActiveSheet.Copy??
Sauf erreur, Excel fait déjà une copie de la feuille active dans un nouveau classeur!? À quoi servent donc les trois instructions suivantes:
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste ...


En faisant une copie de la feuille, pas de risque de messages d'erreurs (par contre, si un filtre est activé ... il le sera aussi dans le nouveau classeur)
Tu peux utiliser la méthode ShowAllData appliquée à la feuille active (avant ou après la copie, à toi de voir!?). Restera à gérer les erreurs éventuelles au cas où un filtre ne serait pas actif :confused:
 

CharlotteG

XLDnaute Nouveau
Re : Pbm d'exécution - copie d'une page dans un nouveau fichier avant chaque sauverga

Aaaaah mais oui c'était un peu bête en effet...merci :eek:

En fait mon idée était :
1) de copier l'onglet
2) créer un nouveau fichier
3) copier les données dans ce nouveau fichier
4) enregistrer et fermer ce nouveau fichier
5) retourner sur le fichier source sans le fermer

Du coup si j'enlève les 3 lignes, plus de beug dû à des filtres. Le classeur change de nom et s'enregistre et se ferme. Mais du coup, comment faire revenir l'utilisateur sur le fichier principal (la source en quelque sorte)? Est-ce qu'il faut ouvrir à nouveau le fichier (aller le chercher sur le serveur etc) ou il y a une astuce? :)
Dsl je ne suis pas très douée !! J'ai essayé le code ci-dessous mais ça ne marche pas... :confused::

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Application.ScreenUpdating = False

' But de la macro = effectuer une sauvegarde dès enregistrement.

Dim CLM As String                        ' Nom de la feuille active
Dim rng As String                        ' Nom de la cellule active
Dim Classeur_Maître As String            ' Nom du classeur actif
Dim Classeur_Slave As String             ' Nom du classeur destination
Dim ChDir As String                      ' Emplacement du classeur
Dim stHeureExport As String              ' heure (hh/mm/ss)
Dim Nomfichier As String                 ' Nom d'enregistrement de la sauvegarde automatique.
Dim datejour As String                   ' Date d'aujourd'hui

CLM = ActiveSheet.Name
rng = ActiveCell.Address
datejour = Format(Now(), "dd-mm-yyyy")
stHeureExport = Format(Hour(Time), "00") & "'" & Format(Minute(Time), "00") & "'" & Format(Second(Time), "00")
        
Classeur_Maître = ActiveWorkbook.Name

' Mémorise le chemin du classeur.
ChDir = Application.ActiveWorkbook.Path 'chemin courant
ChDir = ChDir & "\Historique des matrices"

' On enregistre la matrice dans un nouveau fichier. On met l'heure sous forme heure / minutes / secondes (comme ça il n'y a pas de doublon).
Nomfichier = "\Matrice FOOD au " & datejour & "_" & stHeureExport
Classeur_Slave = ChDir & Nomfichier

Application.DisplayAlerts = False
 
    ActiveWorkbook.SaveAs Filename:=Classeur_Slave
       
   Classeur_Slave.Close
   Classeur_Maître.Open

' On revient à la cellule où l'utilisateur se trouvait.
        
Sheets(CLM).Select
Range(rng).Select



End Sub
 

Modeste

XLDnaute Barbatruc
Re : Pbm d'exécution - copie d'une page dans un nouveau fichier avant chaque sauverga

Re,

Euh ... tant que ta macro s'exécute, c'est que ton fichier "principal" est toujours ouvert, non? Quand tu enregistres, puis que tu fermes le "Classeur_Slave", ton "Classeur_Maître" n'est plus à l'écran :confused:

D'autre part, tu ne peux -de toute façon- pas écrire Classeur_Maître.Open puisque ta variable Classeur_Maître est de type String (plus haut, tu as fait Classeur_Maître = ActiveWorkbook.Name)

Enfin, il faudrait que tu expliques pourquoi tu as utilisé l'événement Before_Save de ton classeur principal, pour déclencher la création de cet autre classeur?
 

CharlotteG

XLDnaute Nouveau
Re : Pbm d'exécution - copie d'une page dans un nouveau fichier avant chaque sauverga

Enfin, il faudrait que tu expliques pourquoi tu as utilisé l'événement Before_Save de ton classeur principal, pour déclencher la création de cet autre classeur?

Il s'agit d'un classeur partagé, qui est modifié par beaucoup de personnes. L'idée, c'était de créer une copie parallèle de l'onglet dans un dossier juste avant l'enregistrement. Ainsi à chaque enregistrement, une copie de l'onglet se crée dans un dossier "Historique des matrices".
Cela permet d'avoir une trace des modifications et de pouvoir retrouver ce qui a été modifié (surtout dans le cas où des données importantes ont été perdues !)
La création de ce classeur supplémentaire se fait sans que l'utilisateur ne le voit. De son point-de-vue, il enregistre le fichier, c'est tout.

Euh ... tant que ta macro s'exécute, c'est que ton fichier "principal" est toujours ouvert, non? Quand tu enregistres, puis que tu fermes le "Classeur_Slave", ton "Classeur_Maître" n'est plus à l'écran

Aah oui je comprends l'idée. Hum mais du coup je suis un peu perdue. Que faire pour que le nouveau fichier se crée, s'enregistre et se ferme et qu'à la fin de la macro l'utilisateur reste sur le fichier principal?
 

Modeste

XLDnaute Barbatruc
Re : Pbm d'exécution - copie d'une page dans un nouveau fichier avant chaque sauverga

Re²,

Ah les classeurs partagés ont déjà fait couler beaucoup d'encre (mais il ne me semble pas que les manipulations dans ton code soient incompatibles!?)

Par contre, il y avait un point d'interrogation, à la fin de ma phrase: ton "Classeur_Maître" n'est plus à l'écran? Je ne vois nulle part que ce classeur est (soit, fût, ait été,...) fermé ... il devrait donc toujours être ouvert (selon ma logique) et je remets un point d'interrogation ici ;)
 

CharlotteG

XLDnaute Nouveau
Re : Pbm d'exécution - copie d'une page dans un nouveau fichier avant chaque sauverga

Hehe, j'ai lu trop vite ! Non en effet le classeur principal n'est plus à l'écran :

Quand on renomme le fichier actif, le fichier principal "disparaît" : il n'y a qu'un seul fichier ouvert, et ce fichier porte le nom du nouveau fichier. Lorsqu'on ferme le fichier actif après, on ne retombe pas sur le fichier principal.

Code:
ActiveWorkbook.SaveAs Filename:=Classeur_Slave
       
    ActiveWorkbook.Close

Merci beaucoup pour ton temps en tout cas :)
 

Modeste

XLDnaute Barbatruc
Re : Pbm d'exécution - copie d'une page dans un nouveau fichier avant chaque sauverga

Bonsoir,

Hehe, j'ai lu trop vite !
Je me demande si tu ne vas pas un peu vite en besogne aussi pour modifier ton code: tu as supprimé, entre le message #1 et le message #3 les trois lignes que je mettais en question ... Soit, mais tu as aussi supprimé le ActiveSheet.Copy ... ce que ton code fait maintenant est donc différent de ta demande initiale: tu fais (me semble-t-il) l'équivalent d'un "Enregistrer sous"

... Si tu repasses par ici, je t'invite à prendre le temps de réfléchir, étudier ton code en pas-à-pas, essayer de comprendre et t'assurer que tu obtiens bien le résultat escompté!?
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 900
Membres
101 834
dernier inscrit
Jeremy06510