5

我想阻止用户使用与打开它的名称相同的名称保存工作簿,并提供 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

此代码不起作用。另存为对话框不出现。

下次试试

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

3 回答 3

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
于 2012-09-16T10:11:05.793 回答
3

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

  1. 使用模板。如果您将代码放在模板中并添加新工作簿,则如果没有“另存为”对话框,则无法保存它。

  2. 使工作簿在打开时只读。这可以通过多种方式完成,具体取决于您的项目设计(例如Workbooks.Open,使用ReadOnly参数)。

于 2012-09-16T09:46:35.490 回答
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,您将需要更改

于 2012-09-16T10:00:58.273 回答