I’m trying to force the user to save the newly filled template (created with VBA and the macros inside it) to avoid data loss when it reopens (so users don’t have to delete the data after creating executing the program each time), and I read something about enabling and disabling events, and I tried it but no luck. It saves the same book but if I open it, it seems to be executing anyway. Is there anyway to strip the macros from that copy?
The only Macro I’d be interested in disabling and/or deleting will be the code inside the Workbook_Open because that’s the one that calls the modules code and such… and I’m only interested in removing it from the copy that I’m saving with another name. Not the file the user opened in the first place.
I required the code on Workbook_Open. Let me try to explain better, I have a sheet with all the code in it, when it opens among other things it asks you to select some input files in order to fill the workbook, after it’s done, it asks the user to save the filled workbook as a copy, but when I open that saved copy, it’s like i’m opening the first sheet. And I’d like to just show the filled template instead of acting like an exact copy. That’s why I thought of removing the Workbook
Application.ScreenUpdating = True ThisWorkbook.Activate MsgBox "Site Configuration List" & vbNewLine & "Generated Sucessfully", vbOKOnly, "SCL Generated Sucessfully" MsgBox "Remember to save the file with a different filename" & vbNewLine & "The next time the program executes it'll erase all information contained in it", vbInformation SaveWorkbookAsNewFile (Project & "_" & ProjectName) Private Sub SaveWorkbookAsNewFile(NewFileName As String) Dim ActSheet As Worksheet Dim ActBook As Workbook Dim CurrentFile As String Dim NewFileType As String Dim NewFile As String Application.ScreenUpdating = False ' Prevents screen refreshing. Application.EnableEvents = False CurrentFile = ThisWorkbook.FullName NewFileType = "Excel Files 1997-2003 (*.xls), *.xls" NewFile = Application.GetSaveAsFilename( _ InitialFileName:=NewFileName, _ fileFilter:=NewFileType) If NewFile <> "" And NewFile <> "False" Then ActiveWorkbook.SaveCopyAs Filename:=NewFile, _ FileFormat:=xlNormal, _ Password:="", _ WriteResPassword:="", _ ReadOnlyRecommended:=True, _ CreateBackup:=False End If Application.ScreenUpdating = True Application.EnableEvents = True End Sub
I found something similar here before but that really didn’t helped me.
I’m using excel 2007. In the new file (Filled sheet) I don’t require any code. I’d like just to show the information and that’s it – Splendonia just now
In such a case all you need to do is save the file as an
.xlsx file. You don’t have to do the dirty work of removing the code. This file will automatically be stripped of all the code.
Change the line
ActiveWorkbook.SaveCopyAs Filename:=NewFile, _ FileFormat:=xlNormal, _ Password:="", _ WriteResPassword:="", _ ReadOnlyRecommended:=True, _ CreateBackup:=False
ActiveWorkbook.SaveAs Filename:=NewFile, _ FileFormat:= xlOpenXMLWorkbook , _ Password:="", _ WriteResPassword:="", _ ReadOnlyRecommended:=True, _ CreateBackup:=False
Also remember to change the
Oops, I forgot to say I might need to save it as a .xls file, the program in which the users need to upload this later does not support >excel2007 files – Splendonia 5 mins ago
To delete the
Workbook_Open, use this code (TRIED AND TESTED). Courtesy Chip Pearson. Please do not forget to read the
Introduction mentioned in the link before you try this code.
Option Explicit Sub DeleteProcedureFromModule() Dim VBProj As VBIDE.VBProject Dim VBComp As VBIDE.VBComponent Dim CodeMod As VBIDE.CodeModule Dim StartLine As Long Dim NumLines As Long Dim ProcName As String Set VBProj = ActiveWorkbook.VBProject Set VBComp = VBProj.VBComponents("ThisWorkbook") Set CodeMod = VBComp.CodeModule ProcName = "Workbook_Open" With CodeMod StartLine = .ProcStartLine(ProcName, vbext_pk_Proc) NumLines = .ProcCountLines(ProcName, vbext_pk_Proc) .DeleteLines StartLine:=StartLine, Count:=NumLines End With End Sub
I’m not sure this is possible in code… (watch Siddharth prove me wrong)..
One way I could think of doing this is to check for existance of a value in a dedicated cell before running the code..
Private Sub Workbook_Open() Dim rng As Range Set rng = Sheet1.Range("A1") If rng.Value = "run" Then 'put code in here rng.Value = "" End If End Sub
Can you explain why the link you provide did not work for you? I was going to suggest something similar… it seems as though if they’re saving a new copy, then you could intercept this on the BeforeSave event and just remove the code from the module using the standard API. Take a look at this:
This object is available to you in VBA and something like this should work fine for what you’re explaining… but if it isn’t then we’d help you better if you could explain where and why this isn’t doing what you’re expecting it to do.