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

时间:2012-08-10 12:27:23

标签: 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)

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

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

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

非常感谢。

3 个答案:

答案 0 :(得分: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替换为您要允许用户为每列选择的列表。请注意,您需要将患者答案设置为“是”才能设置验证。设置完成后,您可以删除它或将其设置为No。
  6. 为第13行设置验证后,将验证复制并粘贴到需要它的所有行。

  7. 如果要使用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
    

答案 1 :(得分:3)

此代码可以帮助您入门。您可能需要调整它以满足您的特定需求,但我的逻辑基于您原始帖子中的详细信息。

将模块放在VBE中相应的工作表对象中。

Private Sub Worksheet_Change(ByVal Target As Range)


'assumes cell changed in column G and first row of data entry is 13
If Target.Column = 7 And Target.Row > 12 Then 'change to If Intersect(Target, Range("G13")) Then if all you care about is G13


    Application.EnableEvents = False 'stop events from processing

    Dim blnLock As Boolean
    Dim r As Integer

    Select Case Target.Value
        Case Is = "No"
            blnLock = True
            r = 191
        Case Is = "Yes"
            blnLock = False
            r = 255
    End Select

    Unprotect Password:="myPassword"

    With Range("H" & Target.Row & ":AB" & Target.Row)

        'just a suggestion, fill the cells grey before locking them, or turn them back to no fill if it's unlocked
        .Interior.Color = RGB(r, r, r)
        .Locked = blnLock

    End With

    .Protect Password:="myPassword"

    Application.EnableEvents = True

End If


End Sub

答案 2 :(得分:0)

试试这个: -

应用循环,然后检查

如果“否”

ws.get_Range(StartCell,EndCell).Locked = true;

//其中ws是工作表对象唯一要看的是,如果工作表已锁定,则需要将其解锁然后继续

否则,如果“是”

继续;