Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 设置范围时出现错误1004。已锁定_Excel_Vba - Fatal编程技术网

Excel 设置范围时出现错误1004。已锁定

Excel 设置范围时出现错误1004。已锁定,excel,vba,Excel,Vba,我在尝试设置Range对象的属性时出现了catch all运行时错误1004,“无法设置Range类的锁定属性”。代码如下所示: that_goddamn_sheet.Unprotect ; Determine if we should proceed that_goddamn_range.Locked = True ; Do more stuff that_goddamn_sheet.Protect 当我在行上设置断点并尝试从即时窗口查询该范围的值时,这项操作没有问题,但设置失败 但

我在尝试设置Range对象的属性时出现了catch all运行时错误1004,“无法设置Range类的锁定属性”。代码如下所示:

that_goddamn_sheet.Unprotect

; Determine if we should proceed

that_goddamn_range.Locked = True

; Do more stuff

that_goddamn_sheet.Protect
当我在行上设置断点并尝试从即时窗口查询
该范围的值时,这项操作没有问题,但设置失败

但是,如果我运行
这个该死的范围。选择
,断开宏,取消对工作表的保护(在选择更改时会自动重新保护),然后右键单击,选择属性,切换到“保护”选项卡,勾选“锁定”,然后确认,一切正常

可能出了什么问题

[工作表]在选择更改时自动重新保护

出于某种原因,纸张在方法的中间重新保护了自己。在设置
Locked
属性之前,再次取消对其的保护修复了我的问题


实际上,我需要在一行中锁定多个区域,并且在每次属性更改之前必须取消对工作表的保护。

不能锁定属于合并单元格区域的单元格,除非它是左上角单元格。以下内容适用于任何单元格或单元格的合并区域

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
子锁单元()
调光范围
活动表。取消保护
Cells.Locked=False
对于范围内的每个R(“A1”,单元格.SpecialCells(xlCellTypeLastCell).Address)
如果R.MergeArea.Range(“A1”).Address=R.Address和R.HasFormula或IsText(R),则
R.MergeArea.Locked=True
如果结束
下一个
保护工作表
端接头
函数IsText(What)作为布尔值
IsText=False
出错时继续下一步
IsText=(CDbl(什么)什么)
如果错误编号,则IsText=True
端函数

这里有一个完整的解释:

通常,此错误有两个原因:尝试更改受保护工作表上单元格的锁定的属性和/或尝试更改合并区域中单个单元格的锁定的属性

在第一种情况下,您可以解锁工作表或为其设置UserInterfaceOnly保护,这是强烈建议的,因为这样您就不必重复解锁/锁定工作表

对于合并单元格,您不能锁定属于合并范围的单个单元格,但有合理的选项:

  • 如果使用单元格地址符号来引用单元格/区域

    Range(“A1”).Locked=True

    然后引用整个合并范围:

    Range(“A1:A3”).Locked=True'其中“A1:A3”是整个合并范围

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

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

    但是请注意,您不能同时执行这两项操作,因为对于不是较大合并区域的严格子集的范围,MergeArea属性显然是未定义的

  • 当然,您可以在设置包含单元格的Locked属性之前取消合并合并区域,然后再重新合并,但我从未见过上述两种解决方案中的一种不充分(而且更干净)的情况


我遇到了同样的问题,试图手动隐藏单元格,并收到以下警告:
无法将对象移出工作表。

我的问题是在同一张表格的单元格中出现了一些注释。删除工作表的所有注释后,代码将运行

我的代码在仅用于此目的的列中使用匹配大小写查找行(因为我需要插入一些行,列“B”是我标识行的引用)

我的代码:

Rows((WorksheetFunction.Match(1, Range("B:B"), 0)) - 1 & ":" & (WorksheetFunction.Match(13, Range("B:B"), 0)) + 15).EntireRow.Hidden = True

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

错误消息的文本是什么?@Tim Good point,包括在问题中。