Boa noite, colegas e colaboradores do fórum.
Poderiam me ajudar apontando qual o erro da Macro "RedimensionaTabela" da planilha em anexo?
Ela deve redimensionar a quantidade de linhas da Tabela "TB_CarteiraAtual" (da Aba "CARTEIRA ATUAL") de acordo com o valor do Range "Ativos_PosiçãoAberta" (da Aba HIST. OPERAÇÕES").
Não identifiquei o motivo do erro.
Grato a quem puder ajudar.
Bom dia, @sandrolima
Para adicionar linhas em tabelas, use o método Add do objeto ListRows antes de adicionar as linhas em seu range. Por exemplo, para adicionar 3 novas linhas no final da tabela:
Dim rgTemp As Range Set rgTemp = lobTabela.ListRows.Add(AlwaysInsert:=True).Range.Resize(3)
Para deletar as 3 primeiras linhas:
lobTabela.ListRows(1).Range.Resize(3).Delete Shift:=xlShiftUp
______________________
Curiosidade: qual a finalidade da fórmula matricial abaixo, da planilha "HIST. OPERAÇÕES", célula J9 (Ativos_PosiçãoAberta)? A parte do CONT.SES compara algumas colunas com elas mesmas concatenadas com vazio (& "") ... 🤔 achei inconsistente o resultado, pois todas as linhas nas 3 colunas ou são texto ou vazias e portanto iguais, então o resultado deveria ser uma contagem 100%... 🤔
=SOMARPRODUTO(((TB_HistoricoOperacoes[Ativo]<>"")*(TB_HistoricoOperacoes[Coluna12]="")*(TB_HistoricoOperacoes[Coluna13]=""))/CONT.SES(TB_HistoricoOperacoes[Ativo];TB_HistoricoOperacoes[Ativo]&"";TB_HistoricoOperacoes[Coluna12];TB_HistoricoOperacoes[Coluna12]&"";TB_HistoricoOperacoes[Coluna13];TB_HistoricoOperacoes[Coluna13]&""))
Boa noite, Edson... e muito obrigado pelo retorno.
Não sei se vou conseguir responder o que vc perguntou sobre a fórmula (sou um mero curioso e eterno iniciante de conhecimento limitado em Excel).
Essa fórmula com certeza consegui com a ajuda de alguém pq não entendo praticamente nada de fórmulas matriciais.
Mas vamos lá... a Coluna 12 corresponde a uma coluna de data (Data Saída) e a coluna 13 corresponde a uma coluna Contábil (Vlr Saída). A fórmula me retorna a quantidade de ativos que estão com posição aberta (ou seja, estão comprados ou vendidos, e portanto, estão com os campos "Data Saída" e "Valor Saída" vazios).
Devo ter aproveitado ela de uma outra planilha que trazia resultado semelhante. Mas ela apresenta o resultado esperado. Espero ter conseguido explicar.
Sobre a sua solução apresentada não consegui fazer aplicar na minha macro.
O curioso é que já usei essa macro em outras aplicações e funcionava.
O que gostaria como pode ver no desenvolver da macro é que a Tabela "TB_CarteiraAtual" da Aba "CARTEIRA ATUAL" fosse redimensionada para a quantidade de linhas + 1 do valor apresentado no Range "Ativos_PosiçãoAberta" da Aba "HIST. OPERAÇÕES".
Ao alterar o valor do ""Ativos_PosiçãoAberta" ele faz a leitura correta... conta a quantidade de linhas que a Tabela deve apresentar (lngQtdeLinhas) mas quando chega na macro "RedimensionaTabela" ela apresenta erro no método Insert da Classe Range... penso que seja algum pequeno detalhe apenas que estou fazendo errado... ja tive essa macro funcionando antes.
Boa tarde, EdsonBr.
É exatamente isso que precisava... muito obrigado pela solução.
Só mais uma dúvida para fechar a dinâmica do processo. Preciso deixar o redimensionamento da tabela de forma automática ao alterar o valor do Range "Ativos_PosiçãoAberta" da Aba "HIST. OPERAÇÕES".
Isso se daria através do evento Worksheet_Change(ByVal Target As Range), correto?
Como vc colocaria dentro dessa Sub para que ao alterar ESPECIFICAMENTE o valor do Range "Ativos_PosiçãoAberta" ele redimensione a tabela.. pergunto pq já vi alguns modelos de apontar o range e não sei como seria o mais apropriado.
Preciso que ele rode a macro SOMENTE SE o Range "Ativos_PosiçãoAberta" for alterado.
Seria algo como:
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim AtvPosAb As Range AtvPosAb = Me.Range("Ativos_PosiçãoAberta") If AtvPosAb.Address = Target.Address Then End If End Sub
Como eu completo para executar o evento WorkSheet_Calculate() ??? (Se o valor do Range for alterado)
Se tiver sugestão melhor... esse foi só um modelo que vi.
...Preciso deixar o redimensionamento da tabela de forma automática ao alterar o valor do Range "Ativos_PosiçãoAberta" da Aba "HIST. OPERAÇÕES"
...Preciso que ele rode a macro SOMENTE SE o Range "Ativos_PosiçãoAberta" for alterado.
Se vc testar o arquivo fazendo alguma operação de modo que o range Ativos_PosiçãoAberta sofra qualquer alteração, para mais ou para menos, perceberá que a macro já está fazendo exatamente isso tudo que vc deseja.
Isso se daria através do evento Worksheet_Change(ByVal Target As Range), correto?
Não. Usei o Calculate pelo motivo que o range Ativos_PosiçãoAberta contém uma fórmula e não uma inserção manual de dados, portanto ele, especificamente, sofre alterações ao ser recalculado. A cada recálculo, a quantidade de linhas da Carteira Atual é comparada com a desse range e, se necessário, linhas são removidas ou acrescentadas à da Carteira Atual.
Perceba que removi todos os outros módulos que estavam no seu arquivo, por não serem mais necessários.
Ao invés de guardar o valor anterior da quantidade de Ativos P. Ab. comparando com uma suposta nova quantidade etc., etc., como estava no seu modelo, a macro agora age imediatamente assim que houver diferença entre a quantidade de Ativos P. Ab. e a quantidade de linhas da tabela Carteira Atual.
Ou isso ou não entendi nada do que vc arguiu em seu pedido.
Boa noite, EdsonBr
Se vc testar o arquivo fazendo alguma operação de modo que o range Ativos_PosiçãoAberta sofra qualquer alteração, para mais ou para menos, perceberá que a macro já está fazendo exatamente isso tudo que vc deseja.
Perfeito... era exatamente isso que desejava.
Havia feito o teste alterando "manualmente" o range com a fórmula e por isso não acontecia nenhuma alteração. Não conhecia o funcionamento do evento Worksheet_Calculate().
Usei o Calculate pelo motivo que o range Ativos_PosiçãoAberta contém uma fórmula e não uma inserção manual de dados, portanto ele, especificamente, sofre alterações ao ser recalculado. A cada recálculo, a quantidade de linhas da Carteira Atual é comparada com a desse range e, se necessário, linhas são removidas ou acrescentadas à da Carteira Atual.
Perceba que removi todos os outros módulos que estavam no seu arquivo, por não serem mais necessários.
Ao invés de guardar o valor anterior da quantidade de Ativos P. Ab. comparando com uma suposta nova quantidade etc., etc., como estava no seu modelo, a macro agora age imediatamente assim que houver diferença entre a quantidade de Ativos P. Ab. e a quantidade de linhas da tabela Carteira Atual.
Perfeitamente entendido.
Mais um aprendizado... obrigado.