lọc danh sách và số lần xuất hiện có điều kiện

Liên hệ QC

mraleno

Thành viên chính thức
Tham gia
1/12/09
Bài viết
68
Được thích
18
em có 1 danh sách như hình dưới.
bình thường nếu cột "ma sp" chỉ có 1 mã thì em có thể sử dụng pivot table để lọc và tính số lần xuất hiện.
Nhưng rắc rối ở đây là 1 ô có nhiều mã sp cách nhau bởi dấu ",". EM KHÔNG NGHĨ RA CÁCH NÀO tự động hết mà tách ra rồi ghép lại thành một cột để đếm.
Do số lượng dât rất nhiều và làm hàng ngày nên các anh chị có cách nào làm tựđộngđược không .
em xin cảm ơn
1590568367552.png
 

File đính kèm

  • TEMPLATE.xlsx
    9.6 KB · Đọc: 10
Lưu ý: Không có sự đồng nhất giữa 2 mã sp, lúc thì có khoảng trắng bên trong, lúc thì không: MS12 và MS 12,
Cần sửa lại cho thống nhất theo 1 cách thôi.
Dùng cái này:
Mã:
=SUMPRODUCT(($B$2:$B$13=$F$4)*ISNUMBER(SEARCH(F5&",",$C$2:$C$13&",")))
 
Hic. Yêu cầu đầu tiên cần tạo ra danh sách ở cột F đã rồi mới đi đếm số lượng mà. :p
 
Hic. Yêu cầu đầu tiên cần tạo ra danh sách ở cột F đã rồi mới đi đếm số lượng mà. :p
Thì copy cột ấy rồi delete duplicates cũng được.

Đối với tôi thì có một số kỹ thuật làm tay, nhưng thấy ý của thớt thì muốn tự động - mà tự động thì chỉ có "bấm nút"
 
Chắc phải có đăng ký mã SP rồi mới nhập dữ liệu ở bảng bên trái chứ.
Em cũng đoán là có nhưng chắc bạn ấy muốn tạo ra danh sách từ dữ liệu đã có.

"bình thường nếu cột "ma sp" chỉ có 1 mã thì em có thể sử dụng pivot table để lọc.."
 
em có 1 danh sách như hình dưới.
bình thường nếu cột "ma sp" chỉ có 1 mã thì em có thể sử dụng pivot table để lọc và tính số lần xuất hiện.
Nhưng rắc rối ở đây là 1 ô có nhiều mã sp cách nhau bởi dấu ",". EM KHÔNG NGHĨ RA CÁCH NÀO tự động hết mà tách ra rồi ghép lại thành một cột để đếm.
Do số lượng dât rất nhiều và làm hàng ngày nên các anh chị có cách nào làm tựđộngđược không .
em xin cảm ơn
View attachment 238145
Thử dùng cột phụ tách trước rồi lọc sau
Cột phụ từ E2:K13
Mã:
E2=SUBSTITUTE(MID(SUBSTITUTE(","&$C2,",",REPT(" ",500)),COLUMN(A1)*500,500)," ","")
Lọc loại trùng theo điều kiện, điều kiện tại C18
Mã:
C19=IFERROR(INDIRECT(TEXT(AGGREGATE(15,6,(COLUMN($E$2:$K$2)+ROW($E$2:$E$13)*10^5)/($E$2:$K$13<>"")/(COUNTIF(C$18:C18,$E$2:$K$13)=0)/($B$2:$B$13=$C$18),1),"R00000C00000"),),"")
Công thức đếm
Mã:
D19=COUNT(INDEX(1/($B$2:$B$13=$C$18)/($C19=$E$2:$K$13),))
 

File đính kèm

  • TEMPLATE.xlsx
    10.2 KB · Đọc: 15
Không biết có khi nào Microsoft theo Google không nhỉ? :)

View attachment 238152
Theo tôi thì MS không nên.
Client base của Excel là những người chuyên về dữ liệu quản lý (management information). Những người chuyên quản lý và không cần biết nhiều về các hàm khủng và coding. Họ có một mẫu mã bảng dữ liệu truyền thống.
Của Google Sheets là nhưng người chuyên quản lý dữ liệu (information managers). Những người này thì dữ liệu như thế nào họ cũng sử lý được, không cần, và thường thì bất chấp truyền thống.
 
em có 1 danh sách như hình dưới.
bình thường nếu cột "ma sp" chỉ có 1 mã thì em có thể sử dụng pivot table để lọc và tính số lần xuất hiện.
Nhưng rắc rối ở đây là 1 ô có nhiều mã sp cách nhau bởi dấu ",". EM KHÔNG NGHĨ RA CÁCH NÀO tự động hết mà tách ra rồi ghép lại thành một cột để đếm.
Do số lượng dât rất nhiều và làm hàng ngày nên các anh chị có cách nào làm tựđộngđược không .
em xin cảm ơn
View attachment 238145
Bạn dùng đoạn VBA này xem. Lưu ý: tại cell O1 bạn nhập thông tin Client muốn đếm Mã SP (VD: Client A), kết quả cuối cùng được ghi ở O2: Pxx
Mã:
Sub AutoCountClient()
Dim R1 As Range, R2 As Range
Dim NRw As Long, NCln As Long, Sp1 As Long, Sp2 As Long, i As Long, j As Long
  
    'Vung chua cac Ma SP
    Set R1 = Range("C2:C" & Range("C1000000").End(xlUp).Row)
  
    'Dem so dong cua vung
    NRw = R1.Rows.Count
  
    'Xoa du lieu ket qua cu
    Range("O2:P500").ClearContents
  
    ReDim Arr(1 To NRw, 1 To 100)
  
    'Tach cac Ma SP tung dong duoc phan cach boi dau phay (,)
    For Each R2 In R1
        i = i + 1
        For Sp1 = 1 To Len(R2.Value)
            If Mid(R2, Sp1, 1) = "," Then
                j = j + 1
                Arr(i, j) = Trim(Mid(R2, Sp2 + 1, Sp1 - Sp2 - 1))
                Sp2 = Sp1
            ElseIf Sp1 = Len(R2) Then
                j = j + 1
                Arr(i, j) = Trim(Mid(R2, Sp2 + 1, Sp1 - Sp2))
            End If
        Next Sp1
        If NCln < j Then NCln = j
        Sp1 = 0: Sp2 = 0: j = 0
    Next
  
    'Ghi ket qua Ma SP da tach
    Range("D2").Resize(NRw, NCln).Value = Arr
  
    Dim Dic1 As Object, irow As Long, icln As Long, k As Long
    Dim Arr2() As Variant, TmpArr As Variant
  
    Set Dic1 = CreateObject("Scripting.Dictionary")
    
    'Chep ket qua Ma SP vao mang trung gian
    TmpArr = Range(Cells(2, 4), Cells(NRw + 1, NCln + 3)).Value
  
    ReDim Arr2(1 To 100, 1 To 2)
  
    'Dem so luong Ma SP theo thong tin Client cell O1
    For irow = 1 To UBound(TmpArr, 1)
      
        If Cells(irow + 1, 2) = Range("O1") Then
      
        For icln = 1 To NCln
      
                If Not IsEmpty(TmpArr(irow, icln)) And Not Dic1.Exists(TmpArr(irow, icln)) Then
                    k = k + 1
                    Dic1.Add TmpArr(irow, icln), k
                    Arr2(k, 1) = TmpArr(irow, icln)
                    Arr2(k, 2) = 1
                Else
                    On Error Resume Next
                    Arr2(Dic1.Item(TmpArr(irow, icln)), 2) = Arr2(Dic1.Item(TmpArr(irow, icln)), 2) + 1
                    On Error GoTo 0
                End If
      
        Next icln
  
        End If
  
    Next irow
  
    'Ghi ket qua cuoi cung vao cell O2
    Range("O2").Resize(k, 2).Value = Arr2

End Sub
 
Lần chỉnh sửa cuối:
em có 1 danh sách như hình dưới.
bình thường nếu cột "ma sp" chỉ có 1 mã thì em có thể sử dụng pivot table để lọc và tính số lần xuất hiện.
Nhưng rắc rối ở đây là 1 ô có nhiều mã sp cách nhau bởi dấu ",". EM KHÔNG NGHĨ RA CÁCH NÀO tự động hết mà tách ra rồi ghép lại thành một cột để đếm.
Do số lượng dât rất nhiều và làm hàng ngày nên các anh chị có cách nào làm tựđộngđược không .
em xin cảm ơn
Thử sử dụng File:
Copy dữ liệu vào sheet1 rồi sang sheet2 nhấn nút, nó xóa dữ liệu cũ và tách ra dữ liệu mới.
Sau khi chạy code xong thì sử dụng PivotTable để tại sheet mới và tổng hợp.
Lưu ý: Việc nhập liệu không đồng nhất dẫn đến việc tổng hợp sẽ sai, ví dụ:
- Mã sản phẩm MS11 lúc có khoảng trắng lúc thì không.
 

File đính kèm

  • Tách dòng bởi dấu phẩy.xlsm
    23 KB · Đọc: 2
Lần chỉnh sửa cuối:
Nếu dữ liệu nhiều thì có thể dùng Power Query để xử lý rất nhanh
1590636143146.png
 

File đính kèm

  • TEMPLATE (1).xlsx
    184.7 KB · Đọc: 9
Thử dùng cột phụ tách trước rồi lọc sau
Cột phụ từ E2:K13
Mã:
E2=SUBSTITUTE(MID(SUBSTITUTE(","&$C2,",",REPT(" ",500)),COLUMN(A1)*500,500)," ","")
Lọc loại trùng theo điều kiện, điều kiện tại C18
Mã:
C19=IFERROR(INDIRECT(TEXT(AGGREGATE(15,6,(COLUMN($E$2:$K$2)+ROW($E$2:$E$13)*10^5)/($E$2:$K$13<>"")/(COUNTIF(C$18:C18,$E$2:$K$13)=0)/($B$2:$B$13=$C$18),1),"R00000C00000"),),"")
Công thức đếm
Mã:
D19=COUNT(INDEX(1/($B$2:$B$13=$C$18)/($C19=$E$2:$K$13),))
có vẻ như cách của bạn ổn nhất. Mình cảm ơn nhiều nha. để mình áp dụng xem sao
 
Web KT
Back
Top Bottom