Bài toán tìm kiếm nhiều điều kiện, khó.

Liên hệ QC

Phamanh1998

Thành viên thường trực
Tham gia
12/6/20
Bài viết
267
Được thích
41
Giới tính
Nữ
Em chào Anh/Chị. Em có bài toán sau không biết rằng với việc sử dụng Công thức hàm Excel có ra được đáp án hay không nên mong Anh/Chị giúp đỡ em ạ.

Em có sheet danh mục dữ liệu thô bao gồm: Thời gian, Số vận đơn, Mã khách hàng, Tên khách hàng, tên vật dụng lưu chuyển, số lượng. Mỗi khách hàng có mã vận đơn riêng biệt.
Em mong muốn khi em đánh điều kiện tại ba cell bao gồm: J1, L1, J2 thì sẽ cho ra bảng kết quả ạ. Em mong anh chị giúp đỡ. em chân thành cảm ơn Anh/Chị
 

File đính kèm

Mấy chục bài đã nói là lọc nhiều điều kiện thì cứ index + aggregate mà làm rồi mà. Chưa ngấm được tí tẹo nào à bé?

Chưa rõ J2 để làm gì luôn. @@

View attachment 280181
Dạ cái khó của bài này em không làm ra được là chỗ J2 ạ. Ý nghĩa ô đó là số lần phát sinh mã vận đơncủa khách hàng. Ví dụ em đánh từ ngày 1 đến 6 và J2=3 thì chỉ hiện ra những khách hàng phát sinh >= 3 mã vận đơn trở lên ạ, những khách hàng chỉ mới có 1, 2 mã vận đơn thì sẽ không được đưa vào. Anh xem giúp em ạ
 
Ý làm sao thì phải viết ra, nói ra thì người khác mới biết.
Chứ có ai chui vào não mình được mà biết.
Dạ bài này em nghĩ các kiểu rồi mà không có hướng anh ạ, anh xem giúp em. Ví dụ như file anh gửi, em đánh số 9 vào ô J2 thì đúng ra sẽ không ra kết quả vì chưa khách hàng nào phát sinh tổng mã vận đơn >= 9.
 
Dạ bài này em nghĩ các kiểu rồi mà không có hướng anh ạ, anh xem giúp em. Ví dụ như file anh gửi, em đánh số 9 vào ô J2 thì đúng ra sẽ không ra kết quả vì chưa khách hàng nào phát sinh tổng mã vận đơn >= 9.
Bạn không xem bài #4 của anh befaint hay là kết quả chưa đúng ý bạn???
 
Dạ bài này em nghĩ các kiểu rồi mà không có hướng anh ạ, anh xem giúp em. Ví dụ như file anh gửi, em đánh số 9 vào ô J2 thì đúng ra sẽ không ra kết quả vì chưa khách hàng nào phát sinh tổng mã vận đơn >= 9.
Bài này thêm một cột phụ đếm số vận đơn theo điều kiện. Rồi pivot table:
 

File đính kèm

Bài này thêm một cột phụ đếm số vận đơn theo điều kiện. Rồi pivot table:
Thêm cột phụ là phương án đúng, nhưng phải đếm tổng số vận đơn (loại bỏ trùng lắp) theo từng khách, và chỉ trong khoảng thời gian mà thớt yêu cầu.

Thân
 
Thêm cột phụ là phương án đúng, nhưng phải đếm tổng số vận đơn (loại bỏ trùng lắp) theo từng khách, và chỉ trong khoảng thời gian mà thớt yêu cầu.

Thân
Em thấy cột phụ em đã đếm theo 3 điều kiện rồi. Và có sẵn filter thời gian cho bạn ấy chọn ngày nữa. Chỉ cần chọn thời gian và vận đơn chỗ filter là đúng ý bạn ấy mà? Em có hiểu sai đề không nhỉ?
 
Em thấy cột phụ em đã đếm theo 3 điều kiện rồi. Và có sẵn filter thời gian cho bạn ấy chọn ngày nữa. Chỉ cần chọn thời gian và vận đơn chỗ filter là đúng ý bạn ấy mà? Em có hiểu sai đề không nhỉ?
Đại khái như công thức đếm trong file kèm (đã điều chỉnh lại ngày làm ví dụ).

Rồi tiếp tục xây dựng công thức cho bảng kê chi tiết như thớt yêu cầu.

Thân
/-*+//-*+//-*+/
(Gửi nhầm file mới gửi lại file)
 

File đính kèm

Lần chỉnh sửa cuối:
Em thấy cột phụ em đã đếm theo 3 điều kiện rồi. Và có sẵn filter thời gian cho bạn ấy chọn ngày nữa. Chỉ cần chọn thời gian và vận đơn chỗ filter là đúng ý bạn ấy mà? Em có hiểu sai đề không nhỉ?
Em chào Anh/Chị. Bài toàn trên có thể do cách diễn đạt của em khiến Anh Nhattanktnn hiểu nhầm. Em xin phép diễn giải lại ạ. Em mong được Anh/Chị hỗ trợ ạ. Em chân thành cảm ơn Anh/Chị.

Kết quả mong muốn của em là khi chọn xong khoảng thời gian , sau đó chọn đến tổng số mã vận đơn đã phát sinh thì sẽ chỉ hiện ra danh sách bên dưới là các khách hàng đã có tổng số mã vận đơn (loại bỏ trùng) >= yêu cầu.

VD: Khi Chọn J2 =3 --> Chỉ hiện ra danh sách khách hàng đã phát sinh tổng mã vận đơn >=3 trong khoảng thời gian đã chọn (em minh họa hình ảnh bên dưới)
1661220694154.png

Nếu điều chỉnh lại J2=6 --> Chỉ hiện ra danh sách khách hàng đã phát sinh tổng mã vận đơn >=3 trong khoảng thời gian đã chọn và theo ví dụ trên thì sẽ không hiện ra ra vì chưa có khách hàng nào có tổng số mã vận đơn chi tiết >=6. (Hình ảnh minh họa đính kèm)

1661220671600.png

Nếu điều chỉnh J2=1 --> Hiện ra toàn bộ khách hàng đã phát sinh và có tổng mã vận đơn >=1 (hình ảnh minh họa đính kèm)
1661220638854.png
 

File đính kèm

  • 1661220441104.png
    1661220441104.png
    151.8 KB · Đọc: 9
Kết quả mong muốn của em là khi chọn xong khoảng thời gian , sau đó chọn đến tổng số mã vận đơn đã phát sinh thì sẽ chỉ hiện ra danh sách bên dưới là các khách hàng đã có tổng số mã vận đơn (loại bỏ trùng) >= yêu cầu.
Bạn xem file. . .
 

File đính kèm

Một cách khác dùng VBA.
Bạn nhập điều kiện vào 3 ô J1,J2 và L1 kết quả sẽ tự động thay đổi
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lr&, i&, j&, k&, m&, ub&, rng, arr(), id As String
Dim dic As Object
Set dic = CreateObject("Scripting.dictionary")
If Intersect(Target, Union(Range("J1:J2"), Range("L1"))) Is Nothing Then Exit Sub
lr = Cells(Rows.Count, "A").End(xlUp).Row
rng = Range("A2:F" & lr).Value2
ReDim arr(1 To lr, 1 To 20) ' gia su toi da co 20 mat hang
For i = 1 To lr - 1
    id = rng(i, 3) & "|" & rng(i, 2)
    If rng(i, 1) >= Range("J1").Value2 And rng(i, 1) <= Range("L1").Value2 Then
        If Not dic.exists(id) Then
            k = k + 1: ub = 7
            arr(k, 1) = 1: arr(k, 2) = rng(i, 3): arr(k, 3) = rng(i, 4): arr(k, 4) = rng(i, 2)
            arr(k, 5) = 1: arr(k, 6) = rng(i, 6): arr(k, 7) = rng(i, 5)
            dic.Add id, arr
        Else
            ub = ub + 1
            For j = 1 To k
                If id = arr(j, 2) & "|" & arr(j, 4) Then
                    arr(j, 5) = arr(j, 5) + 1
                    arr(j, 6) = arr(j, 6) + rng(i, 6)
                    arr(j, ub) = rng(i, 5)
                    Exit For
                End If
            Next
        End If
    End If
Next
Range("H6:AG10000").ClearContents ' vung H:AG cho toi da 20 mat hang. dieu chinh lai vung cho phu hop
Range("H6:AG10000").ClearFormats
Range("H6").Resize(k, 20).Value = arr
Range("H6").Resize(k, 1).Formula = "=COUNTIF($J$5:$J$16,J6)"
For i = k + 5 To 6 Step -1
    With Range("H" & i)
        If .Value < Range("J2").Value Then .Resize(1, 20).Delete xlUp
    End With
Next
lr = Cells(Rows.Count, "H").End(xlUp).Row
If lr = 5 Then
    MsgBox "Khong co"
    Exit Sub
End If
With Range("H6:H" & lr)
    .Formula = "=COUNTIF($J$6:$J6,J6)"
    .Value = .Value
    .Resize(lr - 5, 26).Sort key1:=Range("I5"), key2:=Range("H5") '26 tuong ung voi 20 mat hang.
    .Resize(lr - 5, 26).Borders.LineStyle = xlDot
End With
End Sub
 

File đính kèm

Web KT

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

Back
Top Bottom