[英]Excel - Lock Range of Cells Based on Values
是否可以根據來自一行數據下拉列表的輸入鎖定特定范圍的單元格?
例如,我的電子表格的每一行代表一個患者,第一個單元格詢問一個問題,需要“是”或“否”的響應(通過下拉列表選擇/輸入)。
編輯
事實上,“是/否”單元是兩個單元(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來實現,如果是這樣,怎么樣?
非常感謝。
編輯:您可以在沒有VBA的情況下執行此操作。 我的建議是基於另一個答案: https : //stackoverflow.com/a/11954076/138938
G列具有“是”或“否”下拉列表。
在單元格H13中,設置數據驗證,如下所示:
=IF($G13="Yes", MyList, FALSE)
MyList
替換為您希望允許用戶為每列選擇的列表。 請注意,您需要將患者答案設置為“是”才能設置驗證。 設置完成后,可以刪除它或將其設置為否。 如果要使用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
這段代碼可以幫助您入門。 您可能需要調整它以滿足您的特定需求,但我的邏輯基於您原始帖子中的詳細信息。
將模塊放在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是工作表對象唯一要看的是,如果工作表已鎖定,則需要將其解鎖然后繼續
否則如果“是”
繼續;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.