Logo Hardware.com.br
MarVenancio
MarVenancio Novo Membro Registrado
14 Mensagens 0 Curtidas

[Resolvido] Somar quantidade de itens e apresentar na Listbox

#1 Por MarVenancio 21/07/2017 - 14:27
Olá!
Possuo uma relação de notas, onde gravo em cada linha: Emissão / Numero NF / Produto
A planilha com estes dados fica assim:
EMISSAO Numero NF Produto
20/07 10 1010
20/07 10 1020
20/07 11 1010
20/07 13 1010... e assim por diante.
Criei um userfom com data inicial e data final para pegar as notas dentro do período e montar um listbox com as quantidades por produto.
Preciso que apareça no listbox a quantidade de ocorrencias de cada produto.
Como no exemplo acima dentro da Listbox:
Produto 1010 - 03
Produto 1020 - 01
Consigo fazer isso na listbox?
Responder
MarVenancio
MarVenancio Novo Membro Registrado
14 Mensagens 0 Curtidas
#3 Por MarVenancio
22/07/2017 - 15:08
P@tropi, valeu pela dica... não é bem o que eu preciso agora, mas vai me servir pra outra parte do meu projeto.
Eu preciso que já traga para o listbox os valores somados de quantidades de caixas de cada item.
Item 01 - 10 cx
Item 02 - 20 cx...
Vou tirar isso de uma lista de notas cadastradas, onde vou filtrar pelo código do item, por isso que preciso uma forma de somar essas quantidades do mesmo item e apresentar o total de cada item direto no listbox.
MarVenancio
MarVenancio Novo Membro Registrado
14 Mensagens 0 Curtidas
#7 Por MarVenancio
28/07/2017 - 10:48
Segue planilha.

Senhores... com o codigo abaixo usando a sugestão do P@tropi utilizando application.worksheetfunction.countif...

With ListBox1
If Application.WorksheetFunction.CountIf(w.Range(w.Cells(u, 1), w.Cells(ultimalinha, 5)), w.Cells(u, 4)) = 1 Then
.AddItem
.List(linhalistbox, 0) = w.Cells(u, 4) 'codigo produto
For i = 1 To ultimalinhaprod
If Trim(x.Cells(i, 1).Value) = codprod Then
.List(linhalistbox, 1) = x.Cells(i, 2) 'descriçao do produto
End If
Next
.List(linhalistbox, 2) = w.Cells(u, 5) 'quantidade caixas
linhalistbox = linhalistbox + 1
End If
End With

consegui inserir os itens no listbox conforme abaixo:

Anexo do post

porém não está somando as quantidades totais de cada item.
O resultado correto seria:
40.06.0017 - 03 cx
40.05.0001 - 20 cx
40.06.0008 - 10 cx

Alguma sugestão de onde está a falha?

P@atropi, vc respondeu a uma dúvida num forum em 2014 com uma planilha que faz exatamente o que preciso, só que em fórmula.
Teria como fazer o mesmo resultado com VBA?
Em anexo sua planilha.

Anexos

osvaldomp
osvaldomp Geek Registrado
753 Mensagens 558 Curtidas
#8 Por osvaldomp
29/07/2017 - 15:59
Private Sub Btn_gerar_Click()
Dim linhalistbox As Long
Dim LR As Long, u As Long
Dim datainicial As Date, datafinal As Date
Dim codprod As String, cx As Long, descr As Range

datainicial = CDate(Me.TextBox_datainicial.Value)
datafinal = CDate(Me.TextBox_datafinal.Value)

If datainicial = Empty Then
MsgBox ("Informe data inicial para pesquisa.&quot
Me.TextBox_datainicial.SetFocus
Exit Sub
End If

If datafinal = Empty Then
MsgBox ("Informe a data final para pesquisa.&quot
Me.TextBox_datafinal.SetFocus
Exit Sub
End If

ListBox1.Clear

With Sheets("Plan3&quot
.AutoFilterMode = False
LR = .Cells(Rows.Count, 1).End(3).Row
.Range("A1:E" & LR).AutoFilter Field:=1, Criteria1:=">=" & CDbl(datainicial), Operator:=xlAnd, Criteria2:="<=" & CDbl(datafinal)
On Error Resume Next

For u = 2 To LR
If Application.CountIf(.Range(.Cells(u, 4), .Cells(LR, 4)), .Cells(u, 4)) = 1 Then
codprod = .Cells(u, 4)

cx = Evaluate("=SUMPRODUCT(SUBTOTAL(9,OFFSET(Plan3!E2:E" & LR & ",ROW(C2:C" & LR & &quot-ROW(C2),,1)),--(Plan3!D2" & LR & "=Plan3!" & Cells(u, 4).Address & &quot)&quot

Set descr = Sheets("Plan2&quot.[A:A].Find(codprod, lookat:=xlWhole)
ListBox1.AddItem
ListBox1.List(linhalistbox, 0) = codprod 'codigo produto
ListBox1.List(linhalistbox, 1) = descr.Offset(, 1).Value 'descrição do produto
ListBox1.List(linhalistbox, 2) = cx 'quantidade de caixas
linhalistbox = linhalistbox + 1
End If
Next u
.AutoFilterMode = False
End With

If ListBox1.ListCount > 0 Then
Btn_imprimir.Enabled = True
Btn_limpar.Enabled = True
End If
End Sub


obs. antes de testar insira uma linha na posição da linha 1 da Plan3 e preencha com cabeçalhos o intervalo 'A1:E1' da nova linha
Osvaldo
osvaldomp
osvaldomp Geek Registrado
753 Mensagens 558 Curtidas
#10 Por osvaldomp
31/07/2017 - 20:06
Veja se melhorou.
Private Sub Btn_gerar_Click()
Dim linhalistbox As Long, rng As Range
Dim LR As Long, r As Range, LRf As Long, cod As Long
Dim datainicial As Date, datafinal As Date
Dim codprod As String, cx As Long, descr As Range

datainicial = CDate(Me.TextBox_datainicial.Value)
datafinal = CDate(Me.TextBox_datafinal.Value)

If datainicial = Empty Then
MsgBox ("Informe data inicial para pesquisa.&quot
Me.TextBox_datainicial.SetFocus
Exit Sub
End If

If datafinal = Empty Then
MsgBox ("Informe a data final para pesquisa.&quot
Me.TextBox_datafinal.SetFocus
Exit Sub
End If

ListBox1.Clear

With Sheets("Plan3&quot
.AutoFilterMode = False
LR = .Cells(Rows.Count, 1).End(3).Row
.Range("A1:E" & LR).AutoFilter Field:=1, Criteria1:=">=" & CDbl(datainicial), Operator:=xlAnd, Criteria2:="<=" & CDbl(datafinal)
If .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count = 1 Then .AutoFilterMode = False: Exit Sub
LRf = .Cells(Rows.Count, 1).End(3).Row
Set rng = .Range("D2" & LRf).Cells.SpecialCells(xlCellTypeVisible)
For Each r In rng
cod = Evaluate("SUMPRODUCT(SUBTOTAL(3,OFFSET(Plan3!D" & r.Row & "" & LRf & ",ROW(Plan3!D" & r.Row & "" & LRf & &quot-MIN(ROW(D" & r.Row & "" & LRf & &quot),,1))*(Plan3!D" & r.Row & "" & LRf & "=Plan3!" & r.Address & &quot)&quot
If cod = 1 Then
codprod = r.Value
cx = Evaluate("=SUMPRODUCT(SUBTOTAL(9,OFFSET(Plan3!E2:E" & LRf & ",ROW(C2:C" & LRf & &quot-ROW(C2),,1)),--(Plan3!D2" & LRf & "=Plan3!" & r.Address & &quot)&quot
Set descr = Sheets("Plan2&quot.[A:A].Find(codprod, lookat:=xlWhole)
ListBox1.AddItem
ListBox1.List(linhalistbox, 0) = codprod 'codigo produto
ListBox1.List(linhalistbox, 1) = descr.Offset(, 1).Value 'descrição do produto
ListBox1.List(linhalistbox, 2) = cx 'quantidade de caixas
linhalistbox = linhalistbox + 1
End If
Next r
.AutoFilterMode = False
End With

If ListBox1.ListCount > 0 Then
Btn_imprimir.Enabled = True
Btn_limpar.Enabled = True
End If
End Sub
Osvaldo
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal