2015-08-19 26 views
1

当模板打开时,它运行一个Auto_open模块。保存为功能后禁用VBA模块

Sub Auto_Open() 

SaveAsUserForm.Show 

End Sub 

然后,这提出了一个用户表示,请保存为一个OK命令按钮。

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模块,以便保存为用户表单不会在刚刚保存的新文件中弹出。但我只希望它被禁用,如果使用另存为功能(都使用自动打开模块或在文件选项卡

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

所以基本上,当用户打开他不能做什么或改变什么模板,除非他另存为先,然后,一旦它的保存由于文件名称发生变化,它将禁用Auto_Open模块,因此每次打开新文件时都不会要求保存。

+0

您是否考虑检查文件名和路径,并且只显示消息是否为“原文”路径?或者,如果您将该模板标记为“只读”,那么您的用户将始终需要“另存为”... –

+0

将它标记为会要求它们启用宏,只需要一条语句,如果文件另存为则删除auto_open宏'和'如果使用保存功能然后要求输入密码' – Duraholiday

+0

在这里你可以使用一些代码:http://www.mrexcel.com/forum/excel-questions/535724-how-open-save-dialog- box-visual-basic-applications.html –

回答

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,方法是传递行数,按行分割文本,并找到匹配的行文本)。

+0

我没有任何东西可以替换Auto_Open模块,它的唯一工作就是提示用户窗体。我使用'save'前的''来查看,但是每次有人保存新文件时都会尝试删除Auto_Open,并且会出错,因为它在首次SavedAs时已经将其删除。这确实为另一个Excel项目工作,所以谢谢你! – Duraholiday

+0

@Duraholiday我不是故意替换整个模块,只是将调用'SaveAsUserForm.Show'的行注释掉。 –