Excel - 基于值锁定单元格范围

Mus*_*Guy 4 excel vba excel-vba

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

例如,我的电子表格的每一行代表一个患者,第一个单元格询问一个问题,需要"是"或"否"的响应(通过下拉列表选择/输入).

编辑

事实上,"是/否"单元是两个单元(G13和H13)的合并.我已经更新了我的例子以反映这一点.

编辑结束

如果用户选择"否",那么我希望锁定问题范围的其余部分(G13-H13:AB13),因为这里不需要输入数据.但是,如果用户选择"是",那么剩余的单元将保持可用于输入数据.

每个范围内的所有单元格都只通过下拉列表输入数据.

这是我希望实现的目标:

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)
Run Code Online (Sandbox Code Playgroud)

我再次强调,所有数据都是通过下拉菜单输入的,并且不会手动输入任何内容; 我想这样,如果G13-H13 = "No",那么具有下拉的范围内的其余单元被阻止或锁定而不能从它们各自的下拉中选择进一步的信息.

请注意,G13-H13中的值可以是"是"或"否".

这可以通过VBA来实现,如果是这样,怎么做?

非常感谢.

Jon*_*ell 5

编辑:您可以在没有VBA的情况下执行此操作.我的建议是基于另一个答案:https://stackoverflow.com/a/11954076/138938

G列具有"是"或"否"下拉列表.

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

  1. 数据 - >数据验证
  2. 在" 允许"下拉列表中选择" 列表 " .
  3. 在" 源"字段中输入以下公式:=IF($G13="Yes", MyList, FALSE)
  4. 复制单元格H13并将验证(粘贴 - > pastespecial - >验证)粘贴到单元格I13:AB13.
  5. MyList在公式中替换您希望允许用户为每列选择的列表.请注意,您需要将患者答案设置为"是"才能设置验证.设置完成后,可以删除它或将其设置为否.
  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
Run Code Online (Sandbox Code Playgroud)

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

Sub testLockedCells()
    Dim AnswerRow As Long

    AnswerRow = 9

    LockOrUnlockPatientCells AnswerRow
End Sub
Run Code Online (Sandbox Code Playgroud)