Notifications
Clear all

Do While.... Loop

12 Posts
2 Usuários
0 Reactions
1,542 Visualizações
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

Eu estou com uma dúvida, sempre achei (e pelo oq eu saiba usei) esse sequencia para gerar um loop de forma que ele executaria o loop se verdadeiro....

Então aqui está...
O valor inicial para a vaiável uprng = 2 e vai crescendo enqnto a maxrng é 1698 e é a limite, então quero que o loop continue enqnto uprng for menor que maxrng.

Do While uprng < maxrng
    Range("L" & uprng).End(xlDown).Copy
    botrng = Range("L" & uprng).End(xlDown)
    botrng = Replace(botrng, "$", "-", 1, 1)
    botrng = Mid(botrng, InStr(1, botrng, "$") + 1, Len(botrng) - InStr(1, botrng, "$"))
Loop

Só que eu não estou fazendo ele entrar no loop, uprng < maxrng = falso mas 2 < 1698 e deveria ser verdadeiro!! Notei que se eu invertesse o sinal, funciona, mas ai a lógica foi para o beleléu!
Alguem com algum insight? Estou cansado, mas... será que é algo mto óbvio que não estou percebendo??

Obrigado pela atenção.

Final

 
Postado : 20/05/2013 5:20 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

No seu loop aparentemente não há o incremento da variavel uprng, então a mesma sempre terao valor 2
Então experimente assim>

Do While uprng < maxrng
Range("L" & uprng).End(xlDown).Copy
botrng = Range("L" & uprng).End(xlDown)
botrng = Replace(botrng, "$", "-", 1, 1)
botrng = Mid(botrng, InStr(1, botrng, "$") + 1, Len(botrng) - InStr(1, botrng, "$"))
uprng=uprng+1
Loop

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

 
Postado : 20/05/2013 5:26 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Além da resposta do reinaldo...leia:
http://doutorexcel.wordpress.com/2011/0 ... -wend-vba/
http://www.ozgrid.com/VBA/do-while-loop.htm
http://www.databison.com/index.php/exce ... ntil-loop/
Att

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

 
Postado : 20/05/2013 5:36 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

além do que o Reinaldo disse, vc precisa confirmar que de fato estas variáveis têm este valor

uprng = 2
maxrng=1698
Do While uprng < maxrng
Range("L" & uprng).End(xlDown).Copy
botrng = Range("L" & uprng).End(xlDown)
botrng = Replace(botrng, "$", "-", 1, 1)
botrng = Mid(botrng, InStr(1, botrng, "$") + 1, Len(botrng) - InStr(1, botrng, "$"))
uprng=uprng+1
Loop

digo, se vc nao informar ou confirmar que as variáveis de fato tem seus valores, entao o VBE está interpretando 0 < 0 e isso é falso ...

F.F.

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

 
Postado : 20/05/2013 6:10 pm
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

No seu loop aparentemente não há o incremento da variavel uprng, então a mesma sempre terao valor 2
Então experimente assim>

Do While uprng < maxrng
Range("L" & uprng).End(xlDown).Copy
botrng = Range("L" & uprng).End(xlDown)
botrng = Replace(botrng, "$", "-", 1, 1)
botrng = Mid(botrng, InStr(1, botrng, "$") + 1, Len(botrng) - InStr(1, botrng, "$"))
uprng=uprng+1
Loop

Boa noite obrigado por responder,
Então eu só coloquei uma parte do código, mas meu problema é com o fato que ela está considerando VERDADEIRO essa inequação: 2>1690

Vide código até aonde parei, coloquei anotações nas linhas que considero importante:

Sub inputnf()
Dim maxrng, uprng, botrng As Variant

Sheets(1).Select
Range("L2").Select
celladd = ActiveCell.Address
uprng = Replace(celladd, "$", "-", 1, 1)
uprng = Mid(uprng, InStr(1, uprng, "$") + 1, Len(uprng) - InStr(1, uprng, "$")) 'variável adota valor = 2
maxrng = Range("C1048576").End(xlUp).Address
maxrng = Replace(maxrng, "$", "-", 1, 1)
maxrng = Mid(maxrng, InStr(1, maxrng, "$") + 1, Len(maxrng) - InStr(1, maxrng, "$")) 'variável pega ultimo cadastro e adota o valor (no caso = 1690)

Do While uprng > maxrng ' Faça enquanto 2(uprng) > 1690 (maxrng), essa inequação do jeito que está, está entrando no loop...mas essa inequação está incorreta... esperava  usar "<" pois 2<1690 é verdadeiro, logo daria sequencia no loop.
    
    botrng = Range("L" & uprng).End(xlDown).Offset(-1, 0).Address
    botrng = Replace(botrng, "$", "-", 1, 1)
    botrng = Mid(botrng, InStr(1, botrng, "$") + 1, Len(botrng) - InStr(1, botrng, "$"))
    Range("L" & uprng).Copy
    Range("A" & uprng & ":" & "A" & botrng).PasteSpecial (xlPasteValues)
    
    uprng = Range("L" & uprng).End(xlDown).Address 'aqui está o incremento, procuro o último valor achado (no caso inicial L2) vou para baixo na proxima cheia e adoto o valor daquela linha....
    uprng = Replace(uprng, "$", "-", 1, 1)
    uprng = Mid(uprng, InStr(1, uprng, "$") + 1, Len(uprng) - InStr(1, uprng, "$"))
    
Loop

End Sub

Obrigado pela atenção.
final

 
Postado : 20/05/2013 6:16 pm
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

Boa noite!!

Além da resposta do reinaldo...leia:
http://doutorexcel.wordpress.com/2011/0 ... -wend-vba/
http://www.ozgrid.com/VBA/do-while-loop.htm
http://www.databison.com/index.php/exce ... ntil-loop/
Att

Boa noite,

Obrigado por responder mas acredito que não seja um problema de sintaxe dei uma olhada e estou seguindo a estrutura do Do While....Loop correta:

Do while x<y (condição)
Processo para esse DO
Loop

 
Postado : 20/05/2013 6:18 pm
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

além do que o Reinaldo disse, vc precisa confirmar que de fato estas variáveis têm este valor

uprng = 2
maxrng=1698
Do While uprng < maxrng
Range("L" & uprng).End(xlDown).Copy
botrng = Range("L" & uprng).End(xlDown)
botrng = Replace(botrng, "$", "-", 1, 1)
botrng = Mid(botrng, InStr(1, botrng, "$") + 1, Len(botrng) - InStr(1, botrng, "$"))
uprng=uprng+1
Loop

digo, se vc nao informar ou confirmar que as variáveis de fato tem seus valores, entao o VBE está interpretando 0 < 0 e isso é falso ...

F.F.

Suspeito que seja esse o ponto, o excel nao está entendendo os valores dessas variáveis.... pois embora eu não utilize um contador X=X+1 comum, no código "completo" esse valor da uprng muda sim, não através de um "contador" mas recebendo o valor como antes.

Veja o que estou fazendo é pegando os endereços das celulas e excluindo todo o "lixo" ($A$) e ficando com o que me interessa, que são as linhas limites superior e inferior que variam de comprimento de ítem para ítem. E de acordo com essas linhas estou descendo e preenchendo o que almejo.

 
Postado : 20/05/2013 6:24 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!
Seria bom, postar as postagens cruzadas!!!
http://www.mrexcel.com/forum/excel-ques ... -loop.html

Veja se a resposta do Rick te ajuda

Sub FillInvoiceBlanks()
  On Error Resume Next
  Range("L2:L" & Cells(Rows.Count, "C").End(xlUp).Row).SpecialCells(xlBlanks).FormulaR1C1 = "=R[-1]C"
  On Error GoTo 0
  Columns("L").Value = Columns("L").Value
End Sub

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

 
Postado : 20/05/2013 7:04 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Chegando de paraquedas, hoje foi um dia cansativo para analisar a rotina inteira para saber onde quer chegar, apesar de já terem esmiuçado acima, eu não entendi porque está usando "Replace" apos a linha : "celladd = ActiveCell.Address" seria mais fácil utilizar "celladd = ActiveCell.Row", assim não precisaria do replace.

Espero ter ajudado em algo.

Bora descansar.

[]s

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

 
Postado : 20/05/2013 7:10 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pela maneira de declarar as variaveis (Dim maxrng, uprng, botrng As Variant) todas assumem a caracteristica de VARIANT, assim ao obter o numeros, pelo metodo utilizado, os mesmos assumem valor de texto (string), e como tal sempre 1690 será menor do que 2.
Declare suas variaveis com as caracteristicas que devem ter --> Dim maxrng as long, uprng as long, botrng As Variant.
De preferencia a obter os numeros (valores) pelo metodo row (Conforme o colega Mauro propos), e direto e muito mais simples
Talvez assim:

Sub inputnf()
    Dim maxrng As Long, uprng As Long, botrng As Variant

    Sheets(1).Select
    uprng = 2
    maxrng = Range("C1048576").End(xlUp).Row

    Do While uprng > maxrng ' Faça enquanto 2(uprng) > 1690 (maxrng), essa inequação do jeito que está, está entrando no loop...mas essa inequação está incorreta... esperava  usar "<" pois 2<1690 é verdadeiro, logo daria sequencia no loop.
       
        botrng = Range("L" & uprng).End(xlDown).Offset(-1, 0).Row
        Range("L" & uprng).Copy
        Range("A" & uprng & ":" & "A" & botrng).PasteSpecial (xlPasteValues)
       
uprng = Range("L" & uprng).End(xlDown).Row 'aqui está o incremento, procuro o último valor achado (no caso inicial L2) vou para baixo na proxima cheia e adoto o valor daquela linha....
       
 Loop
End Sub

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

 
Postado : 21/05/2013 6:34 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Reinaldo, fantástica sua percepção.
Vc pode não ver, mas estou tirando o chapéu pra sua resposta.

FinalJustice, Se a comparação estiver sendo feita como texto, 1 é menor que 2, portanto, 189874346 também o é.

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

 
Postado : 21/05/2013 11:03 am
(@finaljustice)
Posts: 91
Trusted Member
Topic starter
 

Muito obrigado gente, vou testar. De fato ontem a noite estava cansado e até compliquei acredito que deveria ter usado "Activecell.row" vou testar as propostas!
Mais uma vez obrigado pela ajuda!
Luis

 
Postado : 21/05/2013 12:32 pm