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