vba - Excel - 根据值锁定单元格范围

标签 vba excel

是否可以根据一行数据中下拉列表的输入锁定特定范围的单元格?

例如,我的电子表格的每一行代表一名患者,第一个单元格提出一个问题,需要回答"is"或“否”(通过下拉菜单选择/输入)。

编辑

“是/否”单元格实际上是两个单元格(G13 和 H13)的合并。我已经更新了我的示例以反射(reflect)这一点。

编辑结束

如果用户选择“否”,那么我希望锁定问题范围的其余部分 (G13-H13:AB13),因为无需在此处输入数据。但是,如果用户选择"is",则其余单元格仍可用于输入数据。

每个范围内的所有单元格仅通过下拉菜单输入数据。

这是我希望实现的目标:

If "No"
    Then lock range G13-H13:AB13
Else If "Yes"
    Then do nothing

i.e.

 G13-H13  I13-J13  K13-L13   ....     ....     AB13
|  NO   |  ----  |  ----  |  ----  |  ----  |  ----  |  (Locked Cells)

OR

 G13-H13  I13-J13  K13-L13   ....     ....     AB13
|  YES  |        |        |        |        |        |  (Unlocked Cells)

我想再次强调,所有数据都是通过下拉菜单输入的,不需要手动输入任何内容;我希望如果G13-H13 =“No”,则具有下拉列表的范围内的其余单元格将被阻止或锁定,无法从各自的下拉列表中选择更多信息。

请注意,G13-H13 中的值可以是"is"或“否”。

这可以使用 VBA 实现吗?如果可以,如何实现?

非常感谢。

最佳答案

编辑: 无需 VBA 即可完成此操作。我基于这里的另一个答案:https://stackoverflow.com/a/11954076/138938

G 列有"is"或“否”下拉列表。

在单元格 H13 中,设置数据验证,如下所示:

  1. 数据 --> 数据验证
  2. 允许下拉列表中选择列表
  3. 来源字段中输入以下公式:=IF($G13="Yes", MyList, FALSE)
  4. 复制单元格 H13 并将验证内容粘贴到单元格 I13:AB13。
  5. 将公式中的 MyList 替换为您希望允许用户从每列中进行选择的列表。请注意,您需要将患者的答案设置为"is"才能设置验证。设置完成后,您可以删除它或将其设置为否。
  6. 为第 13 行设置验证后,请将验证复制并粘贴到需要它的所有行。
<小时/>

如果您想使用 VBA,请使用以下内容,并使用 worksheet_change 事件或某些其他机制来触发 LockOrUnlockPatientCells。我不喜欢使用 worksheet_change,但在这种情况下可能有意义。

为了锁定单元格,您需要锁定它们,然后保护工作表。下面的代码就是这样做的。您需要将正在处理的患者的行传递给它。

Sub LockOrUnlockPatientCells(PatientRow As Long)
    Dim ws As Worksheet
    Dim YesOrNo As String

    Set ws = ActiveSheet
    YesOrNo = ws.Range("g" & PatientRow).Value

    ' unprotect the sheet so that we can modify locked settings
    ws.Unprotect
    ws.Range("a:g").Cells.Locked = False

    ' lock row
    Range("h" & PatientRow & ":AB" & PatientRow).Cells.Locked = True

    ' unlock the row depending on answer
    If YesOrNo = "Yes" Then
        Range("h" & PatientRow & ":AB" & PatientRow).Cells.Locked = False
    End If

    ' protect the sheet again to activate the locked cells
    ws.Protect

End Sub

您可以使用以下方法测试功能,手动调整患者行的值。一旦您让它按照您想要的方式工作,就可以从用户的输入中获取该行。

Sub testLockedCells()
    Dim AnswerRow As Long

    AnswerRow = 9

    LockOrUnlockPatientCells AnswerRow
End Sub

关于vba - Excel - 根据值锁定单元格范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901686/

相关文章:

vba - 在多个工作簿中使用相同的热键

Excel VBA 更改表中的公式?

mySQL、Excel、VBA 和 ADODB(命令)参数问题

mysql - VBA 如何连接到 Excel 中的 MySQL 数据库?

excel - Scripting.Dictionary 的最大大小是多少?

vba - Excel VBA 从文件夹中的文件更新主列表

python | Excel csv 文件 Unicode 问题

performance - 为什么 Outlook 关闭时 Excel VBA 的运行速度明显加快?

excel - 为什么 VBA 函数对集合给出编译错误,但对字符串则不然

Excel VBA 格式和变量输出并不总是有效