Notifications
Clear all

Intervalo Dinâmico com INDIRETO

8 Posts
2 Usuários
0 Reactions
3,071 Visualizações
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Pessoal, não achei isso no fórum.

Intervalo dinâmico com DESLOC já é bem conhecido, e com ÍNDICE, o nosso amigo Fernando também já apresentou a pouco tempo no fórum.
Vide os links:
Intervalo Dinâmico com DESLOC
Intervalo Dinâmico com ÍNDICE

Porém, por acaso, percebi que poderia fazer intervalo dinâmico com INDIRETO.

E para que, então, usar INDIRETO?
Bom, a resposta, na verdade, eu não tenho, mas acredito que seja mais rápido do que ÍNDICE ou DESLOC.

Para referenciar apenas uma coluna, creio que seja até mais simples.

Vejamos, se eu fizesse o intervalo dinâmico de uma lista na coluna A, usando DESLOC, seria algo assim:

=DESLOC($A$1;0;0;CONT.VALORES($A:$A))

Se fosse com ÍNDICE, seria assim:

=$A$1:ÍNDICE($A:$A;CONT.VALORES($A:$A);1)

E com INDIRETO:

=INDIRETO("A1:A"&CONT.VALORES($A:$A))

A mesma lógica, porém, como temos menos informações para serem processadas ao usar INDIRETO, creio que deva ser mais rápido.

Se eu quiser estabelecer uma matriz com várias colunas, também é possível, basta indicar as colunas, por exemplo, da coluna B até a coluna G:

=INDIRETO("B1:G"&CONT.VALORES($A:$A))

Eu apenas não achei uma forma legal de estabelecer um intervalo dinâmico, que seja dinâmico para linhas e colunas.
É possível fazer, aninhando funções como SE + CARACT + INT + MOD.

Enfim, só por ai dá pra ver que não vale a pena, mas, a título de curiosidade, segue a fórmula:

=INDIRETO("A1:"&SE(CONT.VALORES(1:1)-1<26;CARACT(MOD(CONT.VALORES($1:$1)-1;26)+65);SE(CONT.VALORES(1:1)-1<((26*26)+26);CARACT(SE(INT(((CONT.VALORES($1:$1)-1)-26)/26)<26;INT(((CONT.VALORES($1:$1)-1)-26)/26);MOD(INT(((CONT.VALORES($1:$1)-1)-26)/26);26))+65)&CARACT(MOD(CONT.VALORES($1:$1)-1;26)+65);CARACT(SE(INT(((CONT.VALORES($1:$1)-1)-((26*26)+26))/(26*26))<26;INT(((CONT.VALORES($1:$1)-1)-((26*26)+26))/(26*26));MOD(INT(((CONT.VALORES($1:$1)-1)-((26*26)+26))/(26*26));26))+65)&CARACT(SE(INT(((CONT.VALORES($1:$1)-1)-26)/26)<26;INT(((CONT.VALORES($1:$1)-1)-26)/26);MOD(INT(((CONT.VALORES($1:$1)-1)-26)/26);26))+65)&CARACT(MOD(CONT.VALORES($1:$1)-1;26)+65)))&CONT.VALORES($A:$A))

É enorme, e, como eu disse acima, totalmente inviável. Coloquei apenas a título de curiosidade mesmo. (Claro que poderia reduzir um pouco, mas fiz questão de deixar dessa forma para ficar bem visual os valores como 26 - as letras de A a Z, e o número 65 - o código para a letra A).

Bem, resumindo, Quando fizer intervalo dinâmico daqui pra frente, se tiver uma coluna única (ou colunas fixas), vou dar a preferência para INDIRETO, se tiver colunas variáveis, vou preferir DESLOC.

Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.

Gilmar

 
Postado : 05/02/2014 11:37 pm
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Aproveitando,

Quando fazemos um intervalo dinâmico, o mais comum é usar a função CONT.VALORES para que o intervalo se ajuste à quantidade de linhas (informações inseridas). Especialmente quando temos uma lista (que pode ser usada em validação de dados, por exemplo).

Porém, às vezes pode ser de nosso interesse ter um intervalo dinâmico que reconheça todas as linhas de uma determinada coluna, mesmo que existam linhas em branco. Isso pode ser útil se eu quiser que esta lista sirva para trazer dados de um relatório, por exemplo. Ou, se eu tiver células mescladas).

Nesses casos, em vez de usar CONT.VALORES, posso usar PROC + LIN. Abaixo, um exemplo, como é com CONT.VALORES, e como ficaria com PROC + LIN:

Usando DESLOC + CONT.VALORES:
=DESLOC($A$1;0;0;CONT.VALORES($A:$A))

Usando DESLOC + PROC + LIN:
=DESLOC($A$1;0;0;PROC(2;1/($A:$A<>"");LIN($A:$A)))

Usando INDIRETO + CONT.VALORES:
=INDIRETO("A1:A"&CONT.VALORES($A:$A))

Usando INDIRETO + PROC + LIN:
=INDIRETO("A1:A"&PROC(2;1/($A:$A<>"");LIN($A:$A)))

Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.

Gilmar

 
Postado : 06/02/2014 12:34 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia GT,

Cara, deixando minha contribuição, para o indireto() pode usar assim:

=INDIRETO("A1:"&ESQUERDA(ENDEREÇO(1;CONT.VALORES(1:1);4);NÚM.CARACT(ENDEREÇO(1;CONT.VALORES(1:1);4))-1)&CONT.VALORES(A:A))

Qualquer coisa da o grito.
Abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 06/02/2014 6:42 am
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Beleza, Bernardo,

Simplificou bastante a minha fórmula, mas ainda não é viável usar INDIRETO nesse caso. :lol:

Abs

Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.

Gilmar

 
Postado : 06/02/2014 7:52 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia GT,

Tudo vai depender da necessidade. Mas particularmente prefiro o desloc() mesmo, pois é mais simples, rápido e não demora muito, apesar de que eu mesmo não "utilizo" muito o excel... somente desenvolvo pequenas planilhas mesmo.

Qualquer coisa da o grito.
Abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/02/2014 6:39 am
(@gtsalikis)
Posts: 2373
Noble Member
Topic starter
 

Putz, e ainda assim, tu manja pra caramba.

Eu faço mais planilhas pros outros (que quase nunca sabem o que querem), ou isso, ou planilhas pra umas 50 pessoas compartilharem.

Ou seja, o pessoal faz cag*** o tempo todo, e tenho q ficar constantemente atualizando).

Por isso, quanto mais puder facilitar a manutenção, melhor.

Mas concordo contigo - na pressa, era sempre o DESLOC() (agora que eu vi com INDIRETO(), vou passar a usar dessa forma, que também é tão simples quanto o DESLOC(), mas, se travar, posso corrigir mais facilmente.

Lembre-se de AGRADECER aos que te ajudaram, e de marcar o tópico como [Resolvido]
Gente que cuida de gente.

Gilmar

 
Postado : 07/02/2014 6:54 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Muito boa sguestão, mais uma forma de criar intervalos dinâmicos... mas, só um detalhe, em termos de desempenho, não é mais rápido não.
Veja bem, "acho que é mais rápido" não é bom argumento, rs

INDIRETO e DESLOC ambos são funções voláteis, ou seja, recalculam o tempo todo e disparam o recálculo geral do arquivo aberto.
ÍNDICE() não é volátil, e em termos de desempenho, é a melhor alternativa.

Eu gosto mais de fazer com desloc(), mas se o modelo de trabalho for gigantesco, então a melhor alternativa é o ÍNDICE() mesmo...

FF ;-)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 03/04/2014 8:00 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Um ponto de partida (em inglês):

http://chandoo.org/wp/2014/03/03/handle-volatile-functions-like-they-are-dynamite/

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 03/04/2014 8:52 am