Notifications
Clear all

[Resolvido] Erro em Macro que redimensiona Tabela


SandroLima
(@sandrolima)
Trusted Member Registered
Entrou: 3 anos atrás
Posts: 86
Topic starter  

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.


ResponderCitar (Quote)
EdsonBR
(@edsonbr)
Prominent Member Moderator
Entrou: 5 anos atrás
Posts: 779
 

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]&""))

 

 


SandroLima curtiu
ResponderCitar (Quote)
SandroLima
(@sandrolima)
Trusted Member Registered
Entrou: 3 anos atrás
Posts: 86
Topic starter  

@edsonbr

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.


ResponderCitar (Quote)
EdsonBR
(@edsonbr)
Prominent Member Moderator
Entrou: 5 anos atrás
Posts: 779
 

Veja se é mais ou menos isso (anexo), @sandrolima

 


SandroLima curtiu
ResponderCitar (Quote)
SandroLima
(@sandrolima)
Trusted Member Registered
Entrou: 3 anos atrás
Posts: 86
Topic starter  

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.

Este post foi modificado 1 mês atrás 3 vezes por SandroLima

ResponderCitar (Quote)
EdsonBR
(@edsonbr)
Prominent Member Moderator
Entrou: 5 anos atrás
Posts: 779
 
 
Postado por: @sandrolima

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

 
Postado por: @sandrolima

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.


SandroLima curtiu
ResponderCitar (Quote)
SandroLima
(@sandrolima)
Trusted Member Registered
Entrou: 3 anos atrás
Posts: 86
Topic starter  

Boa noite, EdsonBr

Postado por: @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().

Postado por: @edsonbr

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.


ResponderCitar (Quote)