繁体   English   中英

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

[英]Remove Workbook_Open Code In the copy saved with Save As from VBA

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

我唯一对禁用和/或删除感兴趣的宏将是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

我以前在这里发现了类似的东西 ,但这对我没有帮助。

我正在使用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文件,用户稍后需要上传的程序不支持> 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

我不确定这在代码中是否可行......(看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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM