如何强制SaveAs而不是Save

时间:2012-09-16 09:23:22

标签: excel excel-vba vba

我想阻止用户使用与打开时相同的名称保存工作簿,并提供SaveAs选项。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If ThisWorkbook.Name = "abc" Then
Cancel = True
SaveAsUI = True
End If

也试过

 If ThisWorkbook.Name = "abc" Then SaveAsUI = True

此代码不起作用。 SaveAs对话框不会出现。

接下来尝试

If ThisWorkbook.Name = "abc" Then ThisWorkbook.ReadOnly = True
'Error - can't assign to read only property.

3 个答案:

答案 0 :(得分:5)

如果您只想测试特定文件名 - 请说abc.xlsm,则下面的代码将停止Save(但通过SaveAs),然后设置ReadOnly属性为False,因此在此会话中不能再在此文件中使用Save

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Not SaveAsUI Then
    If ThisWorkbook.Name = "abc.xlsm" Then
        Cancel = True
        ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly
    End If
End If
End Sub

答案 1 :(得分:3)

我有两个建议,但为了知道哪个是最好的,你必须告诉我们有关周围代码的更多细节以及如何打开/创建文件等。

  1. 使用模板。如果将代码放在模板中并添加新工作簿,则在没有SaveAs对话框的情况下无法保存。

  2. 仅在开始时读取工作簿。这可以通过多种方式完成,具体取决于项目的设计(例如Workbooks.OpenReadOnly参数)。

答案 2 :(得分:3)

另一个答案(只读或模板)都是很好的建议

但是,如果你真的想要编码,请试试这个

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim fName As String
    If ThisWorkbook.Name  "abc.xlsm" Then 
        If Not SaveAsUI Then
            fName = Application.GetSaveAsFilename(, "Excel Macro-Enabled Workbook (*.xlsm), *.xlsm")
            If fName = "False" Then
                MsgBox "File NOT saved", vbOKOnly
                Cancel = True
            Else
                Application.EnableEvents = False
                ThisWorkbook.SaveAs Filename:=fName, FileFormat:=xlOpenXMLWorkbookMacroEnabled
                Application.EnableEvents = True
            End If
        End If
    End If
End Sub

注意:已编码为Excel 2007/2010(If ThisWorkbook.Name "abc.xlsm" Then

如果使用Excel 2003

,则需要更改