VBA : supprimer un classeur à sa fermeture

dionys0s

XLDnaute Impliqué
Bonjour le forum ^_^

Je cherche à supprimer (kill) un classeur lors de sa fermeture. Ca peut vous sembler tordu, mais ça ne l'est pas. Ce n'est pas un classeur temporaire (il est enregistré), et l'utilisateur qui va utiliser le fichier va le générer en pdf et l'enregistrer ailleurs. Il n'est donc plus utile et j'aimerais qu'il se supprime automatiquement du répertoire où il est enregistré. J'ai bien trouvé un topic à ce sujet sur XLD (lien) mais qui ne concerne qu'un fichier qui n'a pas été enregistré.

Avez-vous une idée de comment procéder ? Idéalement, j'imagine que ce code serait à intéger dans le ThisWorkbook beforeclose non ?

D'avance merci pour votre aide
 

tototiti2008

XLDnaute Barbatruc
Re : VBA : supprimer un classeur à sa fermeture

Bonjour dionys0s,

Si un classeur est ouvert, on ne peux pas le supprimer
mais si ton classeur n'est pas ouvert, son code VBA ne peut s'exécuter

donc tu ne peux pas supprimer le fichier d'un classeur avec un code situé dans ce même classeur...
 

dionys0s

XLDnaute Impliqué
Re : VBA : supprimer un classeur à sa fermeture

Bonjour tototiti2008

Rapide la réponse ! Merci pour ça.
Est-il possible de contourner le problème ? Par exemple le fichier qui doit être généré crée un classeur temporaire qui lui supprime le fichier et qui se ferme sans se sauvegarder ? C'est tordu je sais...
 

tototiti2008

XLDnaute Barbatruc
Re : VBA : supprimer un classeur à sa fermeture

Re,

Donc tu veux créer un classeur avec du code qui supprimera le classeur qui l'a créé après l'avoir fermé ???

Euh, pourquoi pas mais comment saura-t-il qui l'a créé ? Non, je plaisante ;)

Il est clair qu'il faut que ton code de suppression soit extérieur au classeur à supprimer, puisqu'on ne pourra l'exécuter que lorsqu'il sera fermé. Alors ça peut passer par une macro complémentaire, par exemple, et l'appel d'un de ses codes pour fermer le fichier à supprimer puis le supprimer.
 

dionys0s

XLDnaute Impliqué
Re : VBA : supprimer un classeur à sa fermeture

Aller hop je m'y colle... je sens que ça va pas être de la tarte

Deux petites questions pour m'aider dans ma tâche :

* Lorsque j'aurai créé mon classeur temporaire (Workbook.Add ?), je suppose qu'il est inutile de mettre un Private Sub Workbook_Open() dans le module ThisWorkbook vu qu'il ne sera jamais ouvert à partir d'un répertoire mais juste créé ex nihilo. Est-il donc possible que le classeur qui va être supprimé ordonne au classeur temporaire d'executer la macro qui le supprimera ?
J'ai inventé l'euthanasie version Excel. J'assume :D

* Comment on fait pour ordonner à un classeur de se fermer sans s'enregistrer ?

Merci bcp pour votre aide en tout cas ^^
 

tototiti2008

XLDnaute Barbatruc
Re : VBA : supprimer un classeur à sa fermeture

Re,

Bon, si tu préfères la méthode compliquée, à toi de voir ;)

J'ai inventé l'euthanasie version Excel.

Ce n'est pas de l'euthanasie, c'est un parricide ;)

Personnellement j'ai déjà injecté du code dans un classeur, mais je n'ai jamais essayé de l'exécuter dans la foulée
Pour écrire le code dans le classeur, tu devrais aller voir par là :
Visual Basic Editor

Edit : Bonjour Softmama
 

Softmama

XLDnaute Accro
Re : VBA : supprimer un classeur à sa fermeture

Re,

Donc (mais sans avoir testé), je pense que ce code à adapter doit pouvoir répondre à ton problème :
VB:
Sub Voyonsca()
    'Nécéssite d'activer la référence
   '"Microsoft Visual basic For Application Extensibility 5.3"
   Dim X As Integer
   Wb = ActiveWorkbook.Name
    Workbooks.Add
     
    With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
        X = .CountOfLines
        .InsertLines X + 1, "Private Sub Workbook_BeforeClose(Cancel As Boolean)"
        .InsertLines X + 2, "Dim Wb as Workbook"
        .InsertLines X + 3, "Set Wb = Workbooks(" & Wb & ")"
        .InsertLines X + 4, "Wb.Close False"
        .InsertLines X + 5, "Kill Wb"
        .InsertLines X + 6, "Activeworkbook.Close False"
        .InsertLines X + 7, "End Sub"
    End With
End Sub

Macro à lancer quand t'as besoin de détruire le fichier source. Teste de ton côté et fais moi savoir si tu rencontres d'autres problèmes avec ce code.
 

Staple1600

XLDnaute Barbatruc
Re : VBA : supprimer un classeur à sa fermeture

Bonjour à tous


Un code de Masaru Kaji (proche de celui de Softmama que je salue)
Code:
Sub Suicide1()
   Dim objNB As Object
    Set objNB = Workbooks.Add
    With ThisWorkbook
        Open .Path & "\xx.bas" For Output As #1
        Print #1, "Sub Temp"
        Print #1, "Workbooks(" & """" & .Name & """" & ").Close False"
        Print #1, "Kill " & """" & .Path & "\" & .Name & """"
        Print #1, "Kill " & """" & .Path & "\xx.bas" & """"
        Print #1, "ThisWorkbook.Close False"
        Print #1, "End Sub"
        Close #1
    objNB.VBProject.VBComponents.Import Filename:=.Path & "\xx.bas"
    End With
    Application.OnTime Now(), objNB.Name & "!Temp"
End Sub

PS: code testé par ses soins puisque publié sur le net ;)
 
Dernière édition:

dionys0s

XLDnaute Impliqué
Re : VBA : supprimer un classeur à sa fermeture

Bonjour Softmama

Merci beaucoup pour ton attention :)
Ca ne marche pas encore. Je dois aller déjeuner donc je n'ai pas tellement le temps de regarder tout de suite mais j'y reviendrai promis. J'ai pu constater d'ores et déjà qu'il n'ajoute pas les guillemets alors que c'est explicitement demandé :confused:
 

Softmama

XLDnaute Accro
Re : VBA : supprimer un classeur à sa fermeture

Re Dyonisos,
Salutations Staple1600,

La macro ajoute un module ds un nouveau classeur, sans les guillemets, c'est normal. Par contre, j'ai oublié de prévoir de lancer la macro en question ^^. Vois le code de Staple qui a l'air tout prêt pour tes besoins, on n'aura du coup pas besoin de corriger les erreurs de mon code :)
 

sigismond

XLDnaute Occasionnel
Re : VBA : supprimer un classeur à sa fermeture

Bonjour à tous,

J'ai été attiré par le concept de votre discussion.

J'ai essayé le code proposé par Stapple, chez moi sous 2003 il ne marche pas.

Je suis donc remonté aux sources pour faire une recherche sur Masaru Kaji(merci Stapple de nous faire partager tes bons liens).

L'honorable japonais nous propose une deuxième piste que je trouve d'une grande élégance :
Un processus en mémoire ne peut faire un kill sur le fichier dont il est issu.
Il contourne le problème en modifiant le mode d'ouverture du fichier : en le passant en lecture seule ; et là ... ça marche !

Ci-joint un message qui s'auto-détruit après lecture :D
 

Pièces jointes

  • AutoDestruction2.xls
    15.5 KB · Affichages: 686
  • AutoDestruction2.xls
    15.5 KB · Affichages: 827

Discussions similaires

Réponses
2
Affichages
121

Statistiques des forums

Discussions
312 339
Messages
2 087 407
Membres
103 537
dernier inscrit
alisafred974