Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从VBA中删除使用“另存为”保存的副本中的工作簿\打开代码_Vba_Excel - Fatal编程技术网

从VBA中删除使用“另存为”保存的副本中的工作簿\打开代码

从VBA中删除使用“另存为”保存的副本中的工作簿\打开代码,vba,excel,Vba,Excel,我试图强制用户保存新填充的模板(使用VBA和其中的宏创建),以避免重新打开时数据丢失(这样用户就不必在每次创建并执行程序后删除数据),我还尝试了一些关于启用和禁用事件的内容,我尝试了,但没有成功。它保存了同一本书,但如果我打开它,它似乎仍在执行。是否有任何方法可以从该副本中删除宏 我唯一想禁用和/或删除的宏是打开的工作簿中的代码,因为它是调用模块代码之类的。。。我只想从另一个名字保存的副本中删除它。不是用户首先打开的文件 进一步解释: 我需要打开工作簿时的代码。让我更好地解释一下,我有一个包含所

我试图强制用户保存新填充的模板(使用VBA和其中的宏创建),以避免重新打开时数据丢失(这样用户就不必在每次创建并执行程序后删除数据),我还尝试了一些关于启用和禁用事件的内容,我尝试了,但没有成功。它保存了同一本书,但如果我打开它,它似乎仍在执行。是否有任何方法可以从该副本中删除宏

我唯一想禁用和/或删除的宏是打开的工作簿中的代码,因为它是调用模块代码之类的。。。我只想从另一个名字保存的副本中删除它。不是用户首先打开的文件

进一步解释:

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

代码:

Application.ScreenUpdate=True
此工作簿。激活
MsgBox“站点配置列表”&vbNewLine&“生成成功”,vbOKOnly,“SCL生成成功”
MsgBox“记住用不同的文件名保存文件”&vbNewLine&“程序下次执行时将删除其中包含的所有信息”,vbInformation
SaveWorkbookAsNewFile(项目名和项目名)
私有子SaveWorkbookAsNewFile(新文件名为字符串)
将工作表设置为工作表
将书本作为工作簿
将当前文件设置为字符串
Dim NewFileType作为字符串
将新文件设置为字符串
Application.ScreenUpdate=False“阻止屏幕刷新。
Application.EnableEvents=False
CurrentFile=ThisWorkbook.FullName
NewFileType=“Excel文件1997-2003(*.xls),*.xls”
NewFile=Application.GetSaveAsFilename(_
InitialFileName:=新文件名_
fileFilter:=新文件类型)
如果NewFile“”和NewFile“False”,则
ActiveWorkbook.SaveCopyAs文件名:=新文件_
文件格式:=xlNormal_
密码:=“”_
WriteResPassword:=“”_
ReadOnlyRecommended:=真_
CreateBackup:=False
如果结束
Application.ScreenUpdating=True
Application.EnableEvents=True
端接头

我以前也发现过类似的东西,但这对我没有帮助。

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


这个对象在VBA中是可用的,类似这样的东西应该可以很好地用于您所解释的内容。。。但如果不是这样,那么如果您能解释一下这在哪里以及为什么没有达到您期望的效果,我们会更好地帮助您。

我不确定这在代码中是否可行。。。(看着悉达思证明我错了)

我可以考虑的一种方法是在运行代码之前检查专用单元格中是否存在值

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
我正在使用Excel2007。在新文件(填写的表格)中,我不需要任何代码。我只想展示一下这些信息,就这样——斯潘多尼亚刚刚

在这种情况下,只需将文件保存为
.xlsx
文件。您不必做删除代码的脏活。此文件将自动删除所有代码

换线

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

还记得相应地更改
NewFileType

编辑


哎呀,我忘了说我可能需要将它保存为一个.xls文件,用户稍后需要上传它的程序不支持>excel2007文件–5分钟前的Splendonia

要删除
工作簿\u Open
,请使用此代码(已尝试和测试)。礼貌。在尝试此代码之前,请不要忘记阅读链接中提到的
简介

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

我只是想确认一下。。您想删除
Workbook\u Open
code或所有代码?只删除打开的工作簿,因为它调用模块代码,并且模块代码受密码保护,我认为没有必要删除它。如果您不打算使用模块代码,那么不妨删除它?或者您需要模块代码吗?另外,您使用的是哪种MS Office版本?我的答案将取决于您对我在上一次评论中提出的两个问题的回答。我确实需要它。让我更好地解释一下,我有一个包含所有代码的工作表,当它打开时,它会要求您选择一些输入文件以填充工作簿,完成后,它会要求用户将填充的工作簿保存为副本,但当我打开保存的副本时,就像打开第一个工作表一样。我只想显示填充的模板,而不是像一个精确的副本。这就是为什么我想删除保存副本上打开的工作簿内容,以避免这种行为。编辑问题我想到了这个,这可能是一个很好的解决方案,我还没有实现它,因为我认为可能有更好的解决方案(?)或者没有。这可能是粗略的。。。从理论上讲,您可以使值和专用单元格足够随机,以使生成的文件不可能被误认为是运行代码的模板,但是墨菲定律是一个b*tch定律,如果你把所有的代码都保存在文件中,只希望最终用户永远不会触发它,那你就要冒险了。@BillN。是的,这是非常真实的,sketchy是一个很好的描述。。但是,如果下次打开代码时需要执行代码,您也可以通过一种简单的方法手动恢复该值。
ActiveWorkbook.SaveAs Filename:=NewFile, _
FileFormat:= xlOpenXMLWorkbook , _
Password:="", _
WriteResPassword:="", _
ReadOnlyRecommended:=True, _
CreateBackup:=False
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