簡體   English   中英

Excel - 基於值鎖定單元格范圍

[英]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中,設置數據驗證,如下所示:

  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

您可以使用以下方法測試功能,手動調整患者行的值。 一旦你按照自己想要的方式工作,就可以從用戶的輸入中獲取行。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM