2017-08-04 53 views
1

一旦数据输入到一个单元格中,我需要使用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 
+0

**从不**在Worksheet_Change或Workbook_SheetChange事件过程中使用ActiveCell。它不仅通常不准确,而且单元格的值可以通过打字以外的其他方式进行更改。 – Jeeped

回答

0

像你想要更多的东西像这样(请注意这是在不同的情况下也是如此)

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Target.Column = 20 Then 
    Range("F22,G22,J22,K22,L22,O22").Locked = True 
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 
    End If 

End Sub 

更改20到你想要的代码,它改变运行任何列听起来给我。

1

如果你想在工作簿自动锁定该范围内,如果“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 

一般在VBA你应该避免使用过“选择”或'激活',而是引用对象,请参阅this question.

很难准确判断工作簿的结构,但如果您将此代码复制到“工作表”代码模块中,那么它应该适用于有问题的工作表,如果您需要它在更多的工作簿级别上工作,然后请给出更多的细节。

+1

我会在'ThisWorkbook'中将它更改为'Private Sub Workbook_SheetChange(ByVal Sh As Object,ByVal Target As Range)'并将'Me'更新为'Sh',以便它可以在任何表单上工作,并且可以交换'Range(“如果OP想要检查他们改变的单元格,可以使用O22“)'作为'Target'。或者,如果它需要被更改的O22,则可以将它包裹在“如果不相交”(目标,范围(“O22”))为“Nothing Then”。所有可能的选择,这取决于OP想要的。 –

+1

Intersect绝对是更高性能的,没有意义的是当O22甚至没有改变时,我只是把它们放在一起,我现在就修改它!我想OP只会希望在他的工作簿中发生这种情况,因为如果每张表单都设置为登录屏幕,但是如果没有更多信息就很难判断,我认为这将会是一个奇怪的工作簿。 –

相关问题