基于值的Excel单元格locking范围

是否有可能locking一个特定范围的单元格基于从一个下拉列表中的数据input?

例如,我的电子表格的每一行代表一个病人,第一个单元格提出一个问题,要求“是”或“否”的答复(通过下拉select/input)。

编辑

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

编辑完成

如果用户select“否”,那么我想locking问题范围的其余部分(G13-H13:AB13),因为这里不需要input数据。 但是,如果用户select“是”,则其余的单元应保持可用于input数据。

每个范围内的所有单元格都只有通过下拉菜单input的数据。

这是我希望实现的:

If "No" Then lock range G13-H13:AB13 Else If "Yes" Then do nothing ie G13-H13 I13-J13 K13-L13 .... .... AB13 | NO | ---- | ---- | ---- | ---- | ---- | (Locked Cells) OR G13-H13 I13-J13 K13-L13 .... .... AB13 | YES | | | | | | (Unlocked Cells) 

我想再一次强调,所有数据都是通过下拉菜单input的,没有任何东西需要手工input。 我希望这样,如果G13-H13 = "No" ,那么在有下拉的范围内的剩余单元被阻止或locking,以从其各自的下拉列表中select更多的信息。

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

这可以用VBA来实现吗?如果是这样,怎么样?

非常感谢。

编辑:你可以做到这一点没有VBA。 我基于这个另一个答案在这里: https : //stackoverflow.com/a/11954076/138938

G列有“是”或“否”下拉列表。

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

  1. 数据 – >数据validation
  2. 允许下拉列表中select列表
  3. Source字段中input以下公式: =IF($G13="Yes", MyList, FALSE)
  4. 复制单元格H13并将validation(粘贴 – > pastespecial – >validation)粘贴到单元格I13:AB13。
  5. 将公式中的MyListreplace为您希望允许用户从每列中select的列表。 请注意,您需要将患者答案设置为“是”才能设置validation。 一旦设置完成,您可以删除它或将其设置为否
  6. 一旦您为第13行设置了validation,请将validation复制并粘贴到所有需要它的行。

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

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

 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 

您可以使用以下方法testingfunction,手动调整患者行的值。 一旦你得到它想要的方式,从用户的input获取行。

 Sub testLockedCells() Dim AnswerRow As Long AnswerRow = 9 LockOrUnlockPatientCells AnswerRow End Sub 

这段代码应该让你开始。 您可能需要调整它以适应您的特定需求,但我根据您的原始文章中的细节的逻辑。

将模块放在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 

尝试这个 : –

应用一个循环,然后检查

如果不”

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

//其中ws是工作表对象唯一需要注意的是,如果工作表已locking,则需要解除locking,然后继续

否则,如果“是”

继续;