尽管UserInterFaceOnly = True并且没有合并的单元格

时间:2017-04-06 10:52:59

标签: excel vba excel-vba

我正在设置小范围的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"

1 个答案:

答案 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。