Notifications
Clear all

Email por Macro não Funciona Worksheet_change

43 Posts
4 Usuários
0 Reactions
5,203 Visualizações
(@jmadao)
Posts: 0
New Member
Topic starter
 

Pessoal, boa noite
Tenho uma planilha que desejo que a mesma envie emails automatico a partir de um resultado em uma determinada celula.
Basicamente esta assim, a macro precisa verificar se a coluna "F", possui o a escrita SIM, se for verdadeiro a mesma envia os valores da linha da celula que contem a escrita sim.

Hoje a macro funciona, porem so funciona se eu escrever a palavra "Sim" e eu deixar uma formula de "SE" e mesmo que voltar "SIM", a macro nao reconhece e nao envia o email.
Sou novato no VBA, montei a macro com varios artigos que fui pesquisando, porem agora nao consigo mais evoluir.

A macro esta Sub de Change, fiz umas pesquisa e algumas pessoas disseram que era para usar Sub Calculate, porem nao obtive exito.
Se alguém conseguir me ajudar, fico muito agradeçido.

Segue scrip e estou utilizando:

Private Sub Worksheet_change(ByVal Target As Range)

Dim OutApp As Object
Dim OutMail As Object
Dim texto As String

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

linha = ActiveCell.Row - 1
If Target.Address = "$F$" & linha Then

If Plan1.Cells(linha, 6) = "SIM" Then

End If

HTML = HTML & "<head>"
HTML = HTML & "<body>"
HTML = HTML & "<font size='2' font color= #333333 face='Arial Unicode MS'>Caros, " & cliente & "</b></font></br>" '<b> é bold. <i> é itálico
HTML = HTML & "<br>" 'Equivalente ao enter
HTML = HTML & "<br>"

HTML = HTML & "</body>"
HTML = HTML & "</html>"

With OutMail
.To = Plan4.Cells(linha, 7)
'"Update Diário de Coleta " & ThisWorkbook.Sheets("Calc Proj").Range("b1").Value &
.cc = ""
.BCC = ""
.Subject = "Paciente Auto Risco - " & Plan4.Cells(linha, 3) & " - " & Plan4.Cells(linha, 2) & " - " & Plan4.Cells(linha, 1)
.HTMLBody = HTML
.Display 'Utilize Send para enviar o email sem abrir o Outlook
End With
On Error GoTo 0

Set OutMail = Nothing
Set OutApp = Nothing
End If

End Sub

Desde ja agradeço a todos, Jonatas

 
Postado : 03/05/2016 5:37 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Só para entender, em sua rotina incial temos o seguinte:

Aqui armazenamos o numero da linha em que estamos digitando
linha = ActiveCell.Row - 1

Aqui verificamos se o endereço alterado acima corresponde a coluna "F linha"
If Target.Address = "$F$" & linha Then
Então se tivermos digitado em qualquer coluna diferente de "F" a saimos da rotina sem executar nada

Mas se tivermos digitado por exemplo em "F2", será feito a verificação se na celula "F2" tem o valor "SIM"
If Plan1.Cells(linha, 6) = "SIM" Then
Se positivo continua e executa as instruções.

Então antes de continuar, precisaria saber como está utilizando seu modelo.
Onde exatamente tem a formula que retorna "SIM" e qual formula é ?

Você está digitando em alguma outra celula antes ?

Você tambem diz que : "a macro precisa verificar se a coluna "F", possui o a escrita SIM".
Verificar somente a linha digitada ou todas as linhas da Coluna F uma a uma em um Loop ?

Agora estou saindo, mais tarde se sobrar um tempinho e não obtiver resposta dou uma olhada.

[]s

 
Postado : 04/05/2016 1:50 pm
(@mprudencio)
Posts: 0
New Member
 

Disponibilize o arquivo assim podemos testar.

 
Postado : 04/05/2016 1:53 pm
(@jmadao)
Posts: 0
New Member
Topic starter
 

Mauro,
Seu entendimento esta perfeito, a formula é um = SE simples onde verifica se o valor da celula D10 for maior que 4000 volta "SIM"; A formula se incia a partir da celula f10.
Se eu escreve sim na F10, F11, F12 e assim por diante, cada sim escrito envia um email corretamente, porem se deixar a formula nos mesmos campos nao envia email.

Tentei inserir o arquivos de acordo com passo a passo, nao consegui. tenho o arquivo na nuvem onde poderia ajudar a comprender melhor.
link https://we.tl/7Deza72wb8

 
Postado : 04/05/2016 2:16 pm
(@jmadao)
Posts: 0
New Member
Topic starter
 

Marcelo, boa tarde
estou tentando inserir o arquivo porem nao consigo.
Se quiser tenho o link na nuvem do arquivo

link https://we.tl/7Deza72wb8

Desde ja agradeço a todos pela ajuda ate o momento

 
Postado : 04/05/2016 2:18 pm
(@mprudencio)
Posts: 0
New Member
 

Coloca em outro servidor pq nao consegui salvar

Pra anexar no forum clica em responder em vermelho

 
Postado : 04/05/2016 2:56 pm
(@jmadao)
Posts: 0
New Member
Topic starter
 

Marcelo,
Qual servidor posso colocar alguma dica?

Testei anexar planilhas aqui da certo, porem esta tem 8 megas e nao vai.

 
Postado : 04/05/2016 4:57 pm
(@mprudencio)
Posts: 0
New Member
 

Coloca aqui

www.sendspace.com

 
Postado : 04/05/2016 4:59 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vamos por parte, porque você não esclareceu todas as questões.

Vi seu modelo, e nas celulas "F10 até F14" não tem nenhuma formula, e não da para mexer porque é uma tabela dinamica que puxa os dados de outro arquivo. Acredito que as formulas ainda serão inseridas, então deixa eu tentar explicar melhor.

Primeiro : é a questão do:
Evento CHANGE : Para você entender, quando o utilizamos, ele executa determinadas ações conforme alteração de qualquer celula, menos por resultado de formulas, para isto podemos verificar apos alterar alguma celula o valor de "F10" e direcionar para executar o que queremos.
Segundo : Na rotina que envia email, é verificado somente uma celula, então se for para verificar e enviar de "F10 a F14" temos de criar um loop e ser executado de uma vez, senão a cada alteração será sempre enviado para o mesmo endereço conforme especificado na rotina "If Plan1.Cells(linha, 6) = "SIM"".

Terceiro, faltou você informar qual celula você está alterando para que a rotina seja executada.

Quarto, é uma sugestão : Se a intensão for enviar email a todos da coluna "F" que tenha a palavra "Sim", podemos esquecer a questão do Evento e criar uma rotina que você poderá executar atraves de um Botão, a qual verificará a condição de cada valor na coluna e enviará o email.

[]s

 
Postado : 04/05/2016 5:00 pm
(@jmadao)
Posts: 0
New Member
Topic starter
 

Marcelo,
Segue o link do send space
https://www.sendspace.com/file/pyl80v

 
Postado : 04/05/2016 7:17 pm
(@jmadao)
Posts: 0
New Member
Topic starter
 

Mauro, boa noite

Vamos por parte, porque você não esclareceu todas as questões.

Vi seu modelo, e nas celulas "F10 até F14" não tem nenhuma formula, e não da para mexer porque é uma tabela dinamica que puxa os dados de outro arquivo. Acredito que as formulas ainda serão inseridas, então deixa eu tentar explicar melhor.

-- Resposta: A planilha possui formulas ate depois F14, eu apenas escondi a formula se a linha em questao nao haver dados da tabela dinamica volta nada "".

Primeiro : é a questão do:
Evento CHANGE : Para você entender, quando o utilizamos, ele executa determinadas ações conforme alteração de qualquer celula, menos por resultado de formulas, para isto podemos verificar apos alterar alguma celula o valor de "F10" e direcionar para executar o que queremos.
Segundo : Na rotina que envia email, é verificado somente uma celula, então se for para verificar e enviar de "F10 a F14" temos de criar um loop e ser executado de uma vez, senão a cada alteração será sempre enviado para o mesmo endereço conforme especificado na rotina "If Plan1.Cells(linha, 6) = "SIM"".
Terceiro, faltou você informar qual celula você está alterando para que a rotina seja executada.

-- Resposta: Quando eu altero qualquer linha da da coluna "F" para Sim manualmente o email ativa e envia.

Quarto, é uma sugestão : Se a intensão for enviar email a todos da coluna "F" que tenha a palavra "Sim", podemos esquecer a questão do Evento e criar uma rotina que você poderá executar atraves de um Botão, a qual verificará a condição de cada valor na coluna e enviará o email

-- Resposrta: Minha intenção seria: Hoje tenho que acompanhar os pacientes com contas maiores de 4.000, sendo assim tenho uma tabela dinâmica ligada diretamente ao banco de dados, que tem loop de atualização de 20 em 20 min, onde se aparecer um paciente com conta de 4000 o email dispara por conta da formula da coluna "F", como a tabela dinamica vai acrescentando uma linha a cada vinte 20min, e mantendo o historico dos pacientes que ja passaram, pensei assim: hoje tenho um cliente com mais de 4000 envia um email, amanha se aparecer outro na tabela dinamica vai crescer mais uma linha caso o paciente seja maior que 4000. Colocoquei um loop de 20min, por conta que nao ira acumular varias linhas em uma unica atualização, para que a VBA nao se perca caso duas linhas apareça de uma unica vez, os 20 min é a margem de segurança para que VBA sempre enxergue uma linha por linha. Os históricos passados nao sofre alteração entao a VBA nao precisa verificar novamente. Foi assim que pensei, oque vocês acham?

 
Postado : 04/05/2016 7:34 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Acho que não expliquei direito, não tenho seu modelo aqui, mas pelo que me lembro de "F10 até F14" não tinha nenhuma fórmula, com certeza pelo fato de você estar digitando diretamente nas mesmas.
Quando eu disse sobre o Evento CHANGE, o que queria saber é se está alterando qualquer outra celula que não esteja compreendido na coluna "F" que contem as formulas, senão não teria o porque das formulas, e como já foi dito este evento não captura quando há alteração de resultados através de formulas, e o evento CHANGE só é chamado se fizer alteração "MANUALMENTE" em qualquer celula.

Mas levando em conta seu post anterior, você cita "que tem loop de atualização de 20 em 20 min", isto é feito com macro ? Se sim, então o ideal é colocar a rotina para verificar os dados na coluna "F" ao final da rotina de atualização.

Não entendi o que quer dizer com :
"Coloquei um loop de 20min, por conta que nao ira acumular varias linhas em uma unica atualização, para que a VBA nao se perca caso duas linhas apareça de uma unica vez, os 20 min é a margem de segurança para que VBA sempre enxergue uma linha por linha"

Que loop é este ? o que quer dizer com "nao ira acumular varias linhas em uma unica atualização" e "caso duas linhas apareça de uma unica vez" e tambem "é a margem de segurança para que VBA sempre enxergue uma linha por linha"
e mais :
"Os históricos passados nao sofre alteração entao a VBA nao precisa verificar novamente" - se entendi poderá repetir o mesmo paciente a cada 20 minutos, e se não for para enviar email a um que já tenha sido, terá de ser feito diferente, uma vez que a rotina não verifica se já foi enviado email anteriormente, sugiro adicionar uma nova coluna para marcar se já foi enviado email e na rotina ignora-los.

No meu entender você está complicando uma coisa que a principio seria mais simples, tipo :

1º ) Executa Rotina do Loop (atualização a cada 20 min)
2º ) Ao final instrução para verificar condições na coluna F e enviar email

O básico seria isto, só precisa definir a questão de resultados repetidos.

[]s

 
Postado : 05/05/2016 7:09 am
(@jmadao)
Posts: 0
New Member
Topic starter
 

Entendi, Mauro.
Sua explicação.
Então o ideal seria trocar o evento para Calculate? por conta da coluna F se formulas.
Fiz alguns testes com Calculate com alguns exemplos de consultas na internet, porem sem sucesso.

 
Postado : 05/05/2016 7:35 am
(@mprudencio)
Posts: 0
New Member
 

Alem dos comentarios do Mauro, observei o que disse que seria um problema

Na tabela dinamica, vc tem na coluna F as seguites informações

ENVIAR EMAIL ?
sim
sim
SIM
SIM
sim

E no VBA SIM entao se funcionar vai funcionar apenas nas linhas 3 e 4 as demais são consideradas DIFERENTES PELO VBA.

Como vc não disponibilizou a base nao é possivel arrumar

 
Postado : 05/05/2016 8:11 am
(@jmadao)
Posts: 0
New Member
Topic starter
 

Marcelo,
Pode observar que a formula esta F15, em diante, pode copiar e colar ela na celular F10, F11 e ....
Tem escritas SIM e sim, porque foi um testeque que eu fiz se o VBA diferencia o SIM ou sim, ele nao diferencia, as duas formas de escrita quando se digita ativa o email.
Quando eu copio a formula que esta na F15 em diante e colo na F10 nao ativa o email, mais se eu escrever SIM ou sim na F10 ativa o email.

A tabela dinamica esta com um filtro de maiores que 4000, pode tirar o filtro que vai carregar mais pacientes com resultado automatico com NAO, porque o valor é menor que 4000.
A tabela dinamica esta filtra, se tirar o filtro tem uma margem de pacientes para teste.

 
Postado : 05/05/2016 8:35 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Entendi, Mauro.
Sua explicação.
Então o ideal seria trocar o evento para Calculate? por conta da coluna F se formulas.
Fiz alguns testes com Calculate com alguns exemplos de consultas na internet, porem sem sucesso.

Esqueça o uso de eventos, uma vez que você não faz nenhuma alteração "MANUALMENTE".

Conforme eu citei anteriormente, não tem como alterar o filtro em seu modelo porque ele está com "VINCULO" a outro arquivo externo e se tentar da erro.

A condição "SIM" se maiuscula ou não da para ser tratada no VBA utilizando "UCASE ou LCASE".

Você não respondeu quanto a questão de Loop de atualização de 20 em 20 min que executa, se é por alguma rotina ou não.
Você não respondeu quanto a questão das repetições apos atualizações.

Resumindo, faça um cronograma detalhado do passo a passo de como utiliza seu modelo, pelo andamento deste tópico, só estou indo por suposições, assim só poderemos ajudar se soubermos realmente como o utiliza.

[]s

 
Postado : 05/05/2016 9:05 am
Página 2 / 3