当我试图设置一个Range对象的Locked属性时,我得到了一个通用的运行时错误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,破坏宏,取消工作表保护(它在选择更改时自动重新保护),然后右键单击,选择属性,切换到保护选项卡,勾选锁定,然后确认,但一切正常。
会出什么问题呢?
发布于 2014-12-02 04:00:39
这里有一个完整的解释:
通常,导致此错误的原因有两种:尝试更改单元格在受保护工作表上的Locked属性和/或尝试更改合并区域中单个单元格的Locked属性。
在第一种情况下,您可以解锁工作表或为它设置UserInterfaceOnly保护,这是强烈建议的,因为这样您就不必反复解锁/锁定它。
对于合并的单元格,您不能锁定属于合并区域的单个单元格,但有一些合理的选项:
Range("A1").Locked = True
然后引用整个合并范围:
Range("A1:A3").Locked = True 'where "A1:A3" is the entire merged range
Range(“SomeNamedRange”).MergeArea.Locked = True
但请注意,您不能同时做到这两点,因为对于一个不是更大合并区域的严格子集的区域,MergeArea属性显然是未定义的!
发布于 2014-01-26 06:01:17
不能锁定属于合并单元格区域一部分的单元格,除非它是左上角的单元格。下面的代码适用于任何单元格或合并的单元格区域。
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发布于 2012-02-08 06:20:42
选择更改时,工作表将自动重新受到保护
由于某种原因,工作表在方法中间重新保护了自己。在设置Locked属性之前再次取消保护修复了我的问题。
实际上,我需要在一行中锁定多个范围,并且必须在每次属性更改之前取消对工作表的保护。
https://stackoverflow.com/questions/9184818
复制相似问题