Notifications
Clear all

Deixar uma parte do código rodando prioritariamente

11 Posts
6 Usuários
0 Reactions
2,556 Visualizações
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Boa noite pessoal

Na minha planilha os dados são recebidos externamente por fórmulas que estão numa range de células, e que ficam "piscando" atualizando seus valores, então uma parte do meu código as processa quando chegam novos dados e distribuem esses dados em linhas, porém, fiz um levantamento e percebi que enquanto uma segunda parte do código está processando essas linhas, novos dados chegam naquelas fórmulas e portanto a parte que geram as linhas precisaria processar imediatamente esses novos dados, pois eles rapidamente são atualizados, e como hoje isso não acontece, tenho a perda desses dados, porque quando o código processa novamente as fórmulas, já são outros novos dados.

Gostaria de saber se existe a possibilidade de dividir o código e deixar essa parte primária rodando com prioridade, independente da parte secundária, enquanto a secundária vai processando os dados obtidos da primária digamos, com mais "calma", ou seja, sem prioridade e sem precisar ser interrompida no meio do processo.

Em outras palavras, havendo atualização, as linhas continuam sendo geradas independentemente se outra parte do código está rodando ou não.

Obrigado

 
Postado : 28/03/2018 4:40 pm
(@lustosag)
Posts: 39
Eminent Member
 

Poderia postar seu código ou planilha?

Att:

Lustosa

 
Postado : 29/03/2018 5:31 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Infelizmente não posso

Posso dizer que ele roda só com uma única Private Sub Worksheet e ela dá Call em dois módulos

Mas o "grosso" é feito somente na Private Sub Worksheet

Obrigado

 
Postado : 29/03/2018 6:15 am
(@mprudencio)
Posts: 2749
Famed Member
 

A planilha nao precisa ter dados reais, somente exemplos.

E o codigo que vc utiliza,a para uma possivel melhora.

Observei que vc usa muitos selects, isso deixa o processo lento.

Talvez apenas reescrever o codigo ja resolva boa parte dos problemas.

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/03/2018 11:55 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Infelizmente não posso mesmo disponibilizar

Alguém sabe pra me dar uma luz?

Sabem se Private Subs, Subs na planilha ou em módulos tem prioridades diferentes?

Obrigado

 
Postado : 03/04/2018 4:52 am
(@klarc28)
Posts: 971
Prominent Member
 

Só uma observação:

Dizer

Private Sub Worksheet

É o mesmo que dizer nada com nada, pois o evento está incompleto.

O evento completo seria:

Private Sub Worksheet_SelectionChange

Ou:

Private Sub Worksheet_Change

Ou:

Private Sub Worksheet_Activate

Ou outro.

Agora sobre o tópico em questão:

A prioridade é dada pela ordem de chamada na programação. Neste caso, o procedimento chamado primeiro é executado primeiro e o procedimento chamado depois é executado depois. Mas acho que você está falando em executar dois procedimentos simultaneamente.
Não entendo disso, mas creio que é chamado de "threads".
O site a seguir fala sobre isso:

http://www.macoratti.net/vbn_thd1.htm

 
Postado : 03/04/2018 5:59 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Fala Klarc28

O que preciso exatamente é realizar procedimentos simultaneamente, analisei o link que você passou e entendi que o computador trabalha fazendo uma coisa de cada vez e em determinado momento ele dá uma "pausa" em uma coisa, faz outra e depois volta pra primeira, alternando assim sucessivamente

Pelo jeito a palavra é essa mesmo "threads"

Agora, alguém sabe trabalhar com threads?

Não consegui entender

Complementando sobre meu código tenho:

Private Sub Worksheet_Calculate
Private Sub Worksheet_Change
E 2 módulos com Subs simples chamadas pela Private Sub Worksheet_Change

Obrigado

 
Postado : 05/04/2018 5:50 am
(@skulden)
Posts: 170
Estimable Member
 

O Excel não faz multithreading nativamente, você pode consultar aplicações feitas por terceiros que solucionam isso: http://analystcave.com/excel-vba-multithreading-tool/ . Mas ai você opta por colocar seu projeto em risco.

O que você quer não é nem processo de multithreading, você só precisa melhorar o código. Se a cada vez que chega novos dados você precisa reiniciar o seu outro procedimento, é só verificar se a cada loop do procedimento houve mudança nos dados, se sim, reinicia o procedimento.

Se a resposta lhe foi útil, clique no joinha!

 
Postado : 05/04/2018 7:02 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Pessoal obrigado pela dicas

Pelo visto threads não vão me ajudar e/ou não é a solução, então uma possível solução que encontrei foi trabalhar com 2 arquivos Excel, parece que ameniza meu problema, só preciso fazer funcionar unindo os 2

Pra não haver redundância aqui no fórum segue o link abaixo que acabou unindo o assunto deste post com o outro

http://www.planilhando.com.br/forum/viewtopic.php?f=10&t=27896

Obrigado

 
Postado : 11/04/2018 5:26 am
(@ramzero)
Posts: 127
Estimable Member
Topic starter
 

Se a cada vez que chega novos dados você precisa reiniciar o seu outro procedimento, é só verificar se a cada loop do procedimento houve mudança nos dados, se sim, reinicia o procedimento.

O problema é que não posso simplesmente reiniciar, preciso terminar aquela sequencia do código para depois começar ele de novo do começo, ou seja, preciso dar uma pausa onde está, fazer aquele procedimento principal e depois voltar de onde parou e seguir em frente

Se eu reiniciar perco informações de outro jeito e/ou pode haver redundância gerando dados falsos

Valeu Skulden

 
Postado : 17/04/2018 7:40 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde,

Lendo os seus tópicos, só posso sugerir que inicie um procedimento jogue numa célula realize outro e volte pegando os valores.

Recomendo seguir as sugestões do colega 'klarc28', está no outro tópico.

att,

 
Postado : 17/04/2018 3:10 pm