设置Range.Locked时出现错误1004

时间:2012-02-07 22:15:43

标签: excel vba

我得到了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,则中断宏,取消保护工作表(在选择更改时自动重新保护)然后右键单击,选择属性,切换到保护选项卡并勾选锁定然后确认,事情然而,工作还可以。

可能出现什么问题?

5 个答案:

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

遇到类似问题。原来,用户已过滤了数据,然后将其保存,并且在不关闭过滤器的情况下无法更改过滤数据集的保护。