Página 1 de 1

Macro que preenche em loop dados de uma tabela

Enviado: 06 Jul 2020 às 10:12
por nathanaelacerda300
Quero preencher minha tabela 2 com os dados da tabela 1, automaticamente e em loop, conforme imagem abaixo.
Alguma dica de como fazer?
Imagem

Re: Macro que preenche em loop dados de uma tabela

Enviado: 06 Jul 2020 às 10:15
por babdallas
Anexe um exemplo, por favor. Somente com imagem fica difícil de entender. Eu não entendi, por exemplo, como determinar qual atividade por dia da semana.

Re: Macro que preenche em loop dados de uma tabela

Enviado: 06 Jul 2020 às 10:46
por nathanaelacerda300
Vou tentar ser mais claro. Na tabela 1 na coluna 2 tem os nomes de algumas disciplinas. Eu quero preencher a tabela 2 com os nomes das disciplina de forma cíclica e na ordem que está na coluna 1. Só que como na tabela 2 cada coluna só tem 6 linhas e os dados da tabela 1 tem 10 linhas, quero que os restantes dos dados da tabela 1 comecem na segunda coluna da tabela 2 e assim em diante.

Imagem

https://drive.google.com/open?id=16Uuxs ... q0DhX26zB4

Eu só preenchi a tabela 2 como exemplo, não soube como fazer automaticamente

Re: Macro que preenche em loop dados de uma tabela

Enviado: 06 Jul 2020 às 11:12
por babdallas
Fiz com fórmulas. Veja se ajuda.

Macro que preenche em loop dados de uma tabela

Enviado: 06 Jul 2020 às 11:23
por nathanaelacerda300
Deu muito certo, era o que eu queria. Se não fosse pedir muito, vc poderia explicar a fórmula?

Re: Macro que preenche em loop dados de uma tabela

Enviado: 06 Jul 2020 às 12:05
por babdallas
A formula em E2 é essa:
Código: Selecionar todos
=SE(LINS(E$2:E2)>$C$2;"";ÍNDICE(Tabela1[Disciplina];MOD($C$2*(COLS($E$2:E2)-1)+LINS(E$2:E2)-1;LINS(Tabela1[Disciplina]))+1))
Etapa 1: Verificar se o número de linhas (LINS(E$2:E2)) é maior que o número de linhas que você quer dividir (contido na célula C2). Sendo assim, a fórmula LINS retornará o número de linhas. Ex: na célula E2, LINS(E$2:E2) retornará 1. Na célula E3, LINS(E$2:E3), retornará 2, pois há duas linhas entre E2 e E3. Se este número de linhas for maior que o determinado na célula C2, então retornará vazio. Caso contrário, retornará o restante da fórmula que vou explicar abaixo.


Etapa2: Se o número de linhas for melhor ou igual ao número de linhas determinado em C2, então a seguinte fórmula será avaliada:
Código: Selecionar todos
ÍNDICE(Tabela1[Disciplina];MOD($C$2*(COLS($E$2:E2)-1)+LINS(E$2:E2)-1;LINS(Tabela1[Disciplina]))+1)
Nesta fórmula, usa-se a função ÍNDICE para retornar o valor determinado das disciplinas da Tabela1. Logo, o primeiro parâmetro da função ÍNDICE é o intervalo de disciplinas, dado por Tabela1[Disciplina].
O próximo parâmetro da função ÍNDICE é o número da linha a ser retornada da Tabela1. Para saber isso, usei o seguinte raciocínio:
Código: Selecionar todos
MOD($C$2*(COLS($E$2:E2)-1)+LINS(E$2:E2)-1;LINS(Tabela1[Disciplina]))+1
Este trecho
Código: Selecionar todos
$C$2*(COLS($E$2:E2)-1)
vai determinar o início da conta da linha. Se for a primeira coluna (coluna E), então a conta seria:

Coluna E => $C$2*(COLS($E$2:E2)-1 ==> 6*(1-1) = 0. Logo, para a primeira coluna sempre retornará o valor 0.
Coluna F => $C$2*(COLS($E$2:F2)-1 ==> 6*(2-1) = 6. Logo, para a segunda coluna sempre retornará o valor 6.
Coluna G => $C$2*(COLS($E$2:G2)-1 ==> 6*(3-1) = 12. Logo, para a segunda coluna sempre retornará o valor 12.
E assim por diante


Este outro trecho
Código: Selecionar todos
LINS(E$2:E2)-1
, para cada valor inicial determinado pela conta anterior, adicionar valor a cada linha. Ex:
Linha 2 ==> LINS(E$2:E2)-1 ==> 1-1 = 0. Logo a primeira linha retorna 0.
Linha 3 ==> LINS(E$2:E3)-1 ==> 2-1 = 1. Logo a segunda linha retorna 1.
Linha 10 ==> LINS(E$2:E10)-1 ==> 9-1 = 8. Logo a segunda linha retorna 8.

Sendo assim, este trecho da fórmula
Código: Selecionar todos
$C$2*(COLS($E$2:E2)-1)+LINS(E$2:E2)-1
retorna o seguinte:
Coluna E, linha 2 ==> 0+ 0 = 0.
Coluna E, linha 7 ==> 0+ 5 = 5.
Coluna E, linha 15 ==> 0+ 13 = 13

Coluna F, linha 2 ==> 6+ 0 = 6.
Coluna F, linha 7 ==> 6+ 5 = 11.
Coluna F, linha 15 ==> 6+ 13 = 19.

Coluna G, linha 2 ==> 12+ 0 = 12.
Coluna G, linha 7 ==> 12+ 5= 17.
Coluna G, linha 15 ==> 12+ 13 = 25.

E assim por diante.


Agora, o que fiz foi determinar o resto da divisão entre esta conta feita anteriormente pelo número total de linhas da Tabela1. Desta fora, saberei qual o índice da linha que tenho que retornar da Tabela 1. Para isso, usei a função MOD
Código: Selecionar todos
MOD($C$2*(COLS($E$2:E2)-1)+LINS(E$2:E2)-1;LINS(Tabela1[Disciplina]))+1
O número de linhas da Tabela1 (ou seja, o número de disciplinas) foi determinado por
Código: Selecionar todos
LINS(Tabela1[Disciplina])
Veja abaixo o resultado para alguns exemplos:

Coluna E, linha 2 ==> MOD(0;10)+1= 0+1 = 1
Coluna E, linha 7 ==> MOD(5;10)+1 = 5+1 = 6
Coluna E, linha 15 ==> MOD(13;10)+1 = 3+1 = 4

Coluna F, linha 2 ==> MOD(6;10)+1 = 6+1 = 7
Coluna F, linha 7 ==> MOD(11;10)+1 = 1+1 = 2
Coluna F, linha 15 ==> MOD(19;10)+1 = 9+1 = 10

Coluna G, linha 2 ==> MOD(12;10)+1 = 2+1 = 3
Coluna G, linha 7 ==> MOD(17;10)+1 = 7+1 = 8
Coluna G, linha 15 ==> MOD(25;10)+1 = 5+1 = 6

Não sei se ficou claro, mas o raciocínio foi esse. É difícil explicar escrevendo.