设置Range.Locked时出现错误1004

当试图设置Range对象的Locked属性时,我得到了catch-all运行时错误1004,“无法设置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 ,打破macros,解除工作表(它会得到select更改自动重新保护),然后右键单击,select属性,切换到保护选项卡,并勾选locking,然后确认,但工作正常。

什么可能会出错?

这里有一个完整的解释:

通常,导致此错误的原因有两个:尝试更改受保护工作表上单元格的Locked属性和/或尝试更改合并范围中单个单元格的Locked属性。

在第一种情况下,您可以解锁表单或设置UserInterfaceOnly保护,这是强烈build议的,因为您不必乱七八糟地重复解锁/locking它。

关于合并单元格,您不能locking合并范围内的单个单元格,但有合理的选项:

  • 如果您使用单元格地址表示法来引用单元格/范围,

    Range("A1").Locked = True

    那么引用整个合并范围:

    Range("A1:A3").Locked = True 'where "A1:A3" is the entire merged range

  • 如果您为一组合并单元格使用命名范围,则默认情况下它将被定义为仅引用第一个合并单元格。 您可以编辑其定义以包含整个合并范围,也可以使用其MergeArea属性来引用其关联的合并范围:

    Range(“SomeNamedRange”).MergeArea.Locked = True

    但是请注意,你不能这样做,因为MergeArea属性显然是未定义的范围,而不是一个更大的合并区域的严格子

  • 当然,在设置包含单元格的locking属性之前,您总是可以取消合并的范围,然后再重新合并它,但是我从来没有见过上述两种解决scheme之一不够充分的情况(而且更干净)。

select更改后,[工作表]会自动重新保护

由于某种原因,这张纸在方法中间被重新保护 。 立即再次取消保护设置Locked属性解决了我的问题。

我实际上有多个范围,我需要锁在一排,并不得不在每个属性更改之前解除表单。

除非是左上angular的单元格,否则不能locking作为合并单元格范围一部分的单元格。 以下工作适用于任何单元格或合并区域的单元格。

 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 

我有同样的问题,并试图手动隐藏单元格,并收到以下警告:“不能移动对象的工作表”。

我的问题是在同一张单元格中的一些意见。 删除工作表的所有评论后,代码运行。

我的代码find行使用匹配大小写只用于此列(因为我需要插入一些行和列“B”是我的引用来标识行)。

我的代码。 行((WorksheetFunction.Match(1,Range(“B:B”),0)) – 1&“:”&(WorksheetFunction.Match(13,Range(“B:B”),0))+ 15) .EntireRow.Hidden = True