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
 

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.

Fernando, só vi agora sua postagem, em relação a sua obs, de fato não teria lógica, mas o que aconteceu aqui, é que reduzi o arquivo e deixei somente com a parte que estava tendo problema com a formula, na realidade no arquivo original, a aba BD tem 32 colunas e a aba RESUMO 21 colunas e se ver só na coluna A temos a concatenação de 3 colunas do BD, ou seja, na Resumo é puxado somente os dados das colunas que interessam ao pessoal, e outro motivo, é que os dados que vão para a aba BD estão sendo digitados por varias pessoas e cada uma em um arquivo separado, depois eles enviam a pessoa para juntar todos na aba do arquivo matriz.
Com certeza, poderia ter ajustado varias coisas, como me solicitaram ajuda, até dei algumas idéias a eles, mas preferem desta forma, uma vez que os dados a serem digitados veem de fontes externas diferentes, da PRF e Concessionária da via e são copiados dos boletins de ocorrência em pdf. Até a idéia de converterem os PDF em arq texto e criar uma rotina para importar ja dei, mas como eu disse, pelo menos por enquanto preferem da forma que está.

De qualquer forma agradeço a ajuda e as observações.

[]s

 
Postado : 02/12/2015 1:14 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

.
Pelo que percebi esta sugestão que estou postando é menos pesada que a DESLOC, pelo menos é o que percebi numa plan que vai até a coluna DZ!!
.

A1 =ESQUERDA(ENDEREÇO(LIN();COL();4);SE(COL()<=26;1;SE(COL()<=702;2;4)))&20000-CONTAR.VAZIO(A5:A20000) 

... arrasta até a coluna DZ, assim vc terá a coluna e a linha final de cada coluna - e poderá usar a INDIRETO!!
.
A4 (já que tenho 2 linhas de títulos)

=SE(ÉERROS(CORRESP(MENOR($AD4:INDIRETO($AD$1);LIN()-3);$AD$4:INDIRETO($AD$1);0));"";ÍNDICE(M$4:INDIRETO(M$1);CORRESP(MENOR($AD4:INDIRETO($AD$1);LIN()-3);$AD$4:INDIRETO($AD$1);0)))

.

 
Postado : 08/02/2016 2:07 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Referência indireto() é pros fortes!
Coragem!

 
Postado : 11/02/2016 3:37 pm
(@edcronos2)
Posts: 0
New Member
 

sei que o tópico é sobre formulas dinâmicas
particularmente eu uso intervalos super dinâmicos tanto colunas quanto linhas
para linhas eu uso uma função vba já que a preciso da ultima linha de um conjunto de colunas

Public Function ULinhaRange(ByVal Letra_Coluna_ini As String, ByVal Letra_Coluna_Fim As String, Optional Nome_Aba As String) As Long   'ultima linha com dados
'Application.Volatile
    Dim C As Long, fLC As Long, L As Long
    If Nome_Aba = "" Then Nome_Aba = ActiveSheet.Name
    fLC = 105
    For C = Cells(1, Letra_Coluna_ini).Column To Cells(1, Letra_Coluna_Fim).Column
        L = Sheets(Nome_Aba).Cells(Rows.Count, C).End(xlUp).Row
        If L > fLC Then
            fLC = L
        End If
    Next
    ULinhaRange = fLC
End Function

para colunas eu uso apenas col() nas colunas de referencia , mas nem precisaria já que a adição de colunas e exclusão é feito por uma macro

Sub ColunasN(ByVal Quantidade_de_Colunas As Long, Optional Nome_Aba As String)   '(ByVal Nome_SETOR As String,

    If Nome_Aba = "" Or Nome_Aba = "PLanAtiva" Then Nome_Aba = ActiveSheet.Name
    Dim Ma As Long, n As Long
    Ma = Quantidade_de_Colunas
    With Sheets(Nome_Aba)

        .Range(TabelaSetores).Calculate
        If Limit(1) <> "AUXIa" Then Desformata
        If Ma > 2 Then
            Cf1 = Let_Num_Col(Cf)    'Cells(1,Cf ).Column
            If Cq < Ma Then    '--------------------------------------------------------------------------( insere colunas )--------
                n = Ma - Cq
                .Range(.Cells(6, Cf1 + 1), .Cells(1, Cf1 + n)).EntireColumn.Insert
                .Range(.Cells(6, Cf1 - 1), .Cells(16, Cf1)).AutoFill Destination:=.Range(.Cells(6, Cf1 - 1), .Cells(16, Cf1 + n)), Type:=xlFillDefault  ' Espande Formulas
                Cf = Letra_Col(Cf1 + n): Fc = Letra_Col(Cf1 + n + 1)
            End If
            If Cq > Ma Then  ' ------------------------------------------------------------------------( deleta colunas )--------
                n = Cq - Ma - 1
                .Range(.Cells(6, Cf1 - n), .Cells(1, Cf1)).EntireColumn.Delete
                Cf = Letra_Col(Cf1 - (n + 1)): Fc = Letra_Col(Cf1 - n)
            End If
            Cq = Ma
        End If
        .Range(TabelaSetores).Calculate
        If Limit(1) <> "AUXIa" Then Reformata
    End With

End Sub

e com isso mantenho uma tabela com as características da planilha e a partir dessa tabela posso fazer praticamente qualquer tipo de formula dinâmica
tipo essa

=SEERRO(ÍNDICE(INDIRETO(ÍNDICE($A$15:$J$15;1;CORRESP(AQ3;$A$12:$J$12;0))&105&":"&ÍNDICE($A$15:$J$15;1;CORRESP(AQ3;$A$12:$J$12;0))&$F$10);CORRESP(AR$3;INDIRETO(C15&105&":"&C15&$F$10);0);1);"N")

para falar a verdade essa tabela funciona como controle de areas nomeadas

 
Postado : 18/03/2016 12:30 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Oi Ed, tudo bom? Qto tempo hein !
Olha, eu particularmente acho seu método umas 3.549 vezes mais complicado que o meu proposto neste tópico !

Não vou testar pq pra mim está confuso ! Mas se funciona pra vc, que bom.
Já tiro meu chapéu pra vc que criou e pra qquer pessoa que venha entender e usar isso!

Abs,

FF

 
Postado : 18/03/2016 1:05 pm
(@edcronos2)
Posts: 0
New Member
 

e aí fernando
eu sou enrolado mesmo kkk
mas funciona sim tanto que a planilha pode pular de 1000 linha x 50 colunas até 5000 linha x 1000 colunas ou mais e ainda tenho controle dela
ela funciona quase igual a um banco de dados com tabelas , só que quando eu fiz nem sabia que existia banco de dados e chamei as tabelas de setores kkk

sobre a função que indica a ultima linha de um conjunto de colunas

=ULinhaRange("AB";"AH";"Plan3")
vai indica a ultima linha da coluna AB até AH da plan3
só que a macro esta programada para não ultrapassar de 105 para cima "fLC = 105" pq tem dados de controle

sobre a tabela de controle é algo que fiz no inicio tbm quando estava aprendendo vc já deve ter visto ela por aqui em minhas primeiras postagens
com isso eu posso trocar nome, tamanho, tipo ou até trocar de possição
nela tem posição do setor na aba, cores, formatações condicionais e de onde veio o setor

a partir dela eu crio arrays de buscas , comparações e modificações
basicamente falando é um BD dinâmico dentro da planilha

tenho ideia de modificação e passar essa tabela e macros para uma dll , mas ando desanimado com tudo e larguei de lado tem um tempo

 
Postado : 18/03/2016 1:52 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

.
Como achei o vídeo MUITO BOM, vai uma contribuição para o tópico!!
.
https://www.youtube.com/watch?v=zMp6eXVMNEo
.
PS: alguém pode dizer que é spam, mas todo bom curso tem seu preço, e, já que o vídeo é grátis, o cara aproveitou para vender o peixe dele!! ... Nada contra!!
.

 
Postado : 07/11/2016 9:20 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

.
Fernando, por ser muito bom seu vídeo, não resisti em postar aqui k ............. https://www.youtube.com/watch?v=Z1A7G2t8kxQ
.

 
Postado : 27/02/2017 7:40 pm
Página 3 / 3