VBA Vider le ThisWorkbook
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonsoir au forum,
Private Sub Workbook_Open()
Call ToutesLesHeures
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call AnnuleToutesLesHeures
End Submacros associées :
Dim H As Date
Sub ToutesLesHeures()
On Error GoTo Fin
H = Now + TimeValue("01:00:00")
Application.OnTime Format(H, "hh:mm:ss"), "ToutesLesHeures"
ActiveSheet.Shapes("Forme automatique 87").Visible = True 'note
Fin:
End Sub
Sub AnnuleToutesLesHeures()
Application.OnTime Format(H, "hh:mm:ss"), "ToutesLesHeures", , False
End SubAu changement d'année, ou quand le base est trop pleine, j'ai un bouton "purge"
qui vide la base et enregistre le fichier sous un nouveau nom.
Sub purge()
Dim Rep As Integer
If Application.WorksheetFunction.CountA(Range("b8:b15")) > 0 Then
MsgBox ("des saisies ne sont pas validées !")
Range("a3") = 2
Call affichage
Exit Sub
End If
Rep = MsgBox("êtes-vous sûr de vouloir purger la base ?", vbYesNo + vbCritical + vbDefaultButton2, "Vide la main courante ")
If Rep = vbYes Then
'******* [color=red]c'est là que je voudrais vider le ThisWorkbook *[/color]*********
ActiveWorkbook.Save
Range([base!e6], [base!b65536].End(xlUp)).EntireRow.Delete
MsgBox ("La main courante est maintenant Vidée !" & Chr(10) & "enregistrez le fichier sous un nouveau nom")
Application.Dialogs(xlDialogSaveAs).Show
End If
End Subproblème:
Si j'ouvre l'ancien fichier avec le nouveau, la gestion de l'horloge s'affole !
d'où ma question : vider le ThisWorkbook.(qui n'a plus d'utilité sur l'ancien fichier)
Si galopin01 passe par là, il reconnaîtra ses codes.
Bonne fin de soirée
Claude.
Salut le forum
Sur une macro de Laurent Longré, le fichier n'aura plus aucune macro
With ActiveWorkbook.VBProject
'cette partie du code est de Laurent Longre
For Each VBC In .VBComponents
If VBC.Type = 100 Then
With VBC.CodeModule
.DeleteLines 1, .CountOfLines
.CodePane.Window.Close
End With
Else: .VBComponents.Remove VBC
End If
Next VBC
End WithPour utiliser ce code, il vous faudra charger une référence supplémentaire dans VBE.
Sous Excel, appeller l'éditeur :
Alt F11 //Outils/Références…
Cocher l'option :
Microsoft Visual Basic for Applications Extensibility
Mytå
Re le forum
Pour des procédures connues, j'utiliserais plutôt les codes suivants
Sub SupprimerModule(NomModule As String)
With ThisWorkbook.VBProject.VBComponents(NomModule).CodeModule
.DeleteLines 1, .CountOfLines
End With
End SubL'appel de la macro
Sub essai()
SupprimerModule "ThisWorkbook"
End SubMytå
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
bonsoir Mytå,
Sur une macro de Laurent Longré, le fichier n'aura plus aucune macro
non, je veux conserver les macros (elles ne gènent pas)
simplement supprimer :
Private Sub Workbook_Open()
Call ToutesLesHeures
End Subet :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call AnnuleToutesLesHeures
End Subamicalement
Claude.
Re Claude
Le deuxième code fait ce que tu demandes, tu ne lis pas les messages avant de répondre
Mytå
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
Toujours aimable !
j'ai essayé le sub essai() , et çà marche pas
je comprends pas
je verrais çà demain
Claude.
Re le forum
Claude un fichier exemple, avec trois possibilités
la Feuil1, le ThisWorkBook et un Module
https://www.excel-pratique.com/~files/doc/Suppression_Macro.xls
Mytå
P.S. Une autre macro à conserver dans Cours et Astuces, pas le temps de mettre
en forme le fichier Excel avec toutes les possibilités.
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
çà y est, j'ai pigé,
merci Mytå
ce coup-ci je vais me coucher !
à+.....Claude.
Re le forum
Bonne nuit, Claude.
A tête reposée, tu aurais surement compris plus vite ma macro, il y a
des soirs comme cela on ne voit pas la solution (Tu n'es pas le seul...)
A+
Mytå
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonjour Mytå et à tous,
Bon, vu pour les codes, çà fonctionne.
Mais c'est mon raisonnement qui ne va pas !
Peut-être que je prends le problème à l'envers !
Ce que je souhaitais faire :
- Quand la base est pleine, la purger et enregistrer sous un nouveau nom. (çà, je sais faire)
seulement, l'ancien fichier à toujours les Private Sub qui gérent des actions Time (horloge), et si on ouvre un ancien
fichier avec le nouveau ouvert, çà fout le souk dans l'horloge.
c'est pourquoi je voulais supprimer ces fonctions horloge dans les fichiers remplis et archivés.
- Si je mets en place les codes à Mytå, je perds les Private Sub sur le fichier actif !
Peut-être faire un fichier modèle vierge ?
Si quelqu'un à une idée sur le sujet, je suis preneur !
le fichier en question est à la fin de ce lien : "MAIN_COURANTE_6"
https://www.excel-pratique.com/forum/viewtopic.php?t=7523
Bonne journée
Amicalement
Claude.
Salut le forum
Claude, la macro sera éffacée sur le fichier qui vient d'être enregistré.
Sub Efface_Macro()
Dim NomSource$, CheminDest$, NomDest$
Dim VBC As Object
NomSource = ThisWorkbook.Name
CheminDest = "C:\Sauvegarde_MC\" 'à adapter
NomDest = "Essai.xls" 'à adapter
Workbooks(NomSource).SaveAs CheminDest & NomDest
With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
.DeleteLines 1, .CountOfLines
End With
End SubMytå
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonsoir Mytå,
la macro sera éffacée sur le fichier qui vient d'être enregistré.
Quelque chose m'échappe !
le fichier qui vient d'être enregistré. c'est celui qui sera actif (à l'écran) ? . non ?
Je ferais l'essai demain matin
mais j'ai l'impression que c'est le contraire qu'il me faudrait.
enfin je ne dis rien avant les essais demain.
en tout cas merci Mytå de ne pas me laisser tomber .
amicalement
Claude.
Salut le forum
Claude, pour vraiment comprendre.
Tu es dans un Fichier A, tu veux le sauvegarder en Fichier B.
On efface la macro dans le Fichier A ou le Fichier B.
On garde ensuite quel fichier ouvert le A ou le B ?
A te relire
Mytå
Si je peux me permettre...
J'ai lu un petit peu le topic en question.
Pour avoir déjà utilisé ce genre de routine, je résoud habituellement ce genre de problème de la manière suivante :
Soit un fichier qui s'appelle "MAIN COURANTE.xls" (par exemple...) :
1- Je ne fais jamais de CopyAs
2- On peut faire autant de SaveCopyAs qu'on le veut (soit pour faire des sauvegardes périodiques soit pour faire des fichiers d'archives.
Les fichiers de sauvegardes peuvent être écrasés de manière cycliques, les fichiers d'archives peuvent avoir un autre cycle, peu importe...
Dans tous les cas on travaillera toujours sur le même fichier "MAIN COURANTE.xls" (éventuellement purgé après un archivage)
Pour qu'une macro ne s'applique qu'à "MAIN COURANTE.xls" (et pas aux fichiers d'archives ou de sauvegardes) il suffit de modifier le Workbook_Open comme suit :
Private Sub Workbook_Open()
If ThisWorkbook.Name = "MAIN COURANTE.xls" Then Call ToutesLesHeures
End SubLes utilisateurs ne sont pas dépaysés : ils travaillent toujours sur le même fichier et... ton problème est résolu !
A+
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bon Dimanche à tous,
Pour que se soit clair pour tout le monde et surtout aux utilisateurs,
J'ai fait un shéma du chemin d'accès.(tel que je le vois)
galopin01, je suis ton idée qui me parait à la fois simple et efficace.
- il faudrait simplement ajouter la date pour archivage.
jete un oeil sur les macros (s'il n'y a pas de lézard !)
Fichier du schéma :
https://www.excel-pratique.com/~files/doc/chemin.xls
merci pour votre aide.
amicalement
Claude.
édit: faut-il mettre la même condition dans le : Private Sub Workbook_BeforeClose(Cancel As Boolean)
bonjour,
inutile de faire compliqué quand on peut faire simple...
Les fichiers de sauvegarde ne doivent pas être enregistrés sous le même nom que le fichier de travail. Même dans un répertoire différent ! (sinon il y aura le problème de OnTime évoqué précédement à chaque ouverture.
En conséquence et comme il n'y a qu'un fichier de sauvegarde je suggère de nommer la sauvegarde :
Main_courante.sav
Dans cette hypothèse la ligne de commande de la sauvegarde horaire pourrait s'écrire :
Workbooks(Wb).SaveCopyAs "Main_courante.sav"
Avantage : la macro Workbook_Open ne lance pas le OnTime("ToutesLesHeures")
Il me semble inutile de créer un répertoire "sauvegarde" pour un unique fichier qui sera de surcroit invisible depuis Excel... On peut donc bien enregistrer dans le répertoire de travail habituel.
On pourrait faire la même observation pour les fichiers d'archives qui devraient être en nombre limité. Ils pourraient êre baptisés Main_couranteNNNN.old (parexemple) et rangés dans le répertoire habituel.
Pour avoir à gérer un nombre important de copies et de sauvegardes je recommande cette méthode simple qui épargne, le besoin venu, d'être obligé de rechercher dans une arborescence diabolique ou peut-être caché ce p... de fichier !
Dans cette hypothèse la ligne d'archivage pourrait s'écrire
Workbooks(Wb).SaveCopyAs "Main_courante_" & Right(Year(Date), 2) & Format(Month(Date), "00") & ".old"
Cette méthode simplifiera d'autant les macros (plus besoin de TWay, TDest et autres WbDest...
Attention : Ne pas confondre copie de sécurité et sauvegarde.
Une copie de sécurité ou d'archive ne peut être assimilé à une sauvegarde : Une sauvegarde doit être effectuée sur un support physique indépendant du support d'origine. (et pour bien faire indépendant de la machine d'origine...)
A+
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
Oui d'accord, c'est encore mieux sans création de répertoire !
Mais comment je fais, si j'ai un pépin sur le .xls en cours, pour le supprimer et le remplacer par le .sav ?
Et le .sav, il faudra le renommer en xls, non ?
Pas si facile que çà, tout çà !
Pour l'archivage, c'est nickel.
Te moque pas, je n'ai encore jamais utilisé d'extension .Sav ou .Old ! !
Claude.
?
Tu voudrais faire ça en VBA ?
Selon mon expérience cette hypothèse n'a guère de sens. Il est impossible de prévoir tous les cas de figure qui peuvent entrainer l'utilisation du fichier de sauvegarde ou du fichier d'archive à la place du fichier d'origine.
La suppression d'un fichier peut se faire via l'explorateur Windows ou via Excel dans Fichier / Ouvrir + Clic droit sur le fichier + Supprimer
Le "renommage" d'un fichier *.sos ou *.sav peut se faire via l'explorateur Windows ou via Excel dans Fichier / Ouvrir :
Dans la boite de dialogue (tout en bas) chosir type de fichier Tous les fichiers *.* pour faire apparaître les fichiers à extensions "exotiques"
Avec clic droit choisir renommer et modifier l'extension en .xls pour que le fichier soit à nouveau reconnu.
Nota : Cette méthode était très cool avec les versions d'Excel jusqu'à 2003 je ne sais pas dans quelle mesure elle sera encore utilisable avec les versions plus récentes qui génèrent un pléthore de fichiers variés...
Toujours selon mon expérience... une pseudo-sauvegarde horaire a de forte chance d'être totalement inefficace : Selon mon copain Murphy qui prétend qu'un problème informatique est toujours soumis à la loi de l'emmerdement maximum, une telle sauvegarde à de forte chance d'être écrasée cinq ou six fois avant même que tu te rendes compte d'un problème. Par suite, tu as de forte chance de récupérer un fichier déjà gravement endommagé voire inutilisable...
Personnellement pour les fichiers sensibles que je gère, j'ai opté pour une sauvegarde mensuelle + 4 archives hebdomadaires (numérotés de 1 à 4) + 1 copie quotidienne (numérotés de 1 à 7) Il n'y a pas de copies horaires car mon type de données ne le justifie pas.
Cette précision est juste pour te faire mettre le doigt sur la faiblesse d'une copie horaire qui écrase la précédente... En cas de dysfonctionnement tu as de forte chance d'être obligé de repartir sur l'archive de l'an dernier...
Pas si facile ? Renommer l'extension d'un fichier de .sos en .xls est aussi simple que de renommer le fichier lui-même. De toute façon tu seras obligé de passer par un renommage puisque tu ne peux garder le nom du fichier d'origine soit parce qu'il aura une date d'archive, soit parce que ta sauvegarde horaire ne peut pas avoir le même nom que le fichier d'origine...
A+
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonsoir à tous,
galopin01, je ne peux pas accepter çà ! !
On aurait fait tout çà, pour en arriver là ?
A quoi sert une sauvegarde si on ne peut la récupérer sans faire tout un souk !
là, tu m'as refroidi ! , c'était presque gagné.
Mais comme je ne baisse pas les bras comme çà, je reviens sur le répertoire "Sauvegarde".
Dans le cas où il arrive un pépin sur le fichier en cours :
- j'imagine un bouton "Réparation" , qui copierait du répertoire "sauvegarde" dans le répertoire de travail et fermerait.
sans enregistrer.
- à la ré-ouverture, je me retrouve avec la dernière version avant le pépin.
C'est sûrement pas très académique, mais çà doit marcher.
Je vais réfléchir encore et prendre un peu de recul.
En tout cas je te remercie encore pour tes conseils et le temps que tu veux bien me consacré.
Amicalement
Claude. (un peu déçu)
Bah !
J'étais bien conscient de jeter une pierre dans ton jardin... Et j'en suis désolé !
L'utilisation d'un bouton de "restauration" n'a rien à voir avec le lieu de stockage ni le nom des fichiers sources et destination.
Une restauration est juste l'opération inverse de la sauvegarde : Pas difficile d'écrire la macro inverse.
mébon, je voulais quand même mettre le doigt ou ça fait mal... Je ne peux pas évaluer pour toi l'opportunité de faire comme ci ou comme ça, mais quelques rappels n'ont jamais fait de mal à personne...
A+