Oi MLRamos
Veja se o exemplo abaixo ajuda.
Não é igual ao teu caso, pois não estou lendo linhas de um arquivo externo, mas isto parece que você já otimizou com
Do While Not EOF(1)
Line Input #1, Linha
CODPROD = CDec(Mid(Linha, 10, 14))
QTDE = CCur(Mid(Linha, 30, 13)) / 1000
VALOR = CCur(Mid(Linha, 50, 16)) / 100
...
...
Loop
Close #1
Estou apenas tentando mostrar como trabalhar colocando os dados na memória.
Usei dois objetos Dicionário - um para pegar a QTDE e o outro para pegar o VALOR.
Se você não está acostumado a usar o objeto Dicionário, dê uma olhada em:
Uma introdução
http://www.techbookreport.com/tutorials/vba_dictionary.html
Excelente artigo
http://www.experts-exchange.com/Software/Office_Productivity/Office_Suites/MS_Office/A_3391-Using-the-Dictionary-Class-in-VBA.html
Depois crio uma matriz (array) de duas dimensões para armazenar os resultados em memória e, no fim, passo de uma só vez a matriz para a planilha.
O exemplo é muito simples. Imagine em Plan1
| Produto |
Quantidade |
Valor |
| P1 |
10 |
150,1 |
| P2 |
11 |
151,1 |
| P3 |
12 |
152,1 |
| P1 |
13 |
153,1 |
| P2 |
14 |
154,1 |
| P3 |
15 |
155,1 |
| P1 |
16 |
156,1 |
| P2 |
17 |
157,1 |
| P3 |
18 |
158,1 |
| P1 |
19 |
159,1 |
| P2 |
20 |
160,1 |
| P3 |
21 |
161,1 |
Rode esta macro
Sub aTest()
Dim ProdQ As Object, ProdV As Object
Dim QTDE As Double, VALOR As Double
Dim firstRow As Long, lastRow As Long
Dim rngdata As Variant, rngResult() As Variant
Dim v As Variant, i As Long
'Cria dois objetos Dicionário
Set ProdQ = CreateObject("Scripting.Dictionary")
Set ProdV = CreateObject("Scripting.Dictionary")
'Define os dados de entrada
With Sheets("Plan1") '<--Planilha de Dados
firstRow = 2
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
rngdata = .Range("A" & firstRow & ":C" & lastRow).Value
End With
For i = 1 To lastRow - firstRow + 1
'Leitura dos dados
QTDE = rngdata(i, 2)
VALOR = rngdata(i, 3)
'Verifica se o Produto já foi incluído nos dicionários
If ProdQ.Exists(rngdata(i, 1)) Then
'Se sim, soma as QTDE e VALOR aos valores anteriores
ProdQ.Item(rngdata(i, 1)) = ProdQ.Item(rngdata(i, 1)) + QTDE
ProdV.Item(rngdata(i, 1)) = ProdV.Item(rngdata(i, 1)) + VALOR
Else
'Se não, inclui o Produto nos dois Dicionários
ProdQ.Add rngdata(i, 1), QTDE
ProdV.Add rngdata(i, 1), VALOR
End If
Next i
'Redimensiona o array de resultados conforme o número de Produtos
ReDim rngResult(1 To ProdQ.Count, 1 To 3)
i = 0
'Faz um loop para percorrer todos os items dos Dicionarios
' e atribui os valores ao array de resultados
For Each v In ProdQ.keys
i = i + 1
rngResult(i, 1) = v
rngResult(i, 2) = ProdQ.Item(v)
rngResult(i, 3) = ProdV.Item(v)
Next v
With Sheets("Plan2") '<--Planilha de resultados
'Limpamdo as colunas A-C
.Range("A:C").ClearContents
'Colocando cabeçalhos
.Range("A1:C1").Value = Array("Produto", "Quantidade", "Valor")
'Passando o array de resultados de uma só vez
.Range("A2").Resize(ProdQ.Count, 3).Value = rngResult
End With
End Sub
E o resultado em Plan2 será
| Produto |
Quantidade |
Valor |
| P1 |
58 |
618,4 |
| P2 |
62 |
622,4 |
| P3 |
66 |
626,4 |
Como eu disse, é um exemplo muito simples, mas mostra como trabalhar em memória.
Espero que ajude.
M.