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
 

Usine à gaz

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

Re-Bonjour encore LOL

Plusieurs questions me viennent à l'esprit :

1 - Quand l'utilisateur va ouvrir le classeur sur son ordi, excel va lui demander d'activer les macros.
S'il ne le fait pas = pas d'exécution de macros.

Je sais masquer les feuilles et faire une petite macro pour les afficher (au moins ça LOL)

Est-il possible de prévenir l'utilisateur qu'il doit obligatoirement activer les macros pour voir les feuilles et pouvoir travailler dedans ?

2 - Je mettrais un mot de passe vba pour empêcher la modification ou suppression de la macro.
Malgré cela, un bon bidouilleur ou un pro de VBA peut-il avoir accès aux macros ?
Est-il possible de masquer la macro ou de la cacher ?

Merci pour votre gentillesse et peut-être que mes questions seront utiles pour les "intéressés" de ce Killer ?
Je joins le fichier : dans la macro, j'ai indiqué le chiffre 100000 pour qu'elle ne s'exécute pas.
Amicalement,
Lionel,
 

Pièces jointes

  • TestAutod01.xlsm
    65.3 KB · Affichages: 38
  • TestAutod01.xlsm
    65.3 KB · Affichages: 39

dionys0s

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

Re,

non, il s'agit de créer une nouvelle discussion sur ce forum...
Capture d’écran 2015-10-08 à 13.31.19.jpg
 

svdvet

XLDnaute Nouveau
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
 

svdvet

XLDnaute Nouveau
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 ;)

Bonjour à tous,
Ici,
osX sierra, excel mac 2011,
pour plusieurs Workbook temporaires créés par macro:
j'ai une macro qui crée un workbook temporaire (https://www.rondebruin.nl/win/section1.htm) que je voulais effacer après création et envoi duPDF. Pour ne pas avoir ce WkB temporaire à l'affichage et surtout l'impossibilité de l'effacer de l'écran tant que le userform n'est pas déchargé, j'ai du ruser et modifier un peu (juste avec Wb.Windows(1).Visible= true or false). Je n'ai pas trouvé de méthode pour rendre ce WkB tempo en lecture seule,… si quelqu'un a une idée,…

Sub Suicide1()
Dim xx As String
Dim Wb As Object

Set Wb = ActiveWorkbook

With Wb
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, "Workbooks(" & """" & .Name & """" & ").Close True"
Print #1, "End Sub"
Close #1
Wb.VBProject.VBComponents.Import Filename:=.Path & "\xx.bas"

Application.OnTime Now(), Wb.Name & "!Temp"
Wb.Windows(1).Visible = False
KillFileOnMac .Path & "\xx.bas"

End With
End Sub
 

XloneClick

XLDnaute Nouveau
Bonjours à Toutes et Tous,
J'arrive par hasard 10ans après dans cette conv.
J'utilise dans mes applications partagées qui communiquent avec des fichiers externes à l'application un VBS pour cloner le programme source au non du net User et ensuite ouvrir la copie, ce qui fait que plusieurs utilisateurs peuvent en simultané ouvrir et travailler avec l'application. de la même manière un vbs est lancé à la fermeture de l'application qui supprimera la copie du programme source qui porte le nom du net User.

Un répertoire principal nommé "STANDBY"
Le projet VBA.xlsb (Programme source) se trouve dans un sous-répertoire "Application"
Sous la racine ("STANDBY")
Script VBS pour cloner le programme source au non du net User (Utilisateur)

Nom du Script = STANDBY.vbs

Dim Pgm: Pgm="STANDBY.xlsb" 'Nom du progrmme source
dim Fso
Dim AppExcel
set Fso = CreateObject("Scripting.FileSystemObject")
Dim CurFold: CurFold = Fso.GetAbsolutePathName(".")
Dim StrUser : Struser = CreateObject("WScript.Network").UserName
Dim FileOrg: FileOrg = CurFold & "\Application\" & Pgm
Dim FileUser: FileUser = CurFold & "\Application\" & StrUser & "-" & Pgm
If Fso.FileExists(FileUser) Then
Fso.DeleteFile(FileUser)
end if
Fso.CopyFile FileOrg, FileUser
Set AppExcel = WScript.CreateObject("Excel.Application")
AppExcel.Visible = True
AppExcel.Workbooks.Open (FileUser)
Set AppExcel = Nothing
Set Fso = Nothing
WScript.Quit


'Code à la fermeture du projet VBA (STANDBY.xlsb)
Dim oWsh As Object 'VbsQuit
ThisWorkbook.Saved = True
Set oWsh = CreateObject("Shell.Application") 'VbsQuit
oWsh.ShellExecute ThisWorkbook.Path & "\QuitUserAppli-STANDBY.vbs" 'VbsQuit
Set oWsh = Nothing

Nom du Script QuitUserAppli-STANDBY.vbs
A placer dans le sous-répertoire "Application"
Code VBS

Dim PGM : PGM ="STANDBY" 'PGM xlsb
Dim I 'Incrément de boucle
Dim Fso 'Objet File Système
Dim MyPgm
Dim CurFold
Dim FileUser
Dim ExcelWasNotRunning
'--------Définir le fichier à Fermer et à Supprimer---------------------------------------------------------
Set Fso = CreateObject("Scripting.FileSystemObject")
Struser = CreateObject("WScript.Network").UserName 'Exctraire le username de l'utilisateur
CurFold =WScript.ScriptFullName 'Chemin du programme vbs
For i = Len(CurFold) To 1 Step-1 'Faire une boucle à rebours Step-1 sur la chaine de carractères de notre chemin jusqu'à trouver "\"
If Mid(CurFold,i,1) = "\" Then
CurFold = Left(CurFold ,i) 'Prendre tous les carractères à gauche de "\" pour obtenir ...\\Application\
Exit For 'Sortir de la boucle
End If
Next
CurFold = Left(CurFold,Len(CurFold)-1) 'Supprimer "\" de notre chemin pour obtenir ...\\Application
FileUser = CurFold & "\" & StrUser & "-" & PGM & ".xlsb" 'Définir le chemin complet de l'application de l'utilisateur
'------------------------------
On Error Resume Next ' Defer error trapping.
Set MyPgm = Getobject(, "Excel.Application")
If Err.Number <> 0 Then ExcelWasNotRunning = True
Err.Clear
Set MyPgm = Getobject(FileUser)
MyPgm.Application.Visible = False
MyPgm.Parent.Windows(1).Visible = True
MyPgm.Application.DisplayAllerts = False
If ExcelWasNotRunning = False Then FileUser.Close
MyPgm.Application.Quit
MyPgm.Application.DisplayAllerts = True
If ExcelWasNotRunning = True Then
MyPgm.Application.Quit
End IF
If Fso.FileExists(FileUser) Then 'Si l'application utilisateur existe déja, alors la supprimer
'Msgbox FileUser & " Found"
Fso.DeleteFile(FileUser)
Set Fso = Nothing
End If
Set MyPgm = Nothing
Set Fso = Nothing
WScript.Quit
 

Discussions similaires

Réponses
2
Affichages
120

Statistiques des forums

Discussions
312 308
Messages
2 087 105
Membres
103 469
dernier inscrit
Thibz