尽pipeUserInterFaceOnly = True并且没有合并单元格,但无法设置locking属性
我设置了一个小范围的Locked
属性,但是代码失败,熟悉的1004 cannot set the Locked property of the Range class
,类似于这个问题 。
- 有问题的范围不包含任何合并的单元格
- 我的表被locking
UserInterFaceOnly=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
没有正确定义。 注意在我上面的代码中,我已经定义了someBoolVar
为True
,并且代码工作。 在即时窗口中尝试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。