Excel VBA:锁定单元格而不保护工作簿

时间:2018-10-24 08:26:05

标签: excel vba excel-vba

我创建了一个外接程序,该外接程序从数据库发送和检索数据,以便分析师使用这些数据。 为了防止对现有数据点进行更改,我想锁定包含此数据的单元格。最初,我是通过锁定数据范围并保护工作簿来完成此操作的,因为否则锁定将不起作用。但是,保护工作簿还会为最终用户删除/限制很多功能,例如创建图形,自动填充功能,更改格式等。由于最终用户需要这些功能和其他功能,因此我无法保护工作簿。不过,我想锁定包含数据点的单元格。

所以我的问题是,是否可以在不保护工作簿的情况下将单元格锁定在动态范围内(我具有检测数据点正确的结束列和结束行的宏)?如果是这样,怎么办?如果不是,是否有可能检测到动态范围的变化并显示一个消息框,指出在此特定单元格/范围内不允许进行更改,并返回到该单元格的旧值?如果是这样,怎么办?

我看到一些帖子提出了类似的问题,但是这些帖子要么没有得到回答,要么对我的情况不满意(例如,在工作簿的VBA项目中实现的宏,而不是add-的VBA项目中实现的宏,在)。

提前感谢您的回答!

亲切的问候, 罗伯特

2 个答案:

答案 0 :(得分:1)

使用

ActiveSheet.Cells.Locked=False

然后锁定您不想使用的范围:

Range("A1:A4").Cells.Locked=True

然后保护床单

ActiveSheet.Protect Contents:=True, DrawingObjects:=False

这只会保护Locked的内容,仍然允许您更改工作表其余部分的值并插入/删除图表。您可能需要使用保护更改其他设置。 More details can be found here

答案 1 :(得分:0)

您不必保护Workbook,只需保护Worksheet

要通过VBA保护/取消保护工作表,请分别使用工作表方法protectunprotect(您可以应用密码)。

要防止更改范围,您必须将其locked属性设置为True 并保护工作表(默认情况下,所有单元格都设置了属性locked )。

请注意,如果范围被锁定并且工作表受到保护,则无法通过VBA修改范围。如果要这样做,请在代码顶部使用unprotect方法(但不要忘了在完成后再次保护工作表)。或者,您可以使用参数protect调用UserInterfaceOnly:=True,但是很遗憾,Excel不会保存该属性。因此,如果将Excel文件保存在受UserInterfaceOnly:=True保护的工作表中并重新打开,则该工作表也受VBA保护。