VBA lọc ra tên hàng nếu trùng Tên và Trùng Đơn Giá thì cộng dồn số lượng

Liên hệ QC

Ducminhpro

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
30/7/20
Bài viết
15
Được thích
3
Xin chào mọi người !
Tôi có 1 file quản lý hàng hóa trong công ty. do có nhiều tên hàng trùng tên với nhiều giá. nên tôi cần thống kê ra tên hàng nào trùng tên hàng và trúng đơn giá thì cộng dồn số lượng lại với nhau. Tên hàng không phân biệt chử HOa với chữ Thường ( bánh bao với BÁNH BAO cũng là 1 tên ) Tôi xin cảm ơn !

1596764848587.png
 

File đính kèm

  • Loc trung.xlsb
    9.8 KB · Đọc: 26
Xin chào mọi người !
Tôi có 1 file quản lý hàng hóa trong công ty. do có nhiều tên hàng trùng tên với nhiều giá. nên tôi cần thống kê ra tên hàng nào trùng tên hàng và trúng đơn giá thì cộng dồn số lượng lại với nhau. Tên hàng không phân biệt chử HOa với chữ Thường ( bánh bao với BÁNH BAO cũng là 1 tên ) Tôi xin cảm ơn !

View attachment 242583
Dùng Scripting.Dictionary
 
Upvote 0
Xin chào mọi người !
Tôi có 1 file quản lý hàng hóa trong công ty. do có nhiều tên hàng trùng tên với nhiều giá. nên tôi cần thống kê ra tên hàng nào trùng tên hàng và trúng đơn giá thì cộng dồn số lượng lại với nhau. Tên hàng không phân biệt chử HOa với chữ Thường ( bánh bao với BÁNH BAO cũng là 1 tên ) Tôi xin cảm ơn !

View attachment 242583
Bạn thử code.Cái kết quả của bạn đưa ra có vấn đề.
Mã:
Sub laygiatri()
    Dim arr, kq, i As Long, lr As Long, dic As Object, dk As String, a As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("sheet1")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         arr = .Range("A4:C" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 3)
         For i = 1 To UBound(arr)
           If Len(arr(i, 1)) > 0 Then
             dk = UCase(arr(i, 1)) & "#" & arr(i, 3)
             If Not dic.exists(dk) Then
                a = a + 1
                dic.Add dk, a
                kq(a, 1) = arr(i, 1)
                kq(a, 2) = arr(i, 2)
                kq(a, 3) = arr(i, 3)
             Else
                kq(dic.Item(dk), 2) = kq(dic.Item(dk), 2) + arr(i, 2)
             End If
           End If
         Next i
         .Range("F4:H1000").ClearContents
         .Range("F4:H4").Resize(a).Value = kq
   End With
End Sub
 
Upvote 0
Xin chào mọi người !
Tôi có 1 file quản lý hàng hóa trong công ty. do có nhiều tên hàng trùng tên với nhiều giá. nên tôi cần thống kê ra tên hàng nào trùng tên hàng và trúng đơn giá thì cộng dồn số lượng lại với nhau. Tên hàng không phân biệt chử HOa với chữ Thường ( bánh bao với BÁNH BAO cũng là 1 tên ) Tôi xin cảm ơn !
Sao sinh tố A12,A13,A14 cùng giá 30000 không gộp chung là:

Sinh tố 3.5 30000

mà là:

Sinh tố 1.5 30000
Sinh tố 2 30000 ???
 
Upvote 0
Chậm chân tí nhưng thôi, cứ đưa lên
PHP:
Sub loc()

Dim dic1 As Object
Dim i As Long, EndR As Long, k As Long
Dim arr, tmparr
Dim key As String

Range("F4:H500").ClearContents
EndR = Range("A" & Rows.Count).End(xlUp).Row
tmparr = Range("A4:C" & EndR).Value
Set dic1 = CreateObject("Scripting.Dictionary")
ReDim arr(1 To UBound(tmparr), 1 To 3)

For i = 1 To UBound(tmparr)
    key = tmparr(i, 1) & "-" & tmparr(i, 3)
    If Not IsEmpty(tmparr(i, 1)) And Not dic1.exists(key) Then
        k = k + 1
        dic1.Add tmparr(i, 1) & "-" & tmparr(i, 3), k
        arr(k, 1) = tmparr(i, 1)
        arr(k, 2) = tmparr(i, 2)
        arr(k, 3) = tmparr(i, 3)
    Else
        If Not IsEmpty(tmparr(i, 1)) Then
            arr(dic1.Item(key), 2) = arr(dic1.Item(key), 2) + tmparr(i, 2)
        End If
    End If
Next

If k > 0 Then
    Range("F4").Resize(k, 3).Value = arr
End If

Set dic1 = Nothing

End Sub
 
Upvote 0
Thử một nhát. Lòi ra liền. :p:p:p
 
Upvote 0
Chào bạn, tôi dựa vào code của bạn chỉnh sửa để áp dụng vào file tôi đang làm nhưng khi chạy code thì lại lọc thiếu, xin bạn sủa lại giúp tôi.
Mã:
Sub laygiatri()
    Dim arr, kq, i As Long, lr As Long, dic As Object, dk As String, a As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Trang_tính2")
         lr = .Range("k" & Rows.Count).End(xlUp).Row
         arr = .Range("k5:P" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 6)
         For i = 1 To UBound(arr)
           If Len(arr(i, 1)) > 0 Then
             dk = UCase(arr(i, 1)) & "#" & arr(i, 3)
             If Not dic.exists(dk) Then
                a = a + 1
                dic.Add dk, a
                kq(a, 1) = a
                kq(a, 2) = arr(i, 1)
                kq(a, 3) = arr(i, 3)
                kq(a, 4) = arr(i, 4)
                kq(a, 5) = arr(i, 5)
                kq(a, 6) = arr(i, 6)
             Else
                kq(dic.Item(dk), 5) = kq(dic.Item(dk), 5) + arr(i, 5)
                kq(dic.Item(dk), 6) = kq(dic.Item(dk), 6) + arr(i, 6)
             End If
           End If
         Next i
         End With
         With Sheets("Trang_tính1")
         .Range("E4:j1000").ClearContents
         .Range("E4:j4").Resize(a).Value = kq
   End With
End Sub
Bạn thử code này nhé. code này sửa từ các code trên
 
Upvote 0
Chào bạn, tôi dựa vào code của bạn chỉnh sửa để áp dụng vào file tôi đang làm nhưng khi chạy code thì lại lọc thiếu, xin bạn sủa lại giúp tôi.
1- Sau này có hỏi gì thì cứ đưa file người thật việc thật lên đây. Nếu ngại thì giả lập data nhưng cấu trúc thì phải y thật. (Làm đã thèm rồi đem về dùng chẳng được vì ví dụ 1 nơi, dữ liệu thật 1 nẻo. Code thì không biết, lại phải đem lên nhờ tiếp)
2- Vùng kết quả để đổ cái mảng lên thì bạn lại ẩn đi 1 cột, làm sao kết quả nó ra trúng được?
3- Xóa cột G ẩn đó đi rồi dùng code của bài #12 để chạy.
4- Muốn rèn code thì so sánh sub Loc với sub laygiatri của #12 để biết Loc sai chỗ nào.
 
Lần chỉnh sửa cuối:
Upvote 0
Tức là cột đơn vị tính ra cột đơn giá, bạn xem file giúp tôi
Bài đã được tự động gộp:


Cảm ơn bạn, tôi sẽ rút kinh nghiệm.
Bài đã được tự động gộp:


Xin lỗi, phải là lệch 1 cột
Bạn Thử chạy lại sub này
Mã:
Sub ABC()
    Dim arr, kq, i As Long, lr As Long, dic As Object, dk As String, a As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Trang_tính2")
         lr = .Range("k" & Rows.Count).End(xlUp).Row
         arr = .Range("k5:P" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 7)
         For i = 1 To UBound(arr)
           If Len(arr(i, 1)) > 0 Then
             dk = UCase(arr(i, 1)) & "#" & arr(i, 3)
             If Not dic.exists(dk) Then
                a = a + 1
                dic.Add dk, a
                kq(a, 1) = a
                kq(a, 2) = arr(i, 1)
                kq(a, 3) = arr(i, 2)
                kq(a, 4) = arr(i, 3)
                kq(a, 5) = arr(i, 4)
                kq(a, 6) = arr(i, 5)
                kq(a, 7) = arr(i, 6)
             Else
                kq(dic.Item(dk), 6) = kq(dic.Item(dk), 6) + arr(i, 5)
                kq(dic.Item(dk), 7) = kq(dic.Item(dk), 7) + arr(i, 6)
             End If
           End If
         Next i
         End With
         With Sheets("Trang_tính1")
         .Range("E4:k1000").ClearContents
         .Range("E4:k4").Resize(a).Value = kq
   End With
End Sub
 
Upvote 0
Tôi có 1 file quản lý hàng hóa trong công ty. do có nhiều tên hàng trùng tên với nhiều giá. nên tôi cần thống kê ra tên hàng nào trùng tên hàng và trúng đơn giá thì cộng dồn số lượng lại với nhau. Tên hàng không phân biệt chử HOa với chữ Thường ( bánh bao với BÁNH BAO cũng là 1 tên ) Tôi xin cảm ơn !
Bạn có thể xài hàm DSUM() nhờ VBA theo các bước sau:
1./ Đổi cột [Đơn giá] & [Số lượng]
2./ Tạo danh sách duy nhất ở cả 2 cột [Tên hàng] & [đơn giá]
3./ Xài DSUM cho từng dòng duy nhất
& chúc bạn thành công!

Minh hoạt bỡi công thức:

BẢNG DỮ LIỆU A4:A1000KẾT QUẢ
Tên hàngĐơn giáSLTên hàngĐơn giáTổng SL
bánh bao
25,000​
1​
bánh bao
25,000​
11.7​
=DSUM(A3:C25,C3,A3:B4)
bánh bao
25,000​
9​
bánh bao
30,000​
bánh bao
25,000​
1.7​
hủ tiếu
20,000​
bánh bao
30,000​
1​
bánh bao
40,000​
hủ tiếu
20,000​
2​
hủ tiếu
20,000​
2​
Sinh tố
30,000​
bánh bao
40,000​
3​
Bánh bò
20,000​
hủ tiếu
50,000​
Sinh tố
30,000​
0.5​
Sinh tố
30,000​
1​
Sinh tố
30,000​
2​
Bánh bò
20,000​
1​
Bánh bò
20,000​
1​
Bánh bò
20,000​
1​
hủ tiếu
50,000​
1​
 
Lần chỉnh sửa cuối:
Upvote 0
Mình có 1 cách làm thế này khá hay ko cần VBA nhé. Mỗi lần bạn nhập vào bảng dữ liệu về tên hàng (kể cả tên hàng mới or cũ), SL (tùy ý), Đơn giá( tùy ý). Tất cả nó sẽ tự động cập nhật Tên Hàng (mới or cũ), và tính tổng số sản phẩm (mới or cũ) và kể cả đơn giá (mới or cũ) bên bảng Kết Qủa, bạn ko cần điền 1 cái gì bên bảng Kết Qủa luôn tất cả Auto.
B1: Bạn INSERT thêm 1 cột E
B2: Đặt công thức ở ô D4 là: =IF(IF(A4<>"",COUNTIFS($A$3:A4,"="&A4,$C$3:C4,"="&C4),0)=1,1,0) rồi kéo xuống dưới.
B3: Đặt công thức ở ô E4 là:=D4+E3 rồi kéo công thức xuống dưới
B4: Làm thêm cột STT ở cột F: và đánh số thứ trự từ 1 đến n ở cột số STT này.
B5: Đặt công thức ở ô G4 (Cột "Tên Hàng") là: =IFERROR(INDEX($A$4:$C$25,MATCH(F4,$E$4:$E$25,0),1),"") rồi kéo xuống dưới.
B6: Đặt công thức ở ô H4 (Cột "SL") là: =IF(G4="","",SUMIFS($B$4:$B$25,$A$4:$A$25,"="&G4,$C$4:$C$25,"="&I4)) rồi kéo xuống dưới.
B7: Đặt công thức ở ô I4 (Cột "Đơn Giá") là: =IFERROR(INDEX($A$4:$C$25,MATCH(F4,$E$4:$E$25,0),3),"") rồi kéo xuống dưới.

Mình có đính kèm file bên dưới đã làm công thức tự động. Các bạn ẩn các cột D và cột E đi cho đẹp
1598457417441.png
 

File đính kèm

  • Loc trung.xlsb
    11.6 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Mình có 1 cách làm thế này khá hay ko cần VBA nhé. Mỗi lần bạn nhập vào bảng dữ liệu về tên hàng (kể cả tên hàng mới or cũ), SL (tùy ý), Đơn giá( tùy ý). Tất cả nó sẽ tự động cập nhật Tên Hàng (mới or cũ), và tính tổng số sản phẩm (mới or cũ) và kể cả đơn giá (mới or cũ) bên bảng Kết Qủa, bạn ko cần điền 1 cái gì bên bảng Kết Qủa luôn tất cả Auto.
B1: Bạn INSERT thêm 1 cột E
B2: Đặt công thức ở ô D4 là: =IF(IF(A4<>"",COUNTIFS($A$3:A4,"="&A4,$C$3:C4,"="&C4),0)=1,1,0) rồi kéo xuống dưới.
B3: Đặt công thức ở ô E4 là:=D4+E3 rồi kéo công thức xuống dưới
B4: Làm thêm cột STT ở cột F: và đánh số thứ trự từ 1 đến n ở cột số STT này.
B5: Đặt công thức ở ô G4 (Cột "Tên Hàng") là: =IFERROR(INDEX($A$4:$C$25,MATCH(F4,$E$4:$E$25,0),1),"") rồi kéo xuống dưới.
B6: Đặt công thức ở ô H4 (Cột "SL") là: =IF(G4="","",SUMIFS($B$4:$B$25,$A$4:$A$25,"="&G4,$C$4:$C$25,"="&I4)) rồi kéo xuống dưới.
B7: Đặt công thức ở ô I4 (Cột "Đơn Giá") là: =IFERROR(INDEX($A$4:$C$25,MATCH(F4,$E$4:$E$25,0),3),"") rồi kéo xuống dưới.

Mình có đính kèm file bên dưới đã làm công thức tự động. Các bạn ẩn các cột D và cột E đi cho đẹp
View attachment 244171
Từ đầu tới giờ sao tôi chưa thấy thành viên nào dùng Pivot cho bài này nhỉ?
 
Upvote 0
Từ đầu tới giờ sao tôi chưa thấy thành viên nào dùng Pivot cho bài này nhỉ?
Tại vì người ta biết thớt này. Hỏi gì trả lời nấy. Hỏi VBA thì trả lời VBA. Trả lời kiểu khác sẽ bị mắng.
Mãi đến bài #19 thì tác giả (bà #19)i này gan cùng mình mới dám thử 'không VBA'.
 
Upvote 0
Tôi cũng không thích dùng pivotable. Xài cái gì mà mình không điều khiển được nó thì không hay lắm.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom