como otimizar loops

Tem alguma dica para o uso do Excel? Algum atalho especial? Algum macete? Aqui é o lugar para você compartilhar!

como otimizar loops

Mensagempor Edcronos » Dom Jul 05, 2015 12:46 pm

Muita gente confunde tamanho de macro com velocidade

uma macro de 500 linhas pode ser mais rápida do que uma de 50 linha para fazer a mesma coisa

Nos Loop isso se torna ainda mais evidente
imagina o seguinte loop de 1 milhão de ciclos
Código: Selecionar todos
n=1
    For L=1 to 1000000
        if n=1 then
           ...
        end if
           if n=0 then
              ...
           end if
    next


se um dos if não é necessário durante o loop, por menos tempo que leve a verificação esse pouquíssimo tempo vai ser multiplicado por 1milhão
nesse outro código uma das verificações é tirada de dentro do loop
Código: Selecionar todos
n=1
         if n=1 then
            For L=1 to 1000000
              ...
            next
        end if
      if n=0 then
            For L=1 to 1000000
           ...
            next
       end if

em grandes loops onde se tem varias verificações que apenas uma ou outra é verdadeira durante o loop se pode economizar bastante tempo de acordo com o caso

essa é apenas uma maneira simples de expor o caso

goto e gosub :
muita gente critica o goto e o gosub falando que torna o código difícil de lê
mas tem vários casos que eles tornam o código mais simples e talvez mais rapido

considero o estudo das funções importante para o aprendizado de logica de programação, isso pq são comandos simples e fáceis que estimulam o raciocínio estrutural da pessoa.
se vale a pena usar ou se torna o código difícil, se é criticado pelos ditos profissionais ou não, cada um que deve escolher o rumo
"conselhos as vezes nos livram de um monte de dor de cabeça mas, aprender a pensar por sí próprio tbm é importante, afinal nem sempre vamos ter esses profissionais para resolver nossos problemas"

Goto
quando eu aprendi em um tk90x ele pulava para linhas Goto 100
no VBA se pode colocar uma bandeira na posição que tem que ir

Goto saida
...
...
Saida:
...
end sub

no vba exite o exit for, exit if
mas e se tiver um monte de for next e um monte de if alinhados ?
for:if:for:if:for:if:end if:end if:next:end if:next
mas e se dependendo da situação se queira sair de todos os if e loop internos?
Código: Selecionar todos
for:

  if:
     for:
        if:
          for
              if:
                "como sair de todos os laços e ir para o primeiro?" Goto Pulou
              end if:
          next
        end if:
     next:
  end if:

Pulou:

next

SE alguém tiver uma maneira mais fácil gostaria de aprender tbm

bem essa é apenas um das utilidades
o gosub é outro caso que depois eu ensino
Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"
Edcronos
Membro
Membro
 
Mensagens: 1062
Registrado em: Ter Mar 18, 2014 3:40 pm
Has thanked: 87 times
Have thanks: 205 times

{ SO_SELECT }

Re: como otimizar loops

Mensagempor Edcronos » Dom Jul 05, 2015 6:28 pm

No primeiro exemplo que dei o segundo codigo elimina os 2 if dentro do loop, somente tem a verificação para entrar no loop

algo que o pessoal usa muito
laço For each

serve para percorrer de maneira facil uma area "serve para percorrer itens de objetos tbm, mas no momento não vem ao caso"
Código: Selecionar todos
Sub ggh()
    Area = "A1:H1000"
    ValorX = 1000
    For Each scell In Range(Area)
        If scell.Value = ValorX Then
            MsgBox " Valor = " & scell.Value2 & " Na Coluna =" & scell.Column & " e linha =" & scell.Row
            Exit Sub
        End If
    Next
End Sub


com laço for next fica mais ou menos assim
Código: Selecionar todos
Sub ggh()
    Area = "A1:H1000"
    ValorX = 1000
    For Linha = 1 To 1000
        For coluna = 1 To 8    'A=1; H=8
            If Cells(Linha, coluna).Value2 = ValorX Then GoTo saida
        Next
    Next
    MsgBox "Valor não encontrado"

    Exit Sub    'sai da macro antes de passar pela saida

saida:
    MsgBox " Valor = " & ValorX & " Na Coluna =" & coluna & " e linha =" & Linha
End Sub



mas e se quiser achar o ultimo valor "x" da mesma area ?

ficaria mais ou menos assim:
Código: Selecionar todos
Sub ggh()
    Area = "A1:H1000"
    valorX = 1000
    For Each scell In Range(Area)
        If scell.Value = 1000 Then
            colun = " Coluna =" & scell.Column
            Line = " linha =" & scell.Row
        End If
    Next
     MsgBox " Valor = " & valorX & " Na Coluna =" & colun & " e linha =" & Line
End Sub

mas em cada busca tem que percorrer todas as celulas da área

com o laço for nex não acontece isso e com muito pouca modificação
Código: Selecionar todos
Sub ggh()
    Area = "A1:H1000"
    ValorX = 1000
    For Linha = 1000 To 1 Step -1   ' se coloca o Step e um valor negativo para contagem do maior para o menor
        For coluna = 1 To 8    'A=1; H=8
            If Cells(Linha, coluna).Value2 = ValorX Then GoTo saida
        Next
    Next

    MsgBox "Valor não encontrado"

    Exit Sub    'sai da macro antes de passar pela saida

saida:
    MsgBox " Valor = " & ValorX & " Na Coluna =" & coluna & " e linha =" & Linha
End Sub

Somente é impossíveis até que alguém faça
A logica está presa na irracionalidade humana, e morta nos que se consideram donos da verdade.

"ALGUM MODERADOR ME EXPULSE DO FÓRUM POR FAVOR"
Edcronos
Membro
Membro
 
Mensagens: 1062
Registrado em: Ter Mar 18, 2014 3:40 pm
Has thanked: 87 times
Have thanks: 205 times


Voltar para Dicas & Macetes

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante