尽pipeUserInterFaceOnly = True并且没有合并单元格,但无法设置locking属性

我设置了一个小范围的Locked属性,但是代码失败,熟悉的1004 cannot set the Locked property of the Range class ,类似于这个问题 。

  • 有问题的范围不包含任何合并的单元格
  • 我的表被lockingUserInterFaceOnly=True

我没有想法 – 我怎样才能找出是什么原因导致失败?

编辑:我没有提到,我locking工作表,保存它,closures和重新打开 – 和设置Locked – 属性的代码是在Workbook_Open触发。

这会导致由于重新打开工作簿而导致的devise问题,从而消除了仅接口保护,从而保留了整个工作表 。 感谢@CLR让我走上了这条道路,如果他决定把它作为一个答案提交给他的话,他的信任。

密码:

 Sub LockSheet() If ws1.ProtectContents = False Then ws1.Protect Password:="1", UserInterFaceOnly:=True End Sub 

当工作表受到保护时失败的代码片段(但在解除工作表的保护时工作):

 With summaryRange .Locked = Not (someBoolVar) ' <-- 1004 Cannot set Locked etc. .FormulaHidden = Not (someBoolVar) End With 

summaryRange是合格的,并在代码的其他部分工作:

 Set summaryRange = ws1.Range(firstSummaryColumn & "4:" & lastSummaryColumn & lastRow) 

&也validation了编译器的工作:

 ? Module1.summaryRange.Address $J$4:$M$50 

我试图重现你的问题,不能使用下面的潜艇模仿你的代码。

表格保护:

 Sub LockSheet() Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Sheets("Sheet1") If ws1.ProtectContents = False Then ws1.Protect Password:="1", UserInterFaceOnly:=True Else ws1.Unprotect Password:="1" End If End Sub 

范围locking:

 Sub lockit() Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Sheets("Sheet1") Dim someBoolVar As Boolean someBoolVar = True Dim summaryRange As Range Set summaryRange = ws1.Range("$J$4:$M$50") With summaryRange .Locked = Not someBoolVar ' <-- No error triggered here .FormulaHidden = Not someBoolVar End With End Sub 

可能的原因:

  • 你的summaryRange没有被正确定义:你已经在你的Q中揭穿了这个。
  • 表locking发生了一些可怕的事情:我已经揭穿了上面这个。
  • 您的someBoolVar没有正确定义。 注意在我上面的代码中,我已经定义了someBoolVarTrue ,并且代码工作。 在即时窗口中尝试debugging?someBoolVar ,以查看在使用之前它是什么。 编辑:你也揭穿了这一点。

编辑:

正如在评论中所build议的,您的问题可能是在工作簿closures时UserInterfaceOnly标志重置为False 。 为了避免这种情况,您必须在工作簿打开时重新应用保护。 本小节将实现:

 Sub reprotect() ' Called from the Workbook_Open event ' Cycle through sheets Dim sh As Worksheet For Each sh In ThisWorkbook.Sheets ' If protected, reprotect to reset UserInterfaceOnly flag If sh.ProtectContents = True Then sh.Unprotect Password:="1" sh.Protect Password:="1", UserInterfaceOnly:=True End If Next sh End Sub 

幸运的是,范围的Locked属性不会被正在closures的工作簿所影响,因此您不必再次重新应用该条件!

Office VBA文档没有解决这个问题,但VB文档 (通常是可比较的)实际上是:

如果将UserInterfaceOnly参数设置为true并应用此方法,然后保存工作簿, 重新打开工作簿时整个工作表(而不仅仅是接口)将被完全保护 。 要打开工作簿后重新启用用户界面保护,您必须再次应用此方法UserInterfaceOnly设置为true。