【问题标题】:Loop through cells in a range and lock cells based on their value循环遍历范围内的单元格并根据单元格的值锁定单元格
【发布时间】:2012-12-18 15:47:30
【问题描述】:

好吧,假设我有一系列来自 A1:B10 的单元格。 A1 到 A10 范围内的单元格包含一个带有 2 个选项(锁定、dont_lock)的下拉列表。 B1 到 B10 范围内的单元格是允许用户输入数据的空单元格。我想要做的是根据相邻单元格中的值锁定单个单元格。所以如果单元格 A1 设置为“锁定”,那么我锁定单元格 B1。如果单元格 A2 设置为“dont_lock”,则 B2 未锁定,依此类推。我尝试使用下面代码中显示的 for 循环,但它不起作用。任何人都可以帮忙吗?

Dim rCell As Range
Dim rRng As Range

Set rRng = Sheet1.Range("A1:B10")

For Each rCell In rRng.Cells
    If rCell = "Lock" Then
    Range("B1").Locked = True

End If

Next rCell

【问题讨论】:

  • 你能附上你的工作表的丝网印刷吗? :) 无论如何,您已经非常接近您想要实现的目标。当您说Column A has drop down 菜单时,您是指drop down list in Excel cell 吗?
  • 不用附加任何图片也没关系。请在答案中查看我的 cmets :)
  • 是的,我的意思是下拉列表选项

标签: vba excel


【解决方案1】:

在 Excel 中,默认情况下单元格是锁定的。如果要解锁单元格,则必须实际指定该行为。但是,如果工作表当前不受保护,则单元格是否被锁定并不重要。因此,如果您想要锁定行为,请务必致电Sheet1.Protect

现在,如果我正确理解您的解释,您会做得更好:

Dim rCell As Range
Dim rRng As Range

Set rRng = Sheet1.Range("A1:A10") 'Exclude B as you are only checking A.
Sheet1.Unprotect
For Each rCell In rRng.Cells
    'Avoid if else structure since locking depends on result of evaluation only.
    rcell.Offset(0,1).locked = rcell.Value = "Lock"
Next rCell
Sheet1.Protect

【讨论】:

  • 我试过你的代码,它看起来不错,但我收到一个错误“无法设置范围类的锁定属性”
  • 工作表必须不受保护才能更改 Locked 属性。我添加了Sheet1.Unprotect 声明,应该可以解决问题。
  • @derek 从逻辑上讲,我会选择这个答案作为“可勾选”的答案;) 1. 他在这里谈到了重要的一点,用于保护、取消保护工作表 2。没有 IF/Else 的代码很好:非常合乎逻辑
【解决方案2】:

试试下面的代码。您的代码唯一的问题是缺少 rCell.value = "Lock"。您只锁定所有单元格的单元格 B1,您没有锁定相邻的所有单元格:)

** 这是一个示例代码**

Option Explicit

Sub lockNextCell()
Dim wkSheet As Worksheet
Dim rng As Range, rCell As Range

Set wkSheet = Sheets("Sheets1") '-- use your own sheet
Set rng = wkSheet.Range("A3:A12") '-- use your own range

For Each rCell In rng
    If rCell.Offset(0, 0).Value = "Lock" Then
        rCell.Offset(0, 1).Locked = True '-- here we are locking the adjacent cell
    else
        rCell.Offset(0, 1).Locked = False
    End If
Next rCell

End Sub

Daniel 谈到保护床单时请注意:

这是reference from MSDN: "如果锁定单元格并保护工作表,则不能在单元格中键入数据、修改单元格中当前的数据或更改单元格的其他属性(例如单元格格式)"

【讨论】:

  • 您正在检查 A3:A12 但 OP 指出 A1:A10 是需要评估的范围。此外,您添加的用于定义工作表对象的代码几乎肯定会导致 OP 出错。您的代码要求他们有一个名为“Sheets1”的工作表。他们的代码要求 Excel 对象Sheet1 未被删除。您可能没有意识到直接通过其 Microsoft Excel 对象名称调用工作表是完全合法的,因此不需要在工作表集合中找到它。我并不是说这就是 OP 的意图,只是说它是有效代码
  • @Daniel 我在对 OP 的评论中提到,他自己非常接近答案。我没有提到这是要使用的确切代码。这是他尝试的样本。事实上,我很欣赏你在保护表上指出的事实。因此,每次您需要取消保护您的工作表时。
  • 没关系。抱歉,如果我看起来过于苛刻,我只是指出了您的示例代码的潜在改进领域。并决定解释自己,而不仅仅是说“我不喜欢它”。 +1
  • @DanielCook 很好,谢谢。真的,我从你那里学到了一些东西:)我通常对工作表和范围对象进行显式引用——总是在模块中编写我的代码;)也许这就是为什么它看起来与 OP 应该使用的完全不同的原因。另一件事我在这里发布的所有代码大部分都是现场编写的,所以我的范围通常不是 OP 会使用的。
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多