我正在设置小范围的Locked
属性,但代码会因熟悉的1004 cannot set the Locked property of the Range class
而失败,类似于this problem。
UserInterFaceOnly=True
我没有想法 - 我怎样才能找出导致失败的原因?
编辑:我没有提到我正在锁定工作表,保存工作,关闭和重新打开 - 并且Locked
中设置Workbook_Open
- 属性的代码是在Sub LockSheet()
If ws1.ProtectContents = False Then ws1.Protect Password:="1", UserInterFaceOnly:=True
End Sub
中触发的。
这导致了重新打开工作簿removes the interface-only protection, leaving the entire sheet protected导致的设计问题。感谢@CLR让我走上了这条道路,如果他决定将其作为答案提交,那么他会得到荣誉。
锁码:
With summaryRange
.Locked = Not (someBoolVar) ' <-- 1004 Cannot set Locked etc.
.FormulaHidden = Not (someBoolVar)
End With
工作表受保护时失败的代码段(但如果我取消保护工作表,则会起作用):
Set summaryRange = ws1.Range(firstSummaryColumn & "4:" & lastSummaryColumn & lastRow)
其中summaryRange是合格的并且在代码的其他部分工作:
? Module1.summaryRange.Address
$J$4:$M$50
&安培;还验证了编译器的工作:
(import (java.time LocalDate)
(java.time.format DateTimeFormatter))
(def formatter (DateTimeFormatter/ofPattern "yyyy-MM-dd"))
(def yesterday (.minusDays (LocalDate/now) 1))
(.format formatter yesterday)
;; => "2017-04-05"
答案 0 :(得分:1)
我试图重现您的问题但不能,使用下面的子代码来模仿您的代码。
表格保护:
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
范围锁定:
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中揭穿此内容。someBoolVar
未正确定义。请注意,在上面的代码中,我将someBoolVar
定义为True
,代码可以运行。尝试在即时窗口中调试?someBoolVar
以查看它在使用之前的含义。编辑:你也已经揭穿了这一点。编辑:
正如评论中所建议的那样,您的问题可能是当工作簿关闭时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
属性不受正在关闭的工作簿的影响,因此您不必再次重新应用该条件!
Office VBA文档没有解决此问题,但VB documentation(通常可比较)实际上确实存在:
如果在UserInterfaceOnly参数设置为true的情况下应用此方法然后保存工作簿,则重新打开工作簿时将完全保护整个工作表(不仅仅是界面)。若要在打开工作簿后重新启用用户界面保护,必须再次应用此方法并将UserInterfaceOnly设置为true。