Notifications
Clear all

como otimizar loops

2 Posts
1 Usuários
0 Reactions
1,253 Visualizações
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

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

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

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?

 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

 
Postado : 05/07/2015 9:46 am
(@edcronos)
Posts: 1006
Noble Member
Topic starter
 

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"

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

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:

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

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

 
Postado : 05/07/2015 3:28 pm