Notifications
Clear all

Loop para Parcelas e Datas

9 Posts
2 Usuários
0 Reactions
1,616 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa Noite,

Galera, por favor vejam se podem me ajudar!

Gostaria de incluir um botão em uma sheet e ela fizesse um loop na outra sheet colocando tanto de parcelas e acrescentando um mês a cada linha também.

Montei um exemplo (anexo), porém não sei por onde começar a fazer o loop.

Será que alguém pode me ajudar ?

 
Postado : 21/10/2014 9:17 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 


Ajala, segue exemplo de código, na exata disposição dos dados do seu anexo.

Clique com o bitão direito sobre o nome da guia/ Exibir código

Cole a rotina abaixo.

Faça testes e verifique se o resultado é o esperado.

Sub Expandir()

Set wss = Sheets("Plan1")

d = wss.Cells(3, 3) ' data 1ª parcela
i = 1 ' nº 1ª parcela
n = wss.Cells(4, 3) 'total de parcelas
v = wss.Cells(5, 3) / n 'valor parcela

lin = 5

Do While i <= n
Cells(lin, 2) = d
Cells(lin, 3) = i
Cells(lin, 4) = "de"
Cells(lin, 5) = n
Cells(lin, 6) = v

d = d + 30
i = i + 1
lin = lin + 1

Loop

End Sub

 
Postado : 22/10/2014 10:25 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa noite Edson

A tua macro funcionou perfeitamente, apenas percebi que deverá alterar o lin = 5 para lin = 6 para evitar que o Valor Total seja sobreposto pela primeira parcela.

Me desculpe a intromissão, mas é que eu gostei da macro e ao testar percebi este problema.

Um abraço.

 
Postado : 22/10/2014 5:42 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Edson, muito obrigado.

Funcionou sim, mas acho que não dei todas as coordenadas. Essas informações vão alimentar um banco, sendo assim preciso que os proximo vão abaixo do ultimo.

Mas como fixamos o "lin" em 2 ele sempre sobrepõe os dados já preenchidos, tentei fazer ele contar ir adicionando abaixo mas não deu.

Da uma olhada.

 
Postado : 22/10/2014 9:37 pm
(@rlm)
Posts: 0
New Member
 

Experimente

Sub Expandir()

Dim WSSaida As Worksheet, wSS As Worksheet
Dim FinalRow As Long, Lin As Long
Dim d As Date, i As Integer, n As Integer, v As Currency
Set wSS = Worksheets("Resumo")
Set WSSaida = Worksheets("BD_SAIDAS")

d = wSS.Cells(11, 3) ' data 1ª parcela
i = 1 ' nº 1ª parcela
n = wSS.Cells(14, 5) 'total de parcelas
v = wSS.Cells(13, 3) / n 'valor parcela

WSSaida.Activate
FinalRow = WSSaida.Cells(Application.Rows.Count, 16).End(xlUp).Row

'WSSaida.Cells(FinalRow, 16).Select

Lin = Range("P1048576").End(xlUp).Row + 1

Do While i <= n
    Cells(Lin, 16) = d
    Cells(Lin, 20) = i
    Cells(Lin, 21) = "de"
    Cells(Lin, 22) = n
    Cells(Lin, 18) = v

d = DateAdd("m", 1, d) 'd + 30
i = i + 1
Lin = Lin + 1
Loop

End Sub
 
Postado : 22/10/2014 10:07 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Reinaldo bom dia,

O vba entra em loop "infinito", acredito que seja porque estamos adicionando +1:

Lin = Range("P1048576").End(xlUp).Row + 1

Quando fixamos essa variável em uma célula ele faz todo o processo e para depois quando esta desta forma ele fica continuo.

:?

 
Postado : 23/10/2014 3:46 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Testando seu modelo, funcionou perfeitamente com a rotina que o Reinaldo adaptou, a única alteração que fiz foi trocar :
P1048576 por P65536 devido ao meu excel ser 2003.

Uma obs, provavelmente devido ao ctrl+c e ctrl+v na rotina estas linhas fazem a mesma ação, só alterando o +1 que é necessário para pegar a última celula vazia, sem ela estará subscrevendo o último registro anterior com o primeiro.

FinalRow = WSSaida.Cells(Application.Rows.Count, 16).End(xlUp).Row
Lin = Range("P65536").End(xlUp).Row + 1

Troque :
FinalRow = WSSaida.Cells(Application.Rows.Count, 16).End(xlUp).Row por :
Lin = WSSaida.Cells(Application.Rows.Count, 16).End(xlUp).Row + 1
e apague a "Lin = Range("P65536").End(xlUp).Row + 1"
Ficando assim :

    Sub Expandir()

    Dim WSSaida As Worksheet, wSS As Worksheet
    'Dim FinalRow As Long
    Dim Lin As Long
    Dim d As Date, i As Integer, n As Integer, v As Currency
    Set wSS = Worksheets("Resumo")
    Set WSSaida = Worksheets("BD_SAIDAS")

    d = wSS.Cells(11, 3) ' data 1ª parcela
    i = 1 ' nº 1ª parcela
    n = wSS.Cells(14, 5) 'total de parcelas
    v = wSS.Cells(13, 3) / n 'valor parcela

    WSSaida.Activate
    Lin = WSSaida.Cells(Application.Rows.Count, 16).End(xlUp).Row + 1

    Do While i <= n
            Cells(Lin, 16) = d
            Cells(Lin, 20) = i
            Cells(Lin, 21) = "de"
            Cells(Lin, 22) = n
            Cells(Lin, 18) = v
    
        d = DateAdd("m", 1, d) 'd + 30
        i = i + 1
        Lin = Lin + 1
    Loop

    End Sub

Mas não entendi o que quer dizer com :

Quando fixamos essa variável em uma célula ele faz todo o processo e para depois quando esta desta forma ele fica continuo

[]s

 
Postado : 23/10/2014 6:33 am
(@rlm)
Posts: 0
New Member
 

Ajala, o loop é determinado pela linha --> Do while i<n, a variável Lin é utilizada apenas para não sobrescrever os registros existentes; conforme sua demanda.

Se "entra em loop infinito" (no modelo que enviou e testei, assim como o Mauro Coutinho funcionou normalmente), certifique-se do valor de "n" esteja corretamente definido.

 
Postado : 23/10/2014 7:00 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Muito obrigado pessoal, o "cabaço" aqui estava fazendo somente testes e não apliquei em um botão e fiz merda.

Esta funcionando perfeitamente.

Obrigado mesmo.

 
Postado : 23/10/2014 7:40 am