Notifications
Clear all

Ativando MSGBOX através da célula preenchida

12 Posts
4 Usuários
0 Reactions
2,192 Visualizações
(@caiobispo)
Posts: 53
Trusted Member
Topic starter
 

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.

 
Postado : 01/06/2014 10:47 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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

 
Postado : 01/06/2014 11:01 am
(@gtsalikis)
Posts: 2373
Noble Member
 

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

 
Postado : 01/06/2014 11:07 am
(@caiobispo)
Posts: 53
Trusted Member
Topic starter
 

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.

 
Postado : 01/06/2014 11:10 am
(@caiobispo)
Posts: 53
Trusted Member
Topic starter
 

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.

 
Postado : 01/06/2014 12:39 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

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

 
Postado : 01/06/2014 1:34 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

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

 
Postado : 01/06/2014 3:39 pm
(@caiobispo)
Posts: 53
Trusted Member
Topic starter
 

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

 
Postado : 02/06/2014 1:58 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

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

 
Postado : 02/06/2014 2:37 pm
(@caiobispo)
Posts: 53
Trusted Member
Topic starter
 

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 ;] )

 
Postado : 02/06/2014 10:24 pm
(@caiobispo)
Posts: 53
Trusted Member
Topic starter
 

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?

 
Postado : 03/06/2014 12:33 am
(@gtsalikis)
Posts: 2373
Noble Member
 

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

 
Postado : 03/06/2014 9:53 am