我正在尝试遍历一系列单元格,锁定任何具有内容的单元格,同时保持空单元格未锁定。
当我运行以下代码时,结果是整个工作表被锁定。如果我添加一个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
答案 0 :(得分:5)
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
答案 1 :(得分:1)
检查出来:http://www.mrexcel.com/archive/VBA/15950b.html
Sub CellLocker()
Cells.Select
' unlock all the cells
Selection.Locked = false
' next, select the cells (or range) that you want to make read only,
' here I used simply A1
Range("A1").Select
' lock those cells
Selection.Locked = true
' now we need to protect the sheet to restrict access to the cells.
' I protected only the contents you can add whatever you want
ActiveSheet.Protect DrawingObjects:=false, Contents:=true, Scenarios:=false
End Sub
如果你说Range(“A1”)。选择,那么它只锁定A1。您可以通过指定如下指定要锁定的多个单元格:
A3:A12,D3:E12,J1:R13,W18
这将A3锁定到A12,将D3锁定到E12等。
答案 2 :(得分:0)
我可能会遗漏一些东西,但......
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
如果您不熟悉VBA,我建议您按照此Excel consultant's video中的说明逐行循环访问代码。如果你单步执行代码,你可以检查“让单元格A7按预期运行吗?”...而不是只看到最终产品
答案 3 :(得分:0)
解锁非空白单元格的快捷方法是使用SpecialCells,见下文。
在我的测试中,这段代码处理合并的单元格,我认为这是Tim的代码在它看起来单独处理每个单元格时产生错误的原因(明确说明这不是问题)蒂姆的代码,它处理意外的结果)
您可能还会发现我的这篇文章A fast method for determining the unlocked cell range很有用
Sub Quicktest()
Dim rng1 As Range
Dim rng2 As Range
On Error Resume Next
Set rng1 = ActiveSheet.Range("A7:I35").Cells.SpecialCells(xlFormulas)
Set rng2 = ActiveSheet.Range("A7:I35").Cells.SpecialCells(xlConstants)
On Error GoTo 0
ActiveSheet.Unprotect
ActiveSheet.Range("A7:I35").Cells.Locked = False
If Not rng1 Is Nothing Then rng1.Cells.Locked = True
If Not rng2 Is Nothing Then rng2.Cells.Locked = True
ActiveSheet.Protect
End Sub
答案 4 :(得分:0)
我知道这是一个旧帖子,但我也已经坚持了一段时间,并且在Excel 2013上进行了一些测试后,如果您的范围包含任何合并的单元格,我得出的结论
此外,您无法锁定/解锁已受保护范围内的单元格。例如,如果您运行:
public sub test()
Sheet1.range("myNameRange").locked = true
Sheet1.protect
end sub
两次它第一次起作用,第二次失败。所以你应该在......之前取消保护目标范围(或表格)。
答案 5 :(得分:0)
你可以试试这个。
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
答案 6 :(得分:0)
如果您想在没有密码保护的情况下保护任何特定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