Notifications
Clear all

Como montar a tabela da direita a partir da esquerda em VBA

13 Posts
5 Usuários
0 Reactions
2,036 Visualizações
(@ramzero)
Posts: 0
New Member
Topic starter
 

Olá pessoal

Preciso gerar a tabela da direita a partir da tabela da esquerda seguindo a seguinte lógica (como no anexo):

Seguindo linha a linha desde a 1 até a última, porém ao longo do dia vão chegando novos dados (por fonte externa) gerando novas linhas na tabela da esquerda

1 - Se C2 for + ou - -> copiar o valor de A2 em I2 se for + copiar o valor de A2 em K2 se for - e copiar o valor de B2 em J2

2 - Se C3 for + ou - e o valor de B3 for igual a J(última linha) -> ir para passo 4

3 - Se C3 for + ou - e o valor de B3 for diferente de J(última linha) -> ir para passo 5

4 - Se C3 for + somar o valor de A3 com I(última linha) ou se C3 for - somar o valor de A3 em K(última linha) -> Ir para passo 6

5 - Copiar o valor de B3 em J(próxima linha vazia) e se C3 for + copiar o valor de A3 em I(próxima linha vazia) ou se C3 for - copiar o valor de A3 em K(próxima linha vazia) -> Ir para passo 6

6 - Voltar para o passo 2 considerando a próxima linha nas colunas A, B e C (linha + 1)

Depois de tudo isso o programa precisa ficar esperando para quando chegar novos dados e continuar processando a mesma rotina

Obrigado

 
Postado : 15/02/2018 9:22 am
(@mprudencio)
Posts: 0
New Member
 

Juro que nao entendi!

 
Postado : 15/02/2018 11:20 am
(@ramzero)
Posts: 0
New Member
Topic starter
 

Olá MPrudencio

Vamos por partes

Como faço para criar a coluna J a partir da coluna B, gerando novo dado somente quando o valor for diferente do anterior lendo linha por linha de forma crescente?

No caso:

2
2
1
1
2
2
4
4
3
3
4

Ficaria

2
1
2
4
3
4

A ideia é enxugar a lista maior, juntando quando os valores são iguais

Obrigado

 
Postado : 15/02/2018 12:28 pm
(@mprudencio)
Posts: 0
New Member
 

Fiquei na mesma. Nao entendi o criterio usado.

 
Postado : 16/02/2018 5:22 pm
(@spanta)
Posts: 0
New Member
 

Baseado no seu exemplo montei a macro mais abaixo

Os valores precisam estar a partir da primeira linha do Excel e na primeira coluna

Em anexo a planilha de exemplo, basta rodar a macro para preencher a coluna C conforme o critério

'Preenche números
Public Sub subPreencheNumeros()

Dim i As Long

Dim lngLinhaColar As Long

Dim lngValorAtual As Long

'Valores Default
lngLinhaColar = 0
i = 1

'Percorre cada valor
Do While Cells(i, 1).Value <> ""

    'Se for um valor diferente então atualiza
    If Cells(i, 1).Value <> lngValorAtual Then
    
        'Obtêm próxima linha
        lngLinhaColar = lngLinhaColar + 1
        
        'Atualiza valor atual
        lngValorAtual = Cells(i, 1).Value
        
        'Cola o valor na 3° Coluna ( Coluna C )
        Cells(lngLinhaColar, 3).Value = lngValorAtual
    
    End If
    

    i = i + 1
Loop

MsgBox "Processo finalizado."

End Sub
 
Postado : 16/02/2018 7:10 pm
(@ramzero)
Posts: 0
New Member
Topic starter
 

Olá MPrudencio

Vou descrever linha a linha, minha resposta anterior pra ver se fica mais claro

------------------------- B ------------------------- J
Linha 1 --------------- 2 ------------------------- 2
Linha 2 --------------- 2 ------------------------- 1
Linha 3 --------------- 1 ------------------------- 2
Linha 4 --------------- 1 ------------------------- 4
Linha 5 --------------- 2 ------------------------- 3
Linha 6 --------------- 2 ------------------------- 4
Linha 7 --------------- 4
Linha 8 --------------- 4
Linha 9 --------------- 3
Linha 10 ---------------3
Linha 11 -------------- 4

Linha 1 - Copiar o valor de B1 em J1 e vai para linha 2
Linha 2 - O valor de B2 é igual a J1? -> sim -> Não faça nada e vai para linha 3
Linha 3 - O valor de B3 é igual a J1? -> não -> Copiar o valor de B3 em J2 e vai para linha 4
Linha 4 - O valor de B4 é igual a J2? -> sim -> Não faça nada e vai para linha 5
Linha 5 - O valor de B5 é igual a J2? -> não -> Copiar o valor de B5 em J3 e vai para linha 6
Linha 6 - O valor de B6 é igual a J3? -> sim -> Não faça nada e vai para linha 7
Linha 7 - O valor de B7 é igual a J3? -> não -> Copiar o valor de B7 em J4 e vai para linha 8
Linha 8 - O valor de B8 é igual a J4? -> sim -> Não faça nada e vai para linha 9
Linha 9 - O valor de B9 é igual a J4? -> não -> Copiar o valor de B9 em J5 e vai para linha 10
Linha 10 - O valor de B10 é igual a J5? -> sim -> Não faça nada e vai para linha 11
Linha 11 - O valor de B11 é igual a J5? -> não -> Copiar o valor de B11 em J6 e vai para linha......e assim por diante!

Obrigado

 
Postado : 16/02/2018 9:57 pm
(@ramzero)
Posts: 0
New Member
Topic starter
 

Valeu Spanta, exatamente isso :)

Vou chamar essa rotina de PASSO1

Agora para o próximo passo a condição teria que ser assim (baseado na planilha do novo exemplo que anexei no post):

Se na linha 2 da coluna C (Operação) for (soma) ou (subtração) ------> Faça o PASSO1 senão vai para o próximo C+linha

Explicação linha a linha:

Linha 2 -> C2 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 3
Linha 3 -> C3 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 4
Linha 4 -> C4 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 5
Linha 5 -> C5 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 6
Linha 6 -> C6 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 7
Linha 7 -> C7 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 8
Linha 8 -> C8 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 9
Linha 9 -> C9 é soma ou subtração? -> não -> Não faça nada e vai para linha 10
Linha 10 -> C10 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 11
Linha 11 -> C11 é soma ou subtração? -> não -> Não faça nada e vai para linha 12
Linha 12 -> C12 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha 13
Linha 13 -> C13 é soma ou subtração? -> não -> Não faça nada e vai para linha 14
Linha 14 -> C14 é soma ou subtração? -> sim -> Faça o PASSO1 e vai para linha......... e assim por diante

Obrigado galera!

 
Postado : 16/02/2018 10:12 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

RAMZERO

Excluí teu outro tópico, pois não é permitido criar mais de um tópico sobre o mesmo assunto.

Quando for responder, utilize o botão responder que fica logo abaixo da janela de resposta, não utilize o botão Citar.
Só utilize citação quando for realmente necessário.
Não polua o fórum desnecessariamente.

Leia as regras do fórum.

[]s

Patropi - Moderador

 
Postado : 18/02/2018 6:13 am
(@ramzero)
Posts: 0
New Member
Topic starter
 

Bom dia Patropi

Ok, acho que na ânsia de expressar minha necessidade, fui tentando descrevê-la de várias formas postando várias vezes e poluindo o fórum, mil perdões

Obrigado

 
Postado : 18/02/2018 9:32 am
(@klarc28)
Posts: 0
New Member
 
Option Explicit

Sub teste()

Dim i As Long
Dim DLin As Long
DLin = Plan1.Range("C2").End(xlDown).Row

For i = 2 To DLin

If Plan1.Range("C" & i).Value = "+" Or Plan1.Range("C" & i).Value = "-" Then

Call PASSO1

End If


Next i

End Sub
 
Postado : 18/02/2018 9:33 am
(@ramzero)
Posts: 0
New Member
Topic starter
 

Olá klarc28, legal, funcionou

Obrigado, mais uma vez

Vou chamar de PASSO2 pra continuar o raciocínio

Agora preciso que:

- Se o PASSO2 foi executado, verificar se o valor de C na linha atual é Soma ou Subtração
- Se for "Soma" somar o valor de A com I (tendo sempre a última linha da coluna J, como referência de linha para I)
- Se for "Subtração" somar o valor de A com K (tendo sempre a última linha da coluna J, como referência de linha para K)

*Lembrando que o PASSO1, gera ou não uma linha nova na coluna J, dependendo da comparação que faz com a coluna B

Explicação linha a linha (seguindo o exemplo em anexo):

Linha 2 -> O PASSO2 foi executado? -> sim -> PASSO1 gerou dado em J2 -> C2 é Soma ou Subtração? -> Soma -> Somar A2 com I2 e vai para linha 3
Linha 3 -> O PASSO2 foi executado? -> sim -> PASSO1 manteve dado em J2 -> C3 é Soma ou Subtração? -> Soma -> Somar A3 com I2 e vai para linha 4
Linha 4 -> O PASSO2 foi executado? -> sim -> PASSO1 gerou dado em J3 -> C4 é Soma ou Subtração? -> Soma -> Somar A4 com I3 e vai para linha 5
Linha 5 -> O PASSO2 foi executado? -> sim -> PASSO1 manteve dado em J3 -> C5 é Soma ou Subtração? -> Subtração -> Somar A5 com K3 e vai para linha 6
Linha 6 -> O PASSO2 foi executado? -> sim -> PASSO1 gerou dado em J4 -> C6 é Soma ou Subtração? -> Soma -> Somar A6 com I4 e vai para linha 7
Linha 7 -> O PASSO2 foi executado? -> sim -> PASSO1 manteve dado em J4 -> C7 é Soma ou Subtração? -> Subtração -> Somar A7 com K4 e vai para linha 8
Linha 8 -> O PASSO2 foi executado? -> sim -> PASSO1 gerou dado em J5 -> C8 é Soma ou Subtração? -> Soma -> Somar A8 com I5 e vai para linha 9
Linha 9 -> O PASSO2 foi executado? -> não -> vai para linha 10
Linha 10 -> O PASSO2 foi executado? -> sim -> PASSO1 gerou dado em J6 -> C10 é Soma ou Subtração? -> Subtração -> Somar A10 com K6 e vai para linha 11
Linha 11 -> O PASSO2 foi executado? -> não -> vai para linha 12
Linha 12 -> O PASSO2 foi executado? -> sim -> PASSO1 gerou dado em J7 -> C12 é Soma ou Subtração? -> Subtração -> Somar A12 com K7 e vai para linha 13
Linha 13 -> O PASSO2 foi executado? -> não -> vai para linha 14
Linha 14 -> O PASSO2 foi executado? -> sim -> PASSO1 gerou dado em J8 -> C14 é Soma ou Subtração? -> Soma -> Somar A14 com I8 e vai para linha......... e assim por diante

O resumo que tenho na direita é que

Linha 2 -> Enquanto Valor era 2 tive 2 Somas
Linha 3 -> Enquanto Valor era 1 tive 1 Soma e 1 Subtração
Linha 4 -> Enquanto Valor era 2 tive 3 Somas e 6 Subtrações
Linha 5 -> Enquanto Valor era 4 tive 10 Somas
Linha 6 -> Enquanto Valor era 3 tive 2 Subtrações
Linha 7 -> Enquanto Valor era 4 tive 5 Subtrações
Linha 8 -> Enquanto Valor era 2 tive 7 Somas

Creio que este seja o último passo

Agradeço à todos

 
Postado : 18/02/2018 12:56 pm
(@spanta)
Posts: 0
New Member
 

Opa RAMZERO,

Fiquei de te ajudar, mas está bastante complicado e estou com o tempo curto rs

Vou acompanhando o tópico e até final de semana ajudo a resolver o que estiver pendente

 
Postado : 19/02/2018 7:56 pm
(@ramzero)
Posts: 0
New Member
Topic starter
 

Fala Spanta

Fica tranquilo, magina, tô quebrando a cuca aqui também

Tô quase chegando no que preciso, mas ainda preciso de ajuda, brigadão cara!

Klarc28

Tudo bem?

Em sua postagem neste tópico você me passou uma rotina e no trecho abaixo entendi que ele faz uma repetição da linha 2 até a última todas as vezes que o programa passa por esse trecho, certo?

Gostaria de saber se tem como mudar isso para que esse trecho memorize a última linha processada e continue a partir dela, porque o que foi processado antes, já foi, não preciso mais que seja refeito

DLin = Plan1.Range("D2").End(xlDown).Row

For i = 2 To DLin

Obrigado

 
Postado : 20/02/2018 7:42 am