Otimização Código -...
 
Notifications
Clear all

Otimização Código - Loop / Evitar erros

7 Posts
2 Usuários
0 Reactions
978 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde,

Tenho uma planilha que me envia documentos PDF de produção em horários pré determinados (2 em 2 horas basicamente) e funciona perfeitamente. Segue o código:

Public Sub ontime()

'SeM Análise de turno

Call Application.ontime(TimeValue("12:00:00"), "Analisesquimicas")

Call Application.ontime(TimeValue("12:01:00"), "EnviarEmail1")

'SeM Análise de turno

Call Application.ontime(TimeValue("14:00:00"), "Analisesquimicas")

Call Application.ontime(TimeValue("14:01:00"), "EnviarEmail1")

'Com análise de Turno
    
Call Application.ontime(TimeValue("16:00:00"), "Analisesquimicas")
        
Call Application.ontime(TimeValue("16:01:00"), "porturno")

Call Application.ontime(TimeValue("16:02:00"), "EnviarEmail2")

'SeM Análise de turno

Call Application.ontime(TimeValue("18:01:00"), "Analisesquimicas")

Call Application.ontime(TimeValue("18:02:00"), "EnviarEmail1")

'SeM Análise de turno

Call Application.ontime(TimeValue("20:01:00"), "Analisesquimicas")

Call Application.ontime(TimeValue("20:02:00"), "EnviarEmail1")

'SeM Análise de turno

Call Application.ontime(TimeValue("22:01:00"), "Analisesquimicas")

Call Application.ontime(TimeValue("22:04:00"), "EnviarEmail1")

'Com análise de Turno

Call Application.ontime(TimeValue("23:00:00"), "Analisesquimicas")
        
Call Application.ontime(TimeValue("23:02:00"), "porturno")

Call Application.ontime(TimeValue("23:03:00"), "EnviarEmail2")

'SeM Análise de turno

Call Application.OnTime(TimeValue("02:01:00"), "Analisesquimicas")

Call Application.OnTime(TimeValue("02:04:00"), "EnviarEmail1")

'SeM Análise de turno

Call Application.OnTime(TimeValue("04:01:00"), "Analisesquimicas")

Call Application.OnTime(TimeValue("04:02:00"), "EnviarEmail1")

'SeM Análise de turno

Call Application.ontime(TimeValue("06:01:00"), "Analisesquimicas")

Call Application.ontime(TimeValue("06:02:00"), "EnviarEmail1")

'Com análise de turno

Call Application.ontime(TimeValue("08:02:00"), "Analisesquimicas")
        
Call Application.ontime(TimeValue("08:03:00"), "porturno")

Call Application.ontime(TimeValue("08:04:00"), "EnviarEmail2")

'SeM Análise de turno

Call Application.ontime(TimeValue("10:00:00"), "Analisesquimicas")
  
Call Application.ontime(TimeValue("10:01:00"), "EnviarEmail1")


End Sub

Tenho 2 problemas com relação a este código, dos quais gostaria da ajuda de vocês, são eles:

1) Tenho que "rodar" a macro todos os dias, por isso gostaria de estabelecer um loop para que esta continuasse funcionado e só parasse quando eu quisesse;

2) Quando ocorre um erro na planilha excel (divisão por zero, etc ...) a macro da erro e para de rodar, no caso se for possível, um OnErro GoTo talvez resolveria, porém não consegui aplicar corretamente.

Desde já agradeço a atenção e ajuda de todos!

Obrigado,

Att,

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 29/01/2016 1:08 pm
(@mprudencio)
Posts: 2749
Famed Member
 

Questão 01 se vc fizer um loop que ela rode o tempo todo sem que vc ative o envio, ela vai travar o pc, vai ser necessario uma maquina para deixar a macro rodando o dia todo, pessoalmente nao creio que valha a pena.

Como vc nao deu mais detalhes e nao disponibilizou o arquivo modelo para se ter ideia de como tudo funciona, vou imaginar que vc use o arquivo durante o dia e se sim pode colocar a macro no evento selection_change da planilha que a macro vai ser disparada apos alteraçoes na planilha e vc pode organigar isso para acontecer em determinados horarios do dia.

Qto aos erros nao da pra ter ideia pq essa macro basicamente executa outra macro em determinadas horas do dias, entao o problema esta provavelmente na outra macro.

Provavelmente (tentar adivinhar e osso) a macro tenha um contador, se for esse o caso vc pode fazer o seguinte dentro da macro

if contador = 0 then

msgbox "Não existem valores a serem enviados"

else

executa a macro e envia o email

end if

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 29/01/2016 1:23 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

MPrudencio, muito obrigado por ser disponibilizar a ajudar.

Desculpe a falta de detalhes, vou explicar melhor. Onde trabalho a produção funciona 24 hrs por dia e a disponibilização/atualização dos dados saem de 2 em 2 hrs, por isso como pode ver a macro roda o dia todo, meia noite, 2 hrs da manhã, 4 hrs da manhã ... me enviando estes dados automaticamente por email permitindo que eu me atualize mesmo não estando na empresa (os resultados saem apenas na rede interna, por isso a necessidade de criar arquivos e enviar por e-mail)!

Hoje funciona da seguinte forma, todos os dias antes de meio-dia, eu "aciono" a macro e ela me envia os resultados nestes horários programados até no outro dia as 10 hrs d amanhã, onde tenho que acionar a macro novamente.

O fato dele estar rodando o dia todo não trava o pc, apenas no momento em que ela esta programada para chamar as outras macros, ex 14:00 hrs, da uma pequena travada (coisa de 5 seg) para rodar as outras macros que buscam o resultado (usei ApplicationScreenUpdating = false para melhorar isso).

Estou buscando este loop porque irei sair de férias e gostaria de deixar o pc ligado e programar a macro para continuar enviando os resultados todos os dias ...

Não disponibilizei a planilha porque o restante das macros funcionam perfeitamente, como explicado anteriormente neste post, a macro chave é esta disponibilizada que é a unica que tenho que rodar todos os dias.

Realmente os erro são provenientes das buscas dos dados em outras planilhas, que acontece de aparecer a mensagem de erro no excel e isso impede da macro continuar rodando. Por isso, acredito que o erro não esta no código, ele já funciona perfeitamente há 6 meses, o que gostaria e que quando ocorresse erro na planilha do excel (formulas por ex DIV, divisão por 0) a macro ignorasse a mensagem de erro do excel e continuasse rodando.

Att,

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 30/01/2016 9:36 am
(@mprudencio)
Posts: 2749
Famed Member
 

Sendo assim

Insira uma planilha no arquivo

Nomeie com o nome Ferias

Digite qualquer valor em A1 so nao pode ficar vazio

Cole esse codigo no modulo e execute

Sub envia()

Sheets("Ferias").Select

Sheets("Ferias").Range("A1").Select

Do While ActiveCell <> ""
Call Ontime
Loop

End Sub

Vai entrar em um loop infinito ate que seja interrompido pelo usuario ou por algum evento tipo falta de energia ou qualquer coisa so tipo

Qto ao erro de #DIV tem que ser tratado diretamente nas macros que ja rodam a 6 meses

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 30/01/2016 11:15 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

MPrudencio, novamente agradeço pela disponibilidade.

Já tentei utilizar Loop desta forma o que acontece é que a macro é acionada centenas de vezes em um mesmo horário, logo iria me mandar centenas de e-mails com os relatórios em um mesmo horário (com grande chance de travar). Para dizer a verdade não entendo exatamente o porque disso ocorrer, mas pelo que percebi ao rodar essa macro e que ela passa por todo o código deixando os horarios programados e se eu colocar o loop ela não espera o fim da macro para acionar o loop.

A forma que encontrei para rodar no final de semana foi a seguinte:

P/ Sábado:

Public Sub ontime2()

Call Application.ontime(Now + TimeValue("23:59:00"), "ontime")

End Sub

P/ Domingo:

Public Sub ontime3()

Call Application.ontime(Now + TimeValue("23:59:00"), "ontime2")

End Sub

Com isso, consigo rodar a macro após ela enviar os dados de todos os horários fugindo do problema que estava tendo com o loop. Porém para um período de férias se não houver outra alternativa terei que fazer 30 destes ...

Att,

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 01/02/2016 10:25 am
(@mprudencio)
Posts: 2749
Famed Member
 

Eu posso estar errado mas a macro so vai enviar os emails nos horarios informados na macro...

Não acredito que va mandar milhares de emails sem necessidade como lhe disse, ja tentou um teste assim????

Pelo menos nao deveria enviar emails fora dos horarios marcados.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 01/02/2016 10:40 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Ela irá mandar no horário marcado, porém irá mandar várias vezes. Porque por exemplo caso eu rode a macro 2 vezes quando der nos horários programados ela irá mandar 2 relatórios repetidos, se rodar 3 vezes mandará 3 relatórios repetidos nos horários programados e assim sucessivamente.

Com este loop irá rodar a macro centenas de vezes e enviará centenas de relatórios (se não travar) nos horários programados.

Pelo menos quando tentei foi desta maneira.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 01/02/2016 10:51 am