Prezados, boa tarde!
Desculpe por ainda não ter dado feedback.
Não precisarei mas de automatizar as macros, consegui resolver meu problema apenas por fórmulas matriciais, o que acelerou incrivelmente o processamento dos dados.
Vou descrever qual era meu objetivo e como cheguei a solução, talves ajude outras pessoas.
As macros automatizadas seriam para uma planilha de mensalidades pagas onde em uma das abas tenho um modelo de declaração para IR.
Para montar esta declaração são necessários 3 preenchimentos: 1º é o CPF, colocando este dado a planilha busca todos os cursos que a pessoa já fez e cria uma lista para selecionar o curso, que é o 2º campo a se selecionar. O 3º campo é o ano de referência que a pessoa quer.
Após inserir estes 3 dados a planilha gera automaticamente uma declaração para IR com todos valores que a pessoa pagou naquele determinado ano.
Quando o 1º problema surgiu: Após colocar o CPF eu precisava selecionar o curso, inicialmente usei o PROCV porem ele busca apenas a primeira correspondência, ai eu tive que colocar chave (CPF+numero sequencial) em todas as linhas da planilha de dados para buscar todas as referências para o CPF. Resolvi este problema colocando a seguinte função matricial em apenas 100 linas (acredito que não aconteça de alguem pagar 100 parcelas ):
{=SE(LINS($1:1)>CONT.SE(Cursos_teste;$P$3);"";ÍNDICE(Cursos_teste2;MENOR(SE(Cursos_teste=$P$3;LIN(Cursos_teste)-LIN(P$5)+1;FALSO);LINS($1:1))))}
Com ela em vez de ter chave em todas as linhas, agora ela busca apenas as correspondências para o CPF, se tem 10 ele busca as 10, se tem 20 ele busca as 20.
Quando o 2º problema surgiu: Após o procedimento anterior eu precisei criar uma Lista com o resultado, porem deveria ser apenas os valores únicos. Ai veio as duas macros do tópico, copiava, colava ao lado, copiava, colava por cima, tirava os duplicados e ordenava.... Resolvi isso usando outra fórmula matricial:
{=SEERRO(ÍNDICE($AE$1:$AE$100; MENOR(SE(CORRESP(SE($AE$1:$AE$100="";"";$AE$1:$AE$100); SE($AE$1:$AE$100="";"";$AE$1:$AE$100);0)= LIN(INDIRETO("1:"&LINS($AE$1:$AE$100))); CORRESP(SE($AE$1:$AE$100="";"";$AE$1:$AE$100); SE($AE$1:$AE$100="";"";$AE$1:$AE$100);0);""); LIN(INDIRETO("1:"&LINS($AE$1:$AE$100)))));"")}
Com essa fórmula vem apenas os valores únicos.
Quando o 3º problema surgiu: Quando precisei formar uma lista para seleção do curso. Não queria valores em branco na lista, e como uma pessoa poderia ter mais de um curso coloquei estes dois códigos no Gerenciador de nomes para criar a lista com valores únicos:
Lista_cursos_IRRF
=DESLOC(Relatório_IRRF!$AF$1;0;0;CONT.VALORES(Relatório_IRRF!$AF:$AF);1)
Lista_cursos_IRRF2
=DESLOC(Relatório_IRRF!$AF$1;0;0;CONT.VALORES(Relatório_IRRF!$AF:$AF)-CONT.SE(Lista_cursos_IRRF;"");1)
Agora se o CPF tem apenas 1 curso, aparece apenas uma opção na lista, se ela tem 20, aparecem 20 opções!
O processamento da planilha está fantástico, coloco o CPF e quase que instantaneamente já aparece a lista dos cursos. Antes era um Deus nos acuda!
Agora vou tentar agregar esta nova "tecnologia" para minhas outras planilhas....
Bom é isso! Obrigados a todos que me ajudaram de alguma forma!
Postado : 27/04/2012 11:09 am