Página 1 de 1

Performance no código VBA

Enviado: 08 Ago 2017 às 09:20
por fabiolegiao
Olá amigos,

Tenho um problema no código a seguir:

Public Sub MontarBlocos()

LinhaFinal = Application.WorksheetFunction.CountA([TabOrdSuce[OrdOperPred]]) + 1

Matriz = Sheets("TabOrdSuc").Range("A:B")

On Error Resume Next

For i = 2 To LinhaFinal



Do
PrimeiraBloco = Sheets("TabOrdSuc").Cells(i, 11).Value
If PrimeiraBloco = "x" Then
i = i + 1
End If
Loop While PrimeiraBloco = "x"

PrimeiraBloco = Sheets("TabOrdSuc").Cells(i, 11).Value

Sheets("Blocos").Columns(1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = PrimeiraBloco

Do
SegundoBloco = Sheets("Blocos").Columns(1).Cells(Rows.Count, 1).End(xlUp)
SegundaBloco = ""
Pesquisa = ""
Pesquisa = Application.WorksheetFunction.VLookup(SegundoBloco, Matriz, 2, False)

If Pesquisa <> "" Then
Sheets("Blocos").Columns(1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Pesquisa
End If

Loop While Pesquisa <> ""

Sheets("Blocos").Columns(1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = "x"


Next i



End Sub




Este código monta a sequência que os eventos têm que acontecer. Na coluna A contém os serviços predecessores e na coluna B os serviços sucessores. Na coluna K “Primeira” identifico através de fórmula as primeiras de cada bloco, como pode ser visto na tabela. (A lógica para identificar as primeiras de cada bloco é que, se ela não é sucessora de outra, logo ela é a primeira do bloco).
Uma vez identificado as primeiras ordens de cada bloco, a macro identifica a sucessora e copia para a planilhas blocos, em seguida ele pega esta mesma ordem e realiza a pesquisa até que a mesma esteja vazia, depois ele vai descendo a coluna K até encontrar o próximo valor diferente de X e repete tudo até o final da tabela.
Problema: o código está muito lento quando o universo está muito grande, gostaria de otimizá-lo para melhor performance.

Muito obrigados.

Re: Performance no código VBA

Enviado: 08 Ago 2017 às 10:32
por alexandrevba

Performance no código VBA

Enviado: 08 Ago 2017 às 10:57
por fabiolegiao
Alexandre,

Mesmo seguindo as dicas dos sites sugeridos a minha macro continua com um tempo de execução muito alto. Acredito que uma otimização nas estruturas de repetição melhorariam a performance, entretanto, não consigo enxergar essa tal otimização.

Re: Performance no código VBA

Enviado: 08 Ago 2017 às 13:03
por alexandrevba
Boa tarde!!

Usando o arquivo que você postou e com os dadas inalterados, foram 0,15 segundos gasto para finalizar essa macro.

Att

Re: Performance no código VBA

Enviado: 08 Ago 2017 às 15:49
por fabiolegiao
Alexandre,

Ante de tudo, muito obrigado pela sua atenção.

O que acontece é que na tabela (TabOrdSuc) eu mantive apenas 13 linhas para conseguir testar o código.

A tabela completa esta na tabela ao lado (TabOrdSucCompleta). Precisa copiar e colar, são 1056 linhas e leva mais de 7 minutos, entretanto, meu universo geralmente é de + ou - 20.000 linhas que dura uma eternidade.

Muito obrigado.

Re: Performance no código VBA

Enviado: 09 Ago 2017 às 10:54
por alexandrevba
Bom dia!!

Com 1069 linhas durou 0,23 segundos, com 12.807 linhas, durou 1,15 segundos.

Eu não sei se vou poder te ajudar com uma melhora no código, pois eu não sei o que está havendo do outro lado.

Eu uso um i5 3.20GHz, 4GB memoria RAM, office 2010 standard 32Bits Pt-Br


Att