Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Vba 将某些单元格锁定在一个范围内_Vba_Excel_Excel 2010 - Fatal编程技术网

Vba 将某些单元格锁定在一个范围内

Vba 将某些单元格锁定在一个范围内,vba,excel,excel-2010,Vba,Excel,Excel 2010,我试图在一系列单元格中循环,锁定任何有内容的单元格,而不锁定空单元格 当我运行下面的代码时,结果是整个工作表被锁定。如果添加else语句,工作表将被解锁。基本上,不管最后一个.locked=(true,false)语句是什么,都是整个工作表结束的方式 变化1由于我是唯一一个无法实现任何功能的人,我是否可能有一些干扰的开/关设置 Sub ProtectTheSheet() Dim chCell As Range Dim chRng As Range 'Clear the default stat

我试图在一系列单元格中循环,锁定任何有内容的单元格,而不锁定空单元格

当我运行下面的代码时,结果是整个工作表被锁定。如果添加else语句,工作表将被解锁。基本上,不管最后一个.locked=(true,false)语句是什么,都是整个工作表结束的方式

变化1由于我是唯一一个无法实现任何功能的人,我是否可能有一些干扰的开/关设置

Sub ProtectTheSheet()
Dim chCell As Range
Dim chRng As Range

'Clear the default status
ActiveSheet.Unprotect
Range("A7:I35").Locked = False

Set chRng = ActiveSheet.Range("A7:I35")

'Check cell value in body and lock cells with content
For Each chCell In chRng.Cells
    If chCell.Value <> "" Then Cells.Locked = True
Next chCell

ActiveSheet.Protect

End Sub
子保护表()
Dim chCell As范围
暗chRng As范围
'清除默认状态
活动表。取消保护
范围(“A7:I35”)。锁定=错误
设置chRng=ActiveSheet.Range(“A7:I35”)
'检查正文中的单元格值并用内容锁定单元格
对于chRng.Cells中的每个chCell
如果chCell.Value“”则Cells.Locked=True
下一个chCell
保护工作表
端接头
查看以下内容:

如果您说范围(“A1”)。选择,则它仅锁定A1。您可以通过如下方式指定要锁定的多个单元格:
A3:A12,D3:E12,J1:R13,W18
这将A3锁定到A12,D3锁定到E12等。

子保护表()
Sub ProtectTheSheet()
    Dim chCell As Range
    Dim chRng As Range

    ActiveSheet.Unprotect
    Set chRng = ActiveSheet.Range("A7:I35")

    'Check cell value in body and lock cells with content
    For Each chCell In chRng.Cells
        chCell.Locked = (chCell.Value <> "")
    Next chCell

    ActiveSheet.Protect

End Sub
Dim chCell As范围 暗chRng As范围 活动表。取消保护 设置chRng=ActiveSheet.Range(“A7:I35”) '检查正文中的单元格值并用内容锁定单元格 对于chRng.Cells中的每个chCell chCell.Locked=(chCell.Value“”) 下一个chCell 保护工作表 端接头
我可能遗漏了什么,但

Cells.Locked = True
…将锁定活动工作表上的所有单元格。如果你把它改成

chCell.Locked = True
…然后它就起作用了;我想?!由于范围非常小,您最好不要在开始时解锁单元格,而是在锁定单元格的同时解锁单元格,例如:

For Each chCell In chRng.Cells
    If chCell.Value <> "" Then 
    chCell.Locked = True
    Else
    chCell.Locked = False
    End If
Next chCell
chRng.Cells中每个chCell的

如果chCell.Value为“”,则
chCell.Locked=True
其他的
chCell.Locked=False
如果结束
下一个chCell

如果您是VBA新手,我建议您按本文所述逐行循环代码。如果您单步执行代码,您可以检查“单元格A7是否按预期运行?”…而不仅仅是查看最终产品

解锁非空白单元格的快速方法是使用特殊单元格,请参见下文

在我的测试中,这段代码处理合并的单元格。好的,我认为这就是在Tim的代码中产生错误的原因,当它看起来单独处理每个单元格时(需要明确的是,这在Tim的代码中不是一个问题,它处理的是一个意外的结果)

你也会发现我的这篇文章很有用


我知道这是一个旧的线程,但我也在这上面停留了一段时间,在Excel 2013上进行了一些测试后,我得出结论,如果您的范围包括任何合并的单元格

  • 合并单元格必须完全包含在该范围内(例如,合并必须完全包含在锁定/解锁的范围内
  • 被合并的区域可以更大,或者至少正好是与合并单元格对应的区域。如果它是一个命名区域,也可以工作
此外,您无法锁定/解锁已在保护范围内的单元格。例如,如果您运行:

public sub test()
   Sheet1.range("myNameRange").locked = true
   Sheet1.protect
end sub
第一次两次有效,第二次失败。因此,您应该在……之前解除目标范围(或工作表)的保护。您可以尝试此操作

Public Sub abc()
ActiveSheet.Unprotect Password:="1234"
ActiveSheet.Range("I8:I500, K8:K500, M8:M500, N8:N500").Cells.Locked = False
ActiveSheet.Protect Password:="1234"
End Sub

如果要在不使用密码保护的情况下保护任何特定excel的特定单元格,则以下是解决方案:

Sub ProtectingSheet()

  Workbooks.Open (c\documents\....)

  Dim mainworkBook As Workbook

  Set mainworkBook = ActiveWorkbook

  Worksheets(CellValue).Activate

  mainworkBook.Sheets("Sheet1").Range("A1:AA100").Locked = True

  Range(Cells(1, 2), Cells(1, 25)).Select
  Selection.Locked = False

  ActiveSheet.Protect

End Sub

值得注意的是,因为OP对VBA来说是新的:您不需要选择单元格来锁定或解锁它们(或使用它们执行几乎任何其他操作)。范围(“A1”).Locked=True可以正常工作。这只是一个预防性的代码片段,如果工作表中的所有单元格都被锁定,它将解锁这些单元格。但我同意,代码工作时不需要这一行:)我的意思是不需要选择然后锁定/解锁。无需选择即可完成所有操作…您是否在手动录制宏时尝试过录制宏?这确实可以帮助您学习适当的命令。在“设置”查询中,您是否有其他代码正在运行?正如我在下面所发布的,您的错误表明存在合并单元格问题,但您已确认它们不在该范围内。这导致运行时错误1004:无法设置Range类的Locked属性。对我来说适用,所以你的设置一定有一些不同。你知道可能有什么不同吗?不是真的-可能是合并的单元格?我确实在工作表上有一些合并的单元格,但不在范围内。复制和粘贴时,这一个根本不起作用。为了链接if-then-else并删除EndIf,我必须使用continuation。在EndIf中返回一个错误,表示没有If块。当我删除它时,它会运行到chCell.Locked=True,并从上面以相同的错误出错。运行时1004:无法设置Range类的Locked属性。您是否可以将文件(必要时已清理)发布到联机状态以供我们查看?ryan,您是否仍在查看此文件?是的,我仍在查看,但我已经被淹没了。谢谢你的帮助和关心。我该如何发布文件?@RyanEllis,我知道那种感觉。。。。假设你可以在某个地方上传你的文件。一个快速的谷歌会出现如下选项
Public Sub abc()
ActiveSheet.Unprotect Password:="1234"
ActiveSheet.Range("I8:I500, K8:K500, M8:M500, N8:N500").Cells.Locked = False
ActiveSheet.Protect Password:="1234"
End Sub
Sub ProtectingSheet()

  Workbooks.Open (c\documents\....)

  Dim mainworkBook As Workbook

  Set mainworkBook = ActiveWorkbook

  Worksheets(CellValue).Activate

  mainworkBook.Sheets("Sheet1").Range("A1:AA100").Locked = True

  Range(Cells(1, 2), Cells(1, 25)).Select
  Selection.Locked = False

  ActiveSheet.Protect

End Sub