根据另一个单元格锁定和解锁单元格

时间:2018-07-10 09:26:21

标签: excel vba

我有一个Excel 2016文件,我试图在其中基于另一个单元格值锁定和解锁单元格,该单元格正在运行索引匹配公式,因为该公式根据选择的下拉列表而变化。

因此,如果J13显示“正在接受”,则D13:G13未被锁定并且无法编辑。

如果显示“拒绝”,则D13:G13被锁定。

J13是一个索引匹配公式,因为它正在表中查找,以根据用户选择的下拉选项获得拒绝和接受更改的收集日期。

1 个答案:

答案 0 :(得分:0)

您需要在需要监视的工作表中添加以下代码。下面的代码将检查每次选择更改时单元格中的文本是否为“接受”。如果条件通过,它将锁定上述范围。使用适当的密码保护和取消保护您的工作表。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Unprotect Password:="pass"
Call lockAllCellsInSheet(ActiveSheet.Name)
    If Range("J13").Text = "Accepting" Then
        ActiveSheet.Range("D13:G13").Locked = True
    Else
        ActiveSheet.Range("D13:G13").Locked = False
    End If
ActiveSheet.Protect Password:="pass"
End Sub

这是锁定所有单元格的通用代码。另外,您可以做的是将所有单元格锁定为默认值,并删除下面的代码块以及上面代码中的函数调用。

Sub lockAllCellsInSheet(SheetName As String)
  lastCol = Sheets(SheetName).Range("a1").End(xlToRight).Column
  Lastrow = Sheets(SheetName).Cells(1, 1).End(xlDown).Row
  Sheets(SheetName).Range("A1", Sheets(SheetName).Cells(Lastrow, lastCol)).Locked = False
End Sub

如果您要监视特定范围,只需在选择更改代码中添加以下代码

Dim KeyCells As Range
Set KeyCells = Range("A1:B13") 'Range to be monitored
    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
        MsgBox "Cell " & Target.Address & " has changed."
    End If