Notifications
Clear all

[Resolvido] REDIMENSIONAR TABELA (PARA RECEBER ARRAY) A PARTIR DA ÚLTIMA LINHA COM DADOS

5 Posts
2 Usuários
0 Reactions
1,297 Visualizações
AMORIM123
(@amorim123)
Posts: 77
Trusted Member
Topic starter
 

Fala galera!!

Estou nas etapas finais de um projeto e tô com um problema simples que não estou conseguindo resolver, seguinte:

 

No procedimento abaixo tenho um array que armazena a área com dados de uma tabela na planilha x (ShtNFe); também tenho um dicionário declarado no topo do módulo pra ficar público nesse módulo; esse dicionário contém como item: 'COD_PROD', 'DESCRICAO', 'NCM' e 'CLASSIFICACAO' e como chave: 'COD_PROD'. Faço uma comparação entre array vs dicionário para obter a CLASSIFICACAO da tecla no dicionario e repassar para o registro no array, ao final todos os registros no array estarão devidamente classificados; Para repassar a classificação para a tabela o que me importa é o último campo, porém como subi toda a tabela para memória do array precisei fazer um tratamento disso, criando um novo dicionário apenas pra esse procedimento para na sequência descarregar em novo array e ao final do loop For repassar o conteúdo inteiro, de uma só vez para coluna da tabela. Bem até aqui tudo massa!

Public Sub Apply_Rating()

Dim arrShtNFe     As Variant
Dim endCell       As Long
Dim i             As Long
Dim arrDisc       As Variant
Dim Dict          As New Scripting.Dictionary
Dim arrDef        As Variant
Dim rng           As Range
Dim tblDefault    As ListObject
Dim efinal        As Long

Set tblDefault = ShtDefault.ListObjects("Default")

With ShtNFe

    ShtNFe.Activate
    'METODO RANGE FALHA QUANDO A PLANILHA 'NFe' NÃO ESTÁ ATIVA
    endCell = .Cells(.rows.count, 1).End(xlUp).row
    arrShtNFe = .Range(.Cells(2, 1), Cells(endCell, 52))
    
    For i = LBound(arrShtNFe) To UBound(arrShtNFe)
                                                              'arrShtNFe(i, 52) = DictProcessing(CStr(arrShtNFe(i, 14)))(4)
        If DictProcessing.Exists(CStr(arrShtNFe(i, 14))) Then
            arrShtNFe(i, 52) = DictProcessing(CStr(arrShtNFe(i, 14)))(4)
            Dict(i) = arrShtNFe(i, 52)
        End If
        
        If i >= UBound(arrShtNFe) Then
            arrDisc = Dict.Items
            ShtNFe.ListObjects("NFe").ListColumns(52).DataBodyRange.value = Application.transpose(arrDisc)
            Dict.RemoveAll
            endCell = 0
        End If
    Next i

End With


    ShtDefault.Activate

    arrDef = DictNewItemDefault.Items
    tblDefault.ListRows.Add alwaysinsert:=True
'O PROBLEMA COMEÇA POR AQUI
    efinal = tblDefault.DataBodyRange.End(xlDown).Offset(1).row
        
    Set rng = tblDefault.Range.Offset(tblDefault.Range.rows.count).rows.Resize(DictProcessing.count)
       tblDefault.DataBodyRange(efinal, 4).value = arrDef
'       rng.ListColumns(2).DataBodyRange.value = Application.transpose(arrDef, 1)
'       rng.ListColumns(3).DataBodyRange.value = Application.transpose(arrDef, 2)
'       rng.ListColumns(4).DataBodyRange.value = Application.transpose(arrDef, 3)

    
End Sub

Agora preciso fazer algo parecido, no sentido de descarregar um array em outra tabela (tblDefault) , sem loopar, todo o conteúdo do array a partir da linha inserida na tabela após a última linha com dados.

Espero ter cido sucinto nos objetivos; sei que é um pouco complicado sugerir algo sem debugar o código, porém na real o problema se resumo a "Redimensionar Tabela apartir da Última linha com dados" para receber conteúdo de array.

Desde já agradeço a interação.

 

 
Postado : 23/03/2022 11:14 pm
Tags do Tópico
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

@Amorim123, anexe um modelo com essa estrutura, senão fica complicado pra testarmos sem ter as tabelas e planilhas já criadas...

 
Postado : 25/03/2022 5:06 pm
AMORIM123
(@amorim123)
Posts: 77
Trusted Member
Topic starter
 

@edsonbr Segue exemplo

 
Postado : 25/03/2022 7:45 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Bom dia, @AMORIM123!

Estive muito ocupado por esses dias, não pude entrar no fórum.

Para descarregar todo o conteúdo de um range ou array em uma sequência de novas linhas num ListObject, recupere o range retornado pelo método ListRows.Add numa variável tipo Range e então redimensione-a conforme o número de linhas desse range fonte com a propriedade Resize, lembrando que o número de colunas deve ser igual ou levar isso em conta ao usar o Resize. Feito isso, é só descarregar o conteúdo (.Value).

 
Postado : 29/03/2022 8:55 am
AMORIM123
(@amorim123)
Posts: 77
Trusted Member
Topic starter
 

@EdsonBR , Muito obrigado por interagir, graças à Deusa Mnemosine e às ferramentas de depuração consegui vê onde estava meu problema...rsrsrs

Na verdade o problema não estava em redimensionar a tabela pra receber os dados do array, mas sim em como o array estava sendo populado; Em outros procedimentos no mesmo módulo eu tinha um Dicionário que recebia em cada tecla um vetor com 4 posições; ao descarregar esse dicionário em um novo array eu esperava que ele tivesse o compartamento de uma matriz🤦🏽‍♂️, porém como os dados de origem eram um vetor o propósito nunca seria alcançado, né (rsrsrs). 

Revi o código escrito e consegui manipular para que o array se compartasse como uma matriz, então deu rock!

 
Postado : 02/04/2022 9:39 pm