Intervalo Dinâmico ...
 
Notifications
Clear all

Intervalo Dinâmico com INDIRETO

8 Posts
2 Usuários
0 Reactions
3,107 Visualizações
Posts: 2373
Topic starter
(@gtsalikis)
Noble Member
Entrou: 13 anos atrás

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.

Responder
7 Respostas
Posts: 2373
Topic starter
(@gtsalikis)
Noble Member
Entrou: 13 anos atrás

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)))

Responder
Fernando Fernandes
Posts: 43750
(@fernandofernandes)
Illustrious Member
Entrou: 17 anos atrás

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

Responder
Posts: 2373
Topic starter
(@gtsalikis)
Noble Member
Entrou: 13 anos atrás

Beleza, Bernardo,

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

Abs

Responder
Fernando Fernandes
Posts: 43750
(@fernandofernandes)
Illustrious Member
Entrou: 17 anos atrás

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

Responder
Página 1 / 2