Notifications
Clear all

Intervalo Dinâmico usando DESLOC()

38 Posts
5 Usuários
0 Reactions
26.5 K Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Range Dinâmico

ao definir um nome (usando Ctrl+F3) ao invés de selecionar o range (que ficaria fixo) use as funções Desloc() e Cont.Valores(), combinadas...

eu escrevi coisas diferentes nas células B2 a B5 de uma planilha...

teclei Ctrl+F3 (ou Inserir > Nome > Definir) e defini um nome qualquer para o intervalo que vou criar

no campo refere-se a, eu escrevi a fórmula abaixo:

=DESLOC(Plan1!$B$2;0;0;CONT.VALORES(Plan1!$B:$B);1)

Detalhe 01: NADA MAIS PODERÁ ESTAR EM NENHUMA CÉLULA DA COLUNA B, pois se tiver algo ali, o cont.valores da coluna B não funcionará e pegará linhas a mais do range flexível, ou range variável, ou Range Dinâmico (como prefiro chamar)

Detalhe 02: o início da lista do range dinamico é sempre o primeiro item da lista, e não o seu cabeçalho, ok?

Detalhe 03: uma vez q um nome definido no excel passa a ter uma fórmula (com ou sem funções, não importa) este nome não mais aparecerá na lista do Ctrl+Y (ir para) nem ao lado da barra de fórmulas... para ver o resultado do range dinamico, deve-se voltar à definição de nomes e clicar no campo refere-se à, daí o range vai BRILHAR na planilha . . .

Detalhe 4: naum pode haver nada em cima da lista tb, exceto se for um título, mas neste caso, ver detalhe 5...

Detalhe 5: se vc tiver um titulo na sua lista nas células do excel, precisa usar um -1, pra não contá-lo no range dinamico

neste caso ficaria assim

=DESLOC(Plan1!$B$2;0;0;CONT.VALORES(Plan1!$B:$B)-1;1)

NOTA/EXTRA:
essa função, se bem utilizada, pode variar em linhas (como explicado acima) e/ou em colunas... fica aí um exercício pra quem quiser brincar de nomear áreas cujo tamanho mude...

----------------------------------
é possível usar um Nome Definido no Excel (seja dinâmico ou não) em qualquer função do excel, inclusive qdo as utilizamos matricialmente:

exemplos:
=SOMA(VENDAS)

=PROCV(vendedor;TabelaVendedores;ColunaSalario;0)

=soma((Produtos="Leite")*(TabelaVendedores=Vendedor)*(ValoresVenda>Limite)*ValoresVenda)
terminando com Ctrl+Shift+Enter

claro q pra esta ultima é necessário ter um conhecimento mais profundo de Excel no que diz respeito a condicionais, mas é praticamente uma SOMASE() com 3 critérios do tipo E...
e se usarmos o q eu chamo de Range Dinâmico, podemos fazer miséria com as fórmulas e funções...

Vantagem: Qualquer pessoa que ler a fórmula, terá mais facilidade em entendê-la, pois não é endereços e sim textos facilmente compreensíveis....

as dicas dadas acima, utilizam fórmulas em portugues...

Traduzindo as funções:

    DESLOC é OFFSET
    SOMA é SUM
    PROCV é VLOOKUP
    SOMASE() é SUMIF()[/list:u:2i93tdim]

    Exemplo 1:
    Se alguém quiser exemplo de rng dinamico com procv

    crie um range dinamico chamado tabela, e na fórmula, use:
    =desloc(Plan1!A1;1;0;cont.valores(Plan1!A:A);5)

    Este Range Dinâmico é uma tabela que compreende um número variável de linhas, por um número fixo de colunas da planilha Plan1, ou seja,

    Preencha A1 até E1 com títulos de coluna
    Preencha A2 até E20 com valores de acordo com o cabeçalho

    noutra plan, pode ser a plan2
    Coloque na célula A2 a seguinte fórmula:
    =procv(a1;tabela;5;0)

    assim, td q vc escrever na célula A1, aparecerá o valor correspondente na célula A2...

    Exemplo 2:
    Foi definido um nome (use Ctrl+F3 para conferir). Este nome definido é o TblProduto e foi definido com a seguinte fórmula:
    =DESLOC(Plan1!$L$1;1;0;CONT.VALORES(Plan1!$L:$L)-1;3)

    Isso significa que a função DESLOC() pega como referência uma célula cujo endereço é L1, e a partir da célula DEBAIXO dela, iniciou um intervalo dinâmico de células.

    Enfim... Isso significa que ao adicionar itens na tabela de produtos, o intervalo dinâmico já as incluirá, não sendo mais necessário alterar o conteúdo do nome definido, pois este é dinâmico.

    Utilizei na tabela exemplo ao lado alguns PROCV() com testes de erro ( ÉERROS() ), e utilizei o range dinâmico TblProdutos no meio da função:
    =PROCV($A2;Tblprodutos;2;0)

    Vantagens:
    1) LER a fórmula e entendê-la;
    2) Para efeito de manutenção, não será mais necessário alterar o "alcance" do PROCV();

    Desvantagens:
    1) Ainda não enxerguei desvantagem... alguém se habilita?

    O arquivo está anexado nesta postagem.

    Quem tiver dúvidas, é só perguntar... temos verdadeiros mestres em Range Dinâmico por aqui! :geek:

    ANEXOS BONS:

     
Postado : 10/07/2009 3:23 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Mauro em que tabela e em que coluna ???

Marcelo, eu só citei aquele tópico para ter uma noção mas esqueci que aquele modelo eu ainda não havia definido os ranges dinânicos, então estou anexando novamente eliminando as colunas desnecessárias para esta questão.

Veja q Range Dinamico de nome "rgTtAcd" foi criado com a formula =DESLOC(Resumo!$B$3;;0;CONT.VALORES(Resumo!$B:$B)-1)
Na aba Resumo tenho a formula na Coluna B - "Data" que busca a data na aba BD.
Então como o Range Dinamico está pegando até a última celula da Coluna Data da aba Resumo e as duas ultimas celulas o resultado da formula "=SE(BD!A10="";"";BD!A10)" é Vazia a formula dá erro.
Poderia contornar isto alterando o resultado da formula para "=SE(BD!A10="";0;BD!A10)"
Mas a intensão é saber se tem como ajustar o Range Dinamico e desconsiderar os resultados Vazios
Tentei utilizar junto com as funções Indice, Indireto e não obtive sucesso, pesquisei na net sobre a função Cont.Ses mas não encontrei nada referente a utilizar criterios Mes - Ano.
Tentei tambem a dica do Fernando mas não consegui.

Range Dinamico - Desloc ignorando resultados vazios

[]s

 
Postado : 23/11/2015 8:46 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

O cont.Valores() conta tudo, inclusive fórmulas que resultem em nada.
Vc precisa adaptar a contagem.
Cria nas células combinações com contvalores e contse para chegar no número certo
Daí vc usa essa fórmula lá no rng dinâmico...

 
Postado : 23/11/2015 9:02 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Fernando, infelizmente a minha ignorância na utilização de formulas até o momento não me permitiu chegar a uma solução, alem das varias tentativas e pesquisas na net ainda procuro por uma solução, até tentei com a função Cont.SES, mas só consegui se definir uma data inteira e não por Mes e Ano que deveria ser assim :

baseando neste modelo que enviei,
=CONT.SES(Resumo!B3:B10;"="&MÊS(A4);Resumo!B3:B10;"="&ANO(B2);Resumo!F3:F10;B3)

ou com o range nomeado:
=CONT.SES(rgTtAcd;"="&MÊS(A4);rgTtAcd;"="&ANO(B2);rgGravidade;B3)

Então devolta a mesa de trabalho e continuar nas pesquisas, de qualquer forma grato pelas dicas.

[]s

 
Postado : 24/11/2015 11:46 am
(@mprudencio)
Posts: 0
New Member
 

Com relação ao Range tenta essa

=DESLOC(Resumo!$B$3;0;0;CONT.VALORES(Resumo!$B:$B)-3;1)

Tentei com cont.se no lugar de cont.valores mas nao deu certo.

Tentei com cont.se assim

=DESLOC(Resumo!$B$3;0;0;CONT.SE(Resumo!$B:$B"<>""");1)

 
Postado : 24/11/2015 8:30 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Marcelo, assim tambem não da certo, eu já havia tentado esta e muitas outras, até encontrei uma que funcionou mas parcialmente, pois tinha de informar o range, tipo "Resumo!$B:$B" "Resumo!$B:$B20", só que se os dados fossem até B25 só considerava até B20.
Como eu disse nos post anteriores, se eu trocar o resultado para "zero" em vez de vazio tenho a soma correta sem os erros, e foi o que fiz para eles poderem utilizar, mas vou continuar pesquisando porque quero entender e saber se temos uma forma de contornar isto, pena que perdi parte dos meus bkps pois tenho certeza que tinha um modelo que tratava do mesmo assunto.
Vou postar em outros foruns tambem e assim que tiver uma solução aviso.

[]s

 
Postado : 25/11/2015 8:17 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

O colega Mandrix (já faz tempo que não retorna ao fórum) contornava essa situação da seguinte forma
=1048575-CONTAR.VAZIO($B:$B)

 
Postado : 25/11/2015 9:06 am
(@mprudencio)
Posts: 0
New Member
 

Reinaldo assim =DESLOC(Resumo!$B$3;0;0;CONT.VALORES(Resumo!$B:$B)-CONTAR.VAZIO(Resumo!$B:$B);1) nao funcionou...

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

O colega Mandrix (já faz tempo que não retorna ao fórum) contornava essa situação da seguinte forma
=1048575-CONTAR.VAZIO($B:$B)

Grande Mandrix, acho até que o exemplo que citei que tinha em meus bkps devia ser dele, outro fera que aguardo uma dica é o Bernardo, depois que se enfiou no VBA não ve mais formulas, rsrsrsrs.

Mas voltando ao assunto, matou a pau, funcionou perfeitamente no modelo anexo, agora vou jogar pro arquivo original e ver se corra tudo bem, que la tem +- 4000 registros, vou pesquisar para ver se encontro explicação plausível para "=1048575-CONTAR.VAZIO($B:$B)".

Então os Ranges nomeados ficaram :
rgTtAcd .. =DESLOC(Resumo!$B$3;;0;1048575-CONTAR.VAZIO(Resumo!$B:$B);1)
rgGravidade .. =DESLOC(Resumo!$F$3;;0;1048575-CONTAR.VAZIO(Resumo!$F:$F);1)

Agora é só ajustar os demais ranges.

Valeu Reinaldo, grato pela ajuda

Segue o modelo ajustado:
Range Dinamico Ignorando Formulas

Acho que vou colocar tambem em bibliotecas, pelo fato de ter realizado tantas pesquisas e ter sido tão dificil encontrar algo a respeito.

[]s

 
Postado : 25/11/2015 10:16 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

A explicação +plausivel que encontrei: Contar.Vazio considera o valor da celula, inclusive as com formulas; então o "" da formula e contado como vazio.
Mais o numero de linhas de sua range; no caso a coluna inteira com 1.045.... linhas, se fosse xls seriam 65.... ou ainda numero de linhas da range utilizada, como disse a planilha tem +/- 4000, então poderia
utilizar algo como 5000-Contar.Vazio(Resumo$B$2:$B$5000)

 
Postado : 25/11/2015 10:56 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

A explicação +plausivel que encontrei: Contar.Vazio considera o valor da celula, inclusive as com formulas; então o "" da formula e contado como vazio.
Mais o numero de linhas de sua range; no caso a coluna inteira com 1.045.... linhas, se fosse xls seriam 65.... ou ainda numero de linhas da range utilizada, como disse a planilha tem +/- 4000, então poderia
utilizar algo como 5000-Contar.Vazio(Resumo$B$2:$B$5000)

Era mais ou menos isto que eu havia imaginado, mas iria pesquisar de qualquer forma para ter certeza, e quanto a "utilizar algo como 5000-Contar.Vazio(Resumo$B$2:$B$5000)", cheguei a encontrar isto na net e cheguei a fazer desta forma "=DESLOC(Resumo!$B$3;;0;-CONTAR.VAZIO(Resumo!$B3:$B12);1)", que no modelo anexo, e não funcionou.

[]s

 
Postado : 25/11/2015 11:08 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Nessa situação tem sempre lque fazer a diferença.=DESLOC(Resumo!$B$3;;0;CONTAR.VAZIO(Resumo!$B3:$B12);1)
CONTAR.VAZIO(Resumo!$B3:$B12) irá retornar 2, então deve fazer a diferença 10 - CONTAR.VAZIO(Resumo!$B3:$B12), onde 10 é o numero de linhas existente no intervalo "contado"

 
Postado : 25/11/2015 11:14 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Nessa situação tem sempre lque fazer a diferença.=DESLOC(Resumo!$B$3;;0;CONTAR.VAZIO(Resumo!$B3:$B12);1)
CONTAR.VAZIO(Resumo!$B3:$B12) irá retornar 2, então deve fazer a diferença 10 - CONTAR.VAZIO(Resumo!$B3:$B12), onde 10 é o numero de linhas existente no intervalo "contado"

Bem interessante isto, eu realmente não sabia, então resolvi alterar da seguinte forma para entender melhor.
Aumentei o range com as formulas até a linha 20 e redefini o intervalo nomeado para :

rgTtAcd .. "=DESLOC(Resumo!$B$3;;0;18-CONTAR.VAZIO(Resumo!$B3:$B20);1)", e deu certinho.

Então, pelo que entendi, nesta situação devemos sempre pegar a ultima linha definida e diminuir "2", no caso acima "18-CONTAR.VAZIO(Resumo!$B3:$B20)" : "20 - 2=18", se fosse linha "50" "48-CONTAR.VAZIO(Resumo!$B3:$B50)" seri "50 - 2 = 48"

Mai um aprendizado, quem sabe volta a lidar um pouco mais com formula.

abarços

 
Postado : 25/11/2015 11:30 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

É tanto fera por aqui que ja to ficando com vergonha de dizer que sei alguma coisa em excel.

Sai cada coelho da cartola por aqui que chega ser assutador.

Otima solução.

kkkkkkk, você não viu nada, não sou muito de formulas e funções mas as vezes dou meus patacos, mas se pesquisar pelos posts do Mandrix, Bernardo, Leornardo e outros, ai sim vai ter um infarto com as formulas mirabolantes que eles sugerem.

Bem vindo a realidade do Excel

[]s

 
Postado : 25/11/2015 12:01 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Eu sou a favor de:
Usar dentro da sua fórmula, ao invés de colocar "" como resultado, colocar algum caractare, por exemplo: "-".
Depois vc faria o cont.valores()-cont.se()
Outra coisa que eu sempre preto atenção, é usar sempre uma mesma coluna para determinar o tamanho dos diferentes ranges dinamicos. Pq daí vc garante que todos tem a mesma altura.

 
Postado : 30/11/2015 8:06 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

PARA TUDOOOOOOOO

Quanto a esta última dúvida, eu analisei melhor o arquivo. Alguém me explica pq que tem a plan BD e a plan Resumo, que tem o mesmo número de linhas e as mesmas informações?
Aquilo Pq as colunas de Resumo não são aplicadas diretamente na base? Sim, sabemos que a limitação do Cont.Valores() pode prejudicar o range dinâmico sim, até aí, ok, mas, parece que não há necessidade alguma de haver aquela outra planilha.

Estou falando muita besteira?

Analisem.

 
Postado : 30/11/2015 8:21 am
Página 2 / 3