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.
@Amorim123, anexe um modelo com essa estrutura, senão fica complicado pra testarmos sem ter as tabelas e planilhas já criadas...
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).
@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!