是否可以根据来自一行数据下拉列表的输入锁定特定范围的单元格?
例如,我的电子表格的每一行代表一个患者,第一个单元格询问一个问题,需要“是”或“否”的响应(通过下拉列表选择/输入)。
修改
“是/否”单元实际上是两个单元(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来实现吗?如果可以,怎么做?
非常感谢。
答案 0 :(得分:5)
编辑: 你可以不用VBA就可以做到这一点。我的建议基于另一个答案:https://stackoverflow.com/a/11954076/138938
列G具有“是”或“否”下拉列表。
在单元格H13中,设置数据验证如下:
=IF($G13="Yes", MyList, FALSE)
MyList
替换为您要允许用户为每列选择的列表。请注意,您需要将患者答案设置为“是”才能设置验证。设置完成后,您可以删除它或将其设置为No。如果要使用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是工作表对象唯一要看的是,如果工作表已锁定,则需要将其解锁然后继续
否则,如果“是”
继续;