Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在一个单元格中输入数据后锁定特定的单元格组_Vba_Excel - Fatal编程技术网

Vba 在一个单元格中输入数据后锁定特定的单元格组

Vba 在一个单元格中输入数据后锁定特定的单元格组,vba,excel,Vba,Excel,在一个单元格中输入数据后,我需要使用VBA代码锁定一组特定的单元格。上下文:用户将沿着一行输入用户名、通行证等。该行中的一些单元格被锁定,一些单元格被解锁,用于他们需要输入数据的位置,但一旦他们在最后一个单元格中回答了他们的数据,我希望该行中以前解锁的所有单元格都被锁定 我很难让它工作,没有它不断更新和锁定细胞一遍又一遍。这就是我现在拥有的 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

在一个单元格中输入数据后,我需要使用VBA代码锁定一组特定的单元格。上下文:用户将沿着一行输入用户名、通行证等。该行中的一些单元格被锁定,一些单元格被解锁,用于他们需要输入数据的位置,但一旦他们在最后一个单元格中回答了他们的数据,我希望该行中以前解锁的所有单元格都被锁定

我很难让它工作,没有它不断更新和锁定细胞一遍又一遍。这就是我现在拥有的

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    ActiveCell.Select
    If Range("O22") <> "" Then
        ActiveSheet.Unprotect
        Range("F22,G22,J22,K22,L22,O22").Select
        Selection.Locked = True
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End If

End Sub
Private子工作簿\u SheetChange(ByVal Sh作为对象,ByVal Target作为范围)
ActiveCell。选择
如果范围为“O22”,则
活动表。取消保护
范围(“F22、G22、J22、K22、L22、O22”)。选择
Selection.Locked=True
ActiveSheet.Protect DrawingObject:=True,Content:=True,Scenarios:=True
如果结束
端接头

我觉得你更想要这样的东西(注意,这也是另一个事件)


20
更改为您希望代码在更改时运行的任何列。

如果希望工作簿在“O22”不为空时自动锁定该范围,则这是您需要的代码

Private Sub Worksheet_Change(ByVal Target As Range)
    'Check if O22 has changed before running rest of code
    If Not Intersect(Target, Range("O22")) Is Nothing Then
        'If the final column isn't empty then
        If Range("O22") <> vbNullString Then
            'Unprotect the sheet
            Me.Unprotect
            'Lock the target cells
            Me.Range("F22,G22,J22,K22,L22,O22").Locked = False
            'Reprotect the sheet
            Me.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        End If
    End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
'在运行其余代码之前,检查O22是否已更改
如果不相交(目标,范围(“O22”)为零,则
'如果最后一列不是空的,则
如果范围(“O22”)为空字符串,则
'取消对工作表的保护
我,解除保护
“锁定目标单元格
Me.范围(“F22,G22,J22,K22,L22,O22”)。锁定=错误
“重新保护床单
Me.Protect DrawingObject:=True,Contents:=True,Scenarios:=True
如果结束
如果结束
端接头
通常,在VBA中,应避免使用“选择”或“激活”,而是引用对象,请参见


很难准确判断工作簿的结构,但如果您将此代码复制到“工作表”代码模块中,则该代码应适用于相关工作表,如果您需要它在更多工作簿级别上工作,请提供所需的详细信息。

切勿在工作表更改或工作簿工作表更改事件过程中使用ActiveCell。它不仅通常不准确,而且可以通过键入以外的其他方式更改单元格值。我会将其更改为
私有子工作簿\u SheetChange(ByVal Sh作为对象,ByVal Target作为范围)
此工作簿中
并将
Me
更新为
Sh
,这样它可以在任何工作表上工作,也可以交换
范围(“O22”)
用于
目标
如果OP想要检查他们更改的单元格。或者,如果不相交(目标,范围(“O22”)什么都不是,那么可以将其包装在
中,如果需要更改的是O22。所有可能的替代方案,所以取决于OP想要什么。Intersect的性能更高。毫无疑问,在O22还没有改变的情况下,做这一切毫无意义,我只是快速地把它组合起来,我现在就修改它!我想OP只希望在他的工作簿的一页上发生这种情况,因为我认为如果每一页都设置为登录屏幕,那将是一个奇怪的工作簿,但是如果没有更多的信息,很难判断。
Private Sub Worksheet_Change(ByVal Target As Range)
    'Check if O22 has changed before running rest of code
    If Not Intersect(Target, Range("O22")) Is Nothing Then
        'If the final column isn't empty then
        If Range("O22") <> vbNullString Then
            'Unprotect the sheet
            Me.Unprotect
            'Lock the target cells
            Me.Range("F22,G22,J22,K22,L22,O22").Locked = False
            'Reprotect the sheet
            Me.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        End If
    End If
End Sub