Olá amigos!
Estou tentando colocar em minha planilha algumas msg automáticas que serão exibidas conforme a célula for preenchida com qualquer valor. Estou usando o seguinte código:
----------------------------------------------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Dim Mensagem
Mensagem = Sheets("msg").Range("d1").Value2
Set KeyCells = Range("j4")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
MsgBox " Obrigado, e lembre-se:" & Mensagem
End If
End Sub
--------------------------------------------------------------------------------------------------------
Este código esta funcionando muito bem, com exceção que ele sempre é ativado quando a célula é editada e isso acaba ficando um incomodo, com isso eu gostaria que ela apenas fosse ativada quando ela deixasse de ser nula ou apenas uma vez que ela fosse ativada.
Desde já agradeço a todos.
Boa tarde!!
Eu não testei o seu código mas, esse código vai disparar quando um valor for digitado e após o enter o código dispara.
com exceção que ele sempre é ativado quando a célula é editada e isso acaba ficando um incomodo
Uma pergunta ha formula nas células???
Att
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Veja se pode ser assim:
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False Application.EnableEvents = False On Error GoTo eventos Dim valor_novo Dim valor_anterior Dim KeyCells As Range Dim Mensagem Mensagem = Sheets("msg").Range("d1").Value2 Set KeyCells = Range("j4") valor_novo = KeyCells.Value Application.Undo valor_anterior = KeyCells.Value KeyCells.Value = valor_novo KeyCells.Offset(1, 0).Select If valor_anterior = "" Or valor_anterior = valor_novo Then GoTo eventos If Not Application.Intersect(KeyCells, Range(Target.Address)) _ Is Nothing Then MsgBox " Obrigado, e lembre-se:" & Mensagem End If eventos: Application.ScreenUpdating = True Application.EnableEvents = True End Sub
Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.
Gilmar
Isso, este código funciona toda vez que a celula é ativada ( tanto por formula como acessando manualmente e apertando enter), e nela não contem nenhuma formula.
Estou testando sua formula depois posto aqui o resultado.Obrigado.
gtsalikis Obrigado, mas o código que vc me passou ele aparece a mensagem quando eu limpo a celula e eu preciso do contrario, a mesangem deve aparecer exatamente quando ela é preenchida, ou deixa de ser nula. Meu código ativa a macro quando eu acesso a celula e isso que incomoda.
CaioBispo,
Boa Tarde!
Bem... não entendi muito bem o que esse seu código está fazendo. Entretanto, se o que você quer é que uma caixa de mensagem apareça sempre que uma determinada célula (a célula ativa, por exemplo) deixar de ser vazia (branca ou nula), o código pode ser este:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Value <> "" Then Msgbox "Célula Editada" End If
Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)
Atenciosamente
Wagner Morel
gtsalikis Obrigado, mas o código que vc me passou ele aparece a mensagem quando eu limpo a celula e eu preciso do contrario, a mesangem deve aparecer exatamente quando ela é preenchida, ou deixa de ser nula. Meu código ativa a macro quando eu acesso a celula e isso que incomoda.
Então, basta voltar no código e trocar esta linha:
If valor_anterior = "" Or valor_anterior = valor_novo Then GoTo eventos
Por esta:
If valor_novo = "" Or valor_anterior = valor_novo Then GoTo eventos
Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.
Gilmar
gtsalikis Obrigado, porém o problema ainda persiste, agora tudo o que escrevo fora da celula "J4" ele apaga, identifiquei que a linha Application.Undo faz esta ação, porém se eu a removo a formula não funciona. Eu só preciso que apenas quando a célula deixe de ser nula o aviso é emitido. Obrigado pela cooperação
Tem razão, não sei onde eu estava com a cabeça.
Veja agora:
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False Application.EnableEvents = False On Error GoTo eventos Dim valor_novo Dim valor_anterior Dim KeyCells As Range Dim Mensagem Set KeyCells = Range("j4") If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then valor_novo = KeyCells.Value Application.Undo valor_anterior = KeyCells.Value KeyCells.Value = valor_novo KeyCells.Offset(1, 0).Select If valor_novo = "" Or valor_anterior = valor_novo Then GoTo eventos Mensagem = Sheets("msg").Range("d1").Value2 MsgBox "Obrigado, e lembre-se: " & Mensagem End If eventos: Application.ScreenUpdating = True Application.EnableEvents = True End Sub
Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.
Gilmar
Muito obrigado gtsalikis, ficou da forma que eu queria, porém o erro na formula anterior fez eu perceber um erro em minha planilha. Vou explicar:
É de extrema importância que o campo "j4" esteja preenchido com a matricula da pessoa que esta tratando a planilha( e como existe muito teimoso que não segue regras ), e com isso seria muito interessante que qualquer ação seja bloqueada até que ela seja preenchida. Como posso fazer este bloqueio e a liberação somente com o preenchimento da célula? Estou encaminhando a planilha em anexo para facilitar. Obrigado pela ajuda.
Obs: o código da mensagem esta em "Plan1" o restante das minhas macros estão em "modulo1" ( não sei se é necessário fazer isso ;] )
Outro problema que encontrei foi que utilizo uma macro que verifica da lina 3 até a 150 e da coluna "A" até a "G" e o que tiver vazio ele preenche com "****" ( isso pq utilizo uma formula para contar). Com o código que vc passou ela ficou muito mas muitoooo lenta, isso pq a formula deve verificar célula por célula. Existe alguma forma de somente verificar a célula j4?
Com a planilha ficou mais fácil entender.
Use o código assim, acho que tem o que vc quer:
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False Application.EnableEvents = False On Error GoTo eventos Dim valor_novo Dim valor_anterior Dim KeyCells As Range Dim CurCell As Range Dim Mensagem Mensagem = Sheets("msg").Range("d1").Value2 Set KeyCells = Range("j4") Set CurCell = Target valor_novo = CurCell.Value2 Application.Undo MsgBox " Por favor, preencha primeiramente o campo MATRÍCULA antes de iniciar o trabalho. Obrigado." valor_anterior = CurCell.Value CurCell = valor_novo CurCell.Offset(1, 0).Select If valor_novo = "" Or valor_anterior = valor_novo Then GoTo eventos If Not Application.Intersect(KeyCells, Range(Target.Address)) _ Is Nothing Then MsgBox " Obrigado, e lembre-se:" & Mensagem End If eventos: Application.ScreenUpdating = True Application.EnableEvents = True End Sub
E o outro código que ficou com problema, use assim:
Sub Preencher() Application.ScreenUpdating = False Application.EnableEvents = False For coluna = 1 To 7 For linha = 3 To 150 If Cells(linha, coluna).HasFormula = False Then If Cells(linha, coluna) = Empty Then Cells(linha, coluna) = "****" End If End If Next linha Next coluna Application.ScreenUpdating = True Application.EnableEvents = True End Sub
Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.
Gilmar