我在保存时尝试创建工作簿的副本,但是当我创建该副本时,请锁定所有单元格,以便无法更改它们。
这是我所拥有的...
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim FName As String
Dim FPath As String
Dim NewBook As Workbook
FPath = ThisWorkbook.Path & "" '& FName
FName = "Saved File" & Format(Date, "YYMMDD") & ".xlsx"
Set NewBook = Workbooks.Add
Application.DisplayAlerts = False
ThisWorkbook.Sheets.Copy
ActiveWorkbook.SaveAs Filename:=FPath & FName, FileFormat:=51
ActiveWorkbook.Close
Application.DisplayAlerts = True
'NewBook.SaveAs Filename:=FPath & FName, FileFormat:=51
Application.DisplayAlerts = False
NewBook.Close
Application.DisplayAlerts = True
End Sub
任何帮助将不胜感激。 提前非常感谢
在您的情况下,您可以使用usedrange.locked
来锁定新工作簿的整个使用范围。但是,在工作簿受到保护之前,这不会阻止编辑,因此最好也使用worksheet.protect
.完整代码:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim FName As String
Dim FPath As String
ThisWorkbook.Activate
FPath = ThisWorkbook.Path & "" '& FName
FName = "Saved File" & Format(Date, "YYMMDD") & ".xlsx"
Application.DisplayAlerts = False
ThisWorkbook.Sheets.Copy
With ActiveWorkbook
.Sheets(1).UsedRange.Locked = True
.Sheets(1).Protect ""
.SaveAs Filename:=FPath & FName, FileFormat:=51
.Close
End With
Application.DisplayAlerts = True
End Sub
请注意,usedrange
通常不是覆盖整个范围的最佳做法,因为它有时会太大。但是,在您的情况下,您需要确保工作表中的所有单元格都被覆盖。由于默认情况下所有单元格在未更改时都受到保护,因此usedrange
将在这里很好地解决其余部分。
编辑,我掩盖了大部分代码,因为只有protect
与问题相关。但是,根据评论,这会导致一个问题。发生的情况是创建一个新工作簿,然后使用代码复制工作簿。这也会自动创建一个新工作簿。这是保存的那个,newbook
被关闭而没有任何更改。我删除了这部分代码。 复制后的ActiveWorkbook
应该是包含您复制的数据的那个,所以我把它作为被锁定和保存的那个。