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?
- Home
- >
- Fórum
- >
- Windows, Softwa...
- >
- Suítes de escri...
- >
- Somar quantidade de itens...
Boa noite
Veja se esse vídeo pode te ajudar
[]s
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.
sugestão - disponibilize uma amostra do seu arquivo Excel diretamente aqui no fórum.
Ok Osvaldo.
Segue o link da planilha:
https://drive.google.com/open?id=0B-PFDtgthgOZQUFueGtpMUZIZ3M
Bom dia MarVenancio
Anexe a planilha diretamente aqui no fórum, pois nem todos podem acessar link do trabalho.
Para saber como anexar, acesse o Guia de Utilização do Fórum, que se encontra na minha assinatura.
[]s
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:
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
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."
Me.TextBox_datainicial.SetFocus
Exit Sub
End If
If datafinal = Empty Then
MsgBox ("Informe a data final para pesquisa."
Me.TextBox_datafinal.SetFocus
Exit Sub
End If
ListBox1.Clear
With Sheets("Plan3"
.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 & "-ROW(C2),,1)),--(Plan3!D2" & LR & "=Plan3!" & Cells(u, 4).Address & ")"
Set descr = Sheets("Plan2".[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
Grande Osvaldo!!!!
Cara... vc fez todo o código??? Aí dou valor.... MUITO OBRIGADO.
É claro que funcionou redondo... só um detalhe... conforma print abaixo, se eu mudar o período mesmo assim traz os itens com quantidade = zero.
Anexos
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."
Me.TextBox_datainicial.SetFocus
Exit Sub
End If
If datafinal = Empty Then
MsgBox ("Informe a data final para pesquisa."
Me.TextBox_datafinal.SetFocus
Exit Sub
End If
ListBox1.Clear
With Sheets("Plan3"
.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 & "-MIN(ROW(D" & r.Row & "" & LRf & "),,1))*(Plan3!D" & r.Row & "" & LRf & "=Plan3!" & r.Address & ")"
If cod = 1 Then
codprod = r.Value
cx = Evaluate("=SUMPRODUCT(SUBTOTAL(9,OFFSET(Plan3!E2:E" & LRf & ",ROW(C2:C" & LRf & "-ROW(C2),,1)),--(Plan3!D2" & LRf & "=Plan3!" & r.Address & ")"
Set descr = Sheets("Plan2".[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
Bom dia Osvaldo!
Sim. Ficou perfeito. Muito obrigado.
Agora vou estudar sua lógica para poder implementar nos meus outros projetos.
Abraços!!!