锁定某个范围内的某些单元格

时间:2011-10-14 04:57:09

标签: vba excel-vba excel-2010 excel

我正在尝试遍历一系列单元格,锁定任何具有内容的单元格,同时保持空单元格未锁定。

当我运行以下代码时,结果是整个工作表被锁定。如果我添加一个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

7 个答案:

答案 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