删除Workbook_Open代码在使用VBA中的“另存为”保存的副本中

时间:2013-11-07 20:17:01

标签: excel vba excel-vba

我正在尝试强制用户保存新填充的模板(使用VBA及其中的宏创建)以避免重新打开时丢失数据(因此用户在创建执行程序后不必删除数据每次),我read关于启用和禁用事件的事情,我尝试了但没有运气。它保存了同一本书但如果我打开它,它似乎仍在执行。无论如何从那个副本剥离宏?

我唯一对禁用和/或删除感兴趣的宏将是Workbook_Open中的代码,因为那是调用模块代码的代码......而且我只想将它从副本中删除我正在用另一个名字保存。不是用户首先打开的文件。

进一步解释:

我需要Workbook_Open上的代码。让我试着更好地解释一下,我有一张包含所有代码的工作表,当它打开时,它会要求你选择一些输入文件以填充工作簿,完成之后,它会要求用户保存填写工作簿作为副本,但当我打开保存的副本时,就像我打开第一张表。而且我想展示填充的模板,而不是像精确的副本。这就是为什么我想删除工作簿

代码:

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

之前我发现了类似的here,但这对我没有帮助。

3 个答案:

答案 0 :(得分:2)

  

我正在使用excel 2007.在新文件(填充表)中,我不需要任何代码。我只想展示信息,就是这样 - Splendonia刚才

在这种情况下,您需要做的就是将文件另存为.xlsx文件。您不必执行删除代码的繁琐工作。该文件将自动删除所有代码。

更改行

ActiveWorkbook.SaveCopyAs Filename:=NewFile, _
FileFormat:=xlNormal, _
Password:="", _
WriteResPassword:="", _
ReadOnlyRecommended:=True, _
CreateBackup:=False

ActiveWorkbook.SaveAs Filename:=NewFile, _
FileFormat:= xlOpenXMLWorkbook , _
Password:="", _
WriteResPassword:="", _
ReadOnlyRecommended:=True, _
CreateBackup:=False

另请记得相应地更改NewFileType

修改

  

糟糕,我忘了说我可能需要将其保存为.xls文件,用户稍后需要上传的程序不支持&gt; excel2007文件 - Splendonia 5分钟前

要删除Workbook_Open,请使用此代码(TRIED AND TESTED)。礼貌Chip Pearson。在尝试此代码之前,请不要忘记阅读链接中提到的Introduction

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

答案 1 :(得分:1)

我不确定这在代码中是否可行......(看着Siddharth证明我错了)..

我能想到的一种方法是在运行代码之前检查专用单元格中是否存在值。

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

答案 2 :(得分:0)

您能解释为什么您提供的链接不适合您吗?我打算提出类似的建议......似乎如果他们要保存一个新副本,那么你可以在BeforeSave事件上拦截它,然后使用标准API从模块中删除代码。看看这个:

http://msdn.microsoft.com/en-us/library/aa443970(v=vs.60).aspx

这个对象可以在VBA中使用,这样的东西应该适用于你正在解释的内容...但如果不是那么我们会帮助你更好,如果你能解释这里和为什么这不是'做你期望它做的事。