Inserir numeração e...
 
Notifications
Clear all

Inserir numeração e copiar e colar fórmula matricial

8 Posts
2 Usuários
0 Reactions
1,663 Visualizações
(@wagner-aft)
Posts: 28
Eminent Member
Topic starter
 

Pessoal,

Já tentei buscar tópicos que me ajudassem ou mesmo construir a solução, porém não consegui. Gostaria de contar com a ajuda de vocês para criar uma macro que fizesse o seguinte:

1) Na célula C4 tenho o resultado de uma fórmula CONT.SE. Pode ser qualquer número de 0 a 7000. Se for 0 a macro não deve fazer nada.
2) Se a célula C4 tiver qualquer número diferente de 0 a macro deve a partir da célula A8 numerar as células seguintes até o número limite encontrado na célula C4. Exemplo1: C4 igual a 50. A célula A8=1; A9=2; A10=3...até A57=50. Exemplo 2: C4 igual a 1000. A célula A8=1; A2=2...A1007=1000.
3) Após numerar as células A8 e seguintes a macro deve copiar a fórmula matricial abaixo nas células B8 até a última da coluna A preenchida, conforme item anterior. Se facilitar posso deixar a fórmula matricial escondida na célula B6 por exemplo e a macro apenas a copia e cola nas células B8 até o final (conforme a última célula da coluna A preenchida).

Deu pra entender?

Agradeço muito se alguem puder me ajudar.

Abraço

Fórmula matricial:
{=SE(E(C$1<>"";C$3="");SEERRO(ÍNDICE(RI!$A$2:$C$307634;MENOR(SE(RI!$A$2:$C$307634=$C$1;LIN(RI!$A$2:$C$307634)-1);LIN(A1));3);"");SE(E(C$1<>"";C$3<>"");SEERRO(ÍNDICE(INDIRETO("RI!$A$"&CORRESP($C$3;RI!I:I;0)&":$C$307634");MENOR(SE(INDIRETO("RI!$A$"&CORRESP($C$3;RI!I:I;0)&":$C$307634")=$C$1;LIN(INDIRETO("RI!$A$"&CORRESP($C$3;RI!I:I;0)&":$C$307634"))-(CORRESP(C$3;RI!I:I;0)-1));LIN(A1));3);"");SE(E(C$2<>"";C$3="");SEERRO(ÍNDICE(RI!$B$2:$C$307634;MENOR(SE(RI!$B$2:$C$307634=$C$2;LIN(RI!$B$2:$C$307634)-1);LIN(A1));2);"");SE(E(C$2<>"";C$3<>"");SEERRO(ÍNDICE(INDIRETO("RI!$B$"&CORRESP($C$3;RI!I:I;0)&":$C$307634");MENOR(SE(INDIRETO("RI!$B$"&CORRESP($C$3;RI!I:I;0)&":$C$307634")=$C$2;LIN(INDIRETO("RI!$B$"&CORRESP($C$3;RI!I:I;0)&":$C$307634"))-(CORRESP(C$3;RI!I:I;0)-1));LIN(A1));2);"");""))))}

 
Postado : 31/01/2017 8:09 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa noite wagner.aft,

Em anexo coloquei um código que realiza as ações 1) e 2) que você deseja. (está no módulo 1)

Sobre colocar a fórmula, não vou conseguir testar sem sua planilha mas montei como seria a rotina de repetição e você pode gravar uma macro colando essa fórmula na célula B8 e depois copiar o código gerado da fórmula e colocar no lugar da "=SUM(RC[-1])" que coloquei como exemplo.

Teste e de retorno.

att,

 
Postado : 31/01/2017 10:16 pm
(@wagner-aft)
Posts: 28
Eminent Member
Topic starter
 

Bruno,

Valeu demais! Tá quase tudo certo!
Só não funcionou 100% porque não consegui incluir a minha fórmula no campo que você destinou. Também tentei gravar a macro inserindo a fórmula e depois pegar o código da fórmula na macro e inserir no campo que você deixou mas também não deu certo. A própria macro que gravei o conteúdo dela dá erro de sintaxe. Acho que é porque ou a fórmula é muito grande ou por causa das aspas que existem dentro da fórmula...a minha macro resultou no seguinte código pra fórmula:

Range(Cells(k, 2), Cells(k, 2)).Formula = _
"=IF(AND(R1C[1]<>"""",R3C[1]=""""),IFERROR(INDEX(RI!R2C1:R307634C3,SMALL(IF(RI!R2C1:R307634C3=R1C3,ROW(RI!R2C1:R307634C3)-1),ROW(R[-7]C[-1])),3),""""),IF(AND(R1C[1]<>"""",R3C[1]<>""""),IFERROR(INDEX(INDIRECT(""RI!$A$""&MATCH(R3C3,RI!C[7],0)&"":$C$307634""),SMALL(IF(INDIRECT(""RI!$A$""&MATCH(R3C3,RI!C[7],0)&"":$C$307634"")=R1C3,ROW(INDIRECT(""RI!$A$""&MATCH(R3C3,RI!C["& _
":$C$307634""))-(MATCH(R3C[1],RI!C[7],0)-1)),ROW(R[-7]C[-1])),3),""""),IF(AND(R2C[1]<>"""",R3C[1]=""""),IFERROR(INDEX(RI!R2C2:R307634C3,SMALL(IF(RI!R2C2:R307634C3=R2C3,ROW(RI!R2C2:R307634C3)-1),ROW(R[-7]C[-1])),2),""""),IF(AND(R2C[1]<>"""",R3C[1]<>""""),IFERROR(INDEX(INDIRECT(""RI!$B$""&MATCH(R3C3,RI!C[7],0)&"":$C$307634""),SMALL(IF(INDIRECT(""RI!$B$""&MATCH(R3C3,RI!"& _
"":$C$307634"")=R2C3,ROW(INDIRECT(""RI!$B$""&MATCH(R3C3,RI!C[7],0)&"":$C$307634""))-(MATCH(R3C[1],RI!C[7],0)-1)),ROW(R[-7]C[-1])),2),""""),""""))))"

Enfim, pensei no seguinte: manter a fórmula original na célula B6 e copiar ela da B6 para a B8 e dar seguimento arrastando a fórmula para as seguintes.

Tem como você ajustar o código pra isso? Tentei fazer esse ajuste mas não consegui.

 
Postado : 01/02/2017 10:13 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Wagner,

Tentei testar aqui a formula que você colocou e só deu erro, não sei o que pode estar faltando. Você pode deixar a formula pronta na B8 e depois que rodar a macro só clicar duas vezes no quadrado que aparece quando a célula é selecionada que vai ser preenchido tudo (acho que as referências absolutas de sua formula não irão atrapalhar). Sei que isso não seria o ideal.

Uma questão que me surgiu agora, não seria talvez mais conveniente também já programar os valores buscados por essa formula? Porque ela é bem grande e dependo do caso (muitos dados) pode deixar lenta a planilha.

att,

 
Postado : 01/02/2017 9:34 pm
(@wagner-aft)
Posts: 28
Eminent Member
Topic starter
 

Bruno,

Não entendi o que você disse sobre "programar os valores buscados por essa formula". O que é? Pra que serve? Como fazer?

 
Postado : 03/02/2017 10:54 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Bruno,

Não entendi o que você disse sobre "programar os valores buscados por essa formula". O que é? Pra que serve? Como fazer?

Não sei o que sua fórmula faz, mas acredito que ela busque uma informação em alguma tabela de dados. Ao invés de usar essa fórmula você pode programar um trecho de código para já jogar a informação que busca na célula, sem precisar ficar colocando na célula essa fórmula.

Como fazer? Só consigo dizer isso sabendo para o que você usa essa fórmula e a estrutura de sua planilha.

Não tenho certeza se colocar um código no lugar dessa fórmula seria melhor para o seu trabalho.

att,

 
Postado : 03/02/2017 11:25 am
(@wagner-aft)
Posts: 28
Eminent Member
Topic starter
 

Esse código faz basicamente o seguinte:
Ele verifica o valor que está na célula C1 (em geral um numero de CNPJ) e busca na planilha RI o relatório correspondente a esse CNPJ. Uma espécie de PROCV. Optei por utilizar a matricial pois o CNPJ pode aparecer na planilha RI centenas de vezes e eu preciso retornar todos os relatórios correspondentes a esse CNPJ. A planilha RI contem cerca de 300mil relatórios vinculados a milhares de CNPJs.

Veja se a sua sugestão pode melhorar.

Por outro lado, estou precisando de um código que faça o seguinte:
- Após pesquisados os numeros de relatório de cada CNPJ, eu criei uma coluna em que marco com um X para selecionar o relatório para o qual eu buscaria as informações detalhadas;
- Porém somente um relatório pode ser selecionado por vez;
- A coluna de seleção é a "B" e começa a seleção na B8 e pode ir até a B10000;
- Coloquei a fórmula CONT.VALORES na linha B6 para me dizer quantos seleções forem feitas. Se passar de 1 gostaria que automaticamente fosse emitido uma mensagem de alerta ("SELECIONE APENAS UM RELATÓRIO PARA EXIBIÇÃO") e executasse uma macro que apagasse todas as células preenchidas no intervalo B8:B10000.
- Tentei de todo jeito aqui mas não consegui fazer a macro de apagar rodar. Até consegui exibir a mensagem de alerta, mas a macro de apagar não.

 
Postado : 03/02/2017 12:37 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Wagner,

Anexa uma planilha de exemplo (não precisa ser com os dados reais, mas tem que ter a mesma estrutura), ver como está sua planilha será melhor para pensar.

Uma possibilidade de deixar os valores das células vazios é usar o código:

Range("B8:B10000").Value = Empty

att,

 
Postado : 03/02/2017 4:40 pm