- 11 Jan 2019 às 10:35
#40030
Bom dia Galera,
Estou precisando de um ajuda com a seguinte situação, tenho uma planilha em que preciso inserir os dados e em seguida impedir que o mesmo seja alterado, isso eu conseguir com o código abaixo, logo após inserir algum dado na célula que faz parte do intervalo (Coluna B) definido no código ela fica bloqueada:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ColunasB As Range
Set ColunasB = Range("B6:B1000")
If Not Application.Intersect(ColunasB, Range(Target.Address)) Is Nothing Then
ActiveSheet.Unprotect ("123")
linha = Target.Row
Range("B" & linha).Locked = True
ActiveSheet.Protect ("123"), DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
End Sub
Preciso também que seja registrada a data que esse dado foi inserido na célula que faz parte do intervalo, isso também eu consigo com o código abaixo:
Dim limite_maximo As Integer
limite_maximo = 1000 ' altere aqui para limitar a última linha
If Alvo.Cells.Count > 1 Or IsEmpty(Alvo) Then Exit Sub
' faz nada se mais de uma célula modificada ou se deu delete
If Alvo.Column <= 2 And Alvo.Row >= 2 And Alvo.Row <= limite_maximo Then
' o if acima garante que a célula modificada está dentro do intervalo definido: A1:Z1000
' desliga captura do evento change
Application.EnableEvents = False
' muda a célula C da linha correspondente
Alvo.Offset(0, 1).Value = Date 'Troque por Date() se quiser que mostre a data ao invés do horário
' religa a captura de eventos
Application.EnableEvents = True
End If
Usados individualmente os dois códigos rodam de boa, mas quando tento utilizar os dois, o registro da alteração é feita, porém todas as células do intervalo já ficam bloqueadas, mesmo as que não inserir nada ainda.
Espero ter conseguindo ser claro, e que possam me ajudar com essa situação, desde já agradeço.
abaixo segue como estou colocando os dois códigos juntos:
Private Sub Worksheet_Change(ByVal Alvo As Range)
Dim ColunasB As Range
Set ColunasB = Range("B6:B1000")
If Not Application.Intersect(ColunasB, Range(Alvo.Address)) Is Nothing Then
ActiveSheet.Unprotect ("123")
linha = Alvo.Row
Range("B" & linha).Locked = True
ActiveSheet.Protect ("123"), DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
Dim limite_maximo As Integer
limite_maximo = 1000 ' altere aqui para limitar a última linha
If Alvo.Cells.Count > 1 Or IsEmpty(Alvo) Then Exit Sub
' faz nada se mais de uma célula modificada ou se deu delete
If Alvo.Column <= 2 And Alvo.Row >= 2 And Alvo.Row <= limite_maximo Then
' o if acima garante que a célula modificada está dentro do intervalo definido: A1:Z1000
' desliga captura do evento change
Application.EnableEvents = False
' muda a célula C da linha correspondente
Alvo.Offset(0, 1).Value = Date 'Troque por Date() se quiser que mostre a data ao invés do horário
' religa a captura de eventos
Application.EnableEvents = True
End If
End Sub
Estou precisando de um ajuda com a seguinte situação, tenho uma planilha em que preciso inserir os dados e em seguida impedir que o mesmo seja alterado, isso eu conseguir com o código abaixo, logo após inserir algum dado na célula que faz parte do intervalo (Coluna B) definido no código ela fica bloqueada:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ColunasB As Range
Set ColunasB = Range("B6:B1000")
If Not Application.Intersect(ColunasB, Range(Target.Address)) Is Nothing Then
ActiveSheet.Unprotect ("123")
linha = Target.Row
Range("B" & linha).Locked = True
ActiveSheet.Protect ("123"), DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
End Sub
Preciso também que seja registrada a data que esse dado foi inserido na célula que faz parte do intervalo, isso também eu consigo com o código abaixo:
Dim limite_maximo As Integer
limite_maximo = 1000 ' altere aqui para limitar a última linha
If Alvo.Cells.Count > 1 Or IsEmpty(Alvo) Then Exit Sub
' faz nada se mais de uma célula modificada ou se deu delete
If Alvo.Column <= 2 And Alvo.Row >= 2 And Alvo.Row <= limite_maximo Then
' o if acima garante que a célula modificada está dentro do intervalo definido: A1:Z1000
' desliga captura do evento change
Application.EnableEvents = False
' muda a célula C da linha correspondente
Alvo.Offset(0, 1).Value = Date 'Troque por Date() se quiser que mostre a data ao invés do horário
' religa a captura de eventos
Application.EnableEvents = True
End If
Usados individualmente os dois códigos rodam de boa, mas quando tento utilizar os dois, o registro da alteração é feita, porém todas as células do intervalo já ficam bloqueadas, mesmo as que não inserir nada ainda.
Espero ter conseguindo ser claro, e que possam me ajudar com essa situação, desde já agradeço.
abaixo segue como estou colocando os dois códigos juntos:
Private Sub Worksheet_Change(ByVal Alvo As Range)
Dim ColunasB As Range
Set ColunasB = Range("B6:B1000")
If Not Application.Intersect(ColunasB, Range(Alvo.Address)) Is Nothing Then
ActiveSheet.Unprotect ("123")
linha = Alvo.Row
Range("B" & linha).Locked = True
ActiveSheet.Protect ("123"), DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
Dim limite_maximo As Integer
limite_maximo = 1000 ' altere aqui para limitar a última linha
If Alvo.Cells.Count > 1 Or IsEmpty(Alvo) Then Exit Sub
' faz nada se mais de uma célula modificada ou se deu delete
If Alvo.Column <= 2 And Alvo.Row >= 2 And Alvo.Row <= limite_maximo Then
' o if acima garante que a célula modificada está dentro do intervalo definido: A1:Z1000
' desliga captura do evento change
Application.EnableEvents = False
' muda a célula C da linha correspondente
Alvo.Offset(0, 1).Value = Date 'Troque por Date() se quiser que mostre a data ao invés do horário
' religa a captura de eventos
Application.EnableEvents = True
End If
End Sub