我得到了catch-all运行时错误1004,“无法设置Range类的Locked属性”,好吧,试图设置Range对象的Locked
属性。代码如下所示:
that_goddamn_sheet.Unprotect
; Determine if we should proceed
that_goddamn_range.Locked = True
; Do more stuff
that_goddamn_sheet.Protect
当我在该行上设置断点并尝试从立即窗口查询that_goddamn_range.Locked
的值时,这可以正常工作,但设置失败。
但是,如果我运行that_goddamn_range.Select
,则中断宏,取消保护工作表(在选择更改时自动重新保护)然后右键单击,选择属性,切换到保护选项卡并勾选锁定然后确认,事情然而,工作还可以。
可能出现什么问题?
答案 0 :(得分:16)
以下是完整的解释:
通常,导致此错误的原因有两个:尝试更改受保护工作表上单元格的已锁定属性和/或尝试更改单个单元格的已锁定属性合并范围内的单元格。
在第一种情况下,您可以解锁工作表或为其设置 UserInterfaceOnly 保护,强烈建议您使用,因为您不必反复解锁/锁定它。
关于合并单元格,您无法锁定属于合并范围的单个单元格,但有合理的选项:
如果您使用单元格地址表示法来引用单元格/范围,
Range("A1").Locked = True
然后引用整个合并范围:
Range("A1:A3").Locked = True 'where "A1:A3" is the entire merged range
如果您对一组合并单元格使用命名范围,则默认情况下,它将被定义为仅引用第一个合并单元格。您可以编辑其定义以包含整个合并范围,也可以使用其 MergeArea 属性来引用其关联的合并范围:
Range(“SomeNamedRange”).MergeArea.Locked = True
但请注意,您不能同时执行这两项操作,因为对于不是较大合并区域的严格子集的范围, MergeArea 属性显然是未定义的!
当然,您可以在设置包含单元格的Locked属性之前取消合并范围,然后重新合并它,但我从未见过上述两种解决方案之一的情况。足够(而且更清洁)。
答案 1 :(得分:3)
[表格]在选择更改时自动重新保护
由于某种原因,工作表在方法的中间重新保护。在设置Locked
属性之前立即再次取消保护,解决了我的问题。
实际上,我需要连续锁定多个范围,并且必须在每次更改属性之前取消保护工作表。
答案 2 :(得分:3)
除非是左上角单元格,否则无法锁定属于一系列合并单元格的单元格。以下适用于任何单元格或单元格的合并区域。
Sub LockCells()
Dim R As Range
ActiveSheet.Unprotect
Cells.Locked = False
For Each R In Range("A1", Cells.SpecialCells(xlCellTypeLastCell).Address)
If R.MergeArea.Range("A1").Address = R.Address And R.HasFormula Or IsText(R) Then
R.MergeArea.Locked = True
End If
Next
ActiveSheet.Protect
End Sub
Function IsText(What) As Boolean
IsText = False
On Error Resume Next
IsText = (CDbl(What) <> What)
If Err.Number Then IsText = True
End Function
答案 3 :(得分:0)
我遇到了同样的问题并试图手动隐藏单元格,并收到以下警告: &#34;无法将对象移出工作表。&#34;
我的问题是在同一张纸的单元格中的一些注释。删除工作表的所有注释后,代码将运行。
我的代码在一个专门用于此的列中找到使用匹配大小写的行(因为我需要插入一些行而列#34; B&#34;是我用来标识行的参考)。
我的代码。 行((WorksheetFunction.Match(1,Range(&#34; B:B&#34;),0)) - 1&amp;&#34;:&#34;&amp;(WorksheetFunction.Match(13,Range( &#34; B:B&#34;),0))+ 15).EntireRow.Hidden = True
答案 4 :(得分:0)
遇到类似问题。原来,用户已过滤了数据,然后将其保存,并且在不关闭过滤器的情况下无法更改过滤数据集的保护。