在另存为功能后禁用VBA模块

时间:2015-08-19 16:46:39

标签: excel vba excel-addins

打开模板时,它会运行Auto_open模块。

 Sub Auto_Open()

 SaveAsUserForm.Show

 End Sub

然后会显示一个用户表单,上面写着“保存为”和“确定”命令按钮。

enter image description here

单击“确定”时,它将运行此代码。

Private Sub SaveAs_Click()

Dim bFileSaveAs As Boolean
bFileSaveAs = Application.Dialogs(xlDialogSaveAs).Show

If Not bFileSaveAs Then Unload Me

If bFileSaveAs Then    
    Dim x As Object
    Set x = Application.VBE.ActiveVBProject.VBComponents
    x.Remove VBComponent:=x.Item("Auto_Open")

    Unload Me

End Sub

这会删除Auto_Open模块,因此不会在刚刚保存的新文件中弹出另存为用户表单。但是我只想在使用save as函数时禁用它(使用自动打开模块或在文件选项卡中

我也需要它,所以如果用户取消该框,它将完全禁用保存功能,只允许另存为。但如果使用保存功能,它会要求输入密码,因此我可以编辑模板。

所以基本上当用户打开模板时他不能做或改变任何东西,除非他首先保存,然后一旦其保存为并且文件名更改它将禁用Auto_Open模块,因此它不会要求保存为每次新文件已打开。

1 个答案:

答案 0 :(得分:1)

您可以在运行时修改代码。您可以使用ReplaceLine方法将注释行SaveAsUserForm.Show替换为注释:

Dim mdl As CodeModule
Set mdl = x.Item("Auto_Open")
mdl.ReplaceLine(3, "'SaveAsUserForm.Show")

警告:如果要替换的行号发生变化,此代码将覆盖新行。我建议找到相关文字的行号,然后使用ReplaceLine和该行号。

(这应该是直截了当的,但事实并非如此。显然,你必须得到count of lines in the module,通过传入行数读取所有lines in the module,逐行分割,并找到带有匹配文本的行。)