Liệt kê danh sách khách hàng và số lượng

saobekhonglac

Thành viên mới
Tham gia ngày
1 Tháng mười một 2008
Bài viết
1,493
Được thích
1,389
Điểm
860
Nơi ở
Long An - HCM
Chào Anh, Chị.

Nhờ Anh, Chị giúp hàm hoặc vba liệt kê danh sách khách hàng và số lượng theo thông tin như bên dưới:

Sheet "Chi tiet dat hang" từ cột A đến H thể hiện thông tin chi tiết đơn hàng của từng MSKH theo Mã SP và Số kg, Ngày đặt,... Tại J3 Em muốn liệt kê danh sách Mã SP chỉ phát sinh từ ngày tại L2 đến ngày tại R2 (công thức Em đang dùng là liệt kê hết danh sách Mã SP,

Sheet "Tong hop dat hang" sẽ là bảng tổng hợp đặt theo ngày và theo Mã SP. Tại cột H mình muốn lọc ra danh sách MSKH và số kg của từng MSKH đặt (đã điền kết quả theo mẫu, điều kiện theo ngày đặt, Mã SP)

Ví dụ như file đính kèm. Mã SP 3004 có 2 MSKH đặt với tổng là 52,900 kg, thì cột H sẽ liệt kê ra MSKH và số kg của từng MSKH (trường hợp số Kg ít hoặc nhiều hơn so với sheet "Chi tiet dat hang" thì vẫn liệt kê MSKH và số kg theo sheet "Chi tiet dat hang").

Cám ơn Anh, Chị.
 

File đính kèm

Lần chỉnh sửa cuối:

excel_lv1.5

Thành viên tích cực
Tham gia ngày
20 Tháng mười 2017
Bài viết
805
Được thích
1,399
Điểm
360
Chào Anh, Chị.

Nhờ Anh, Chị giúp hàm hoặc vba liệt kê danh sách khách hàng và số lượng theo thông tin như bên dưới:

Sheet "Chi tiet dat hang" từ cột A đến H thể hiện thông tin chi tiết đơn hàng của từng MSKH theo Mã SP và Số kg, Ngày đặt,... Tại J3 Em muốn liệt kê danh sách Mã SP chỉ phát sinh từ ngày tại L2 đến ngày tại R2 (công thức Em đang dùng là liệt kê hết danh sách Mã SP,

Sheet "Tong hop dat hang" sẽ là bảng tổng hợp đặt theo ngày và theo Mã SP. Tại cột H mình muốn lọc ra danh sách MSKH và số kg của từng MSKH đặt (đã điền kết quả theo mẫu, điều kiện theo ngày đặt, Mã SP)

Ví dụ như file đính kèm. Mã SP 3004 có 2 MSKH đặt với tổng là 52,900 kg, thì cột H sẽ liệt kê ra MSKH và số kg của từng MSKH (trường hợp số Kg ít hoặc nhiều hơn so với sheet "Chi tiet dat hang" thì vẫn liệt kê MSKH và số kg theo sheet "Chi tiet dat hang").

Cám ơn Anh, Chị.
Dùng power pivot nhe bạn
 

File đính kèm

saobekhonglac

Thành viên mới
Tham gia ngày
1 Tháng mười một 2008
Bài viết
1,493
Được thích
1,389
Điểm
860
Nơi ở
Long An - HCM
Bạn dùng pivot được thì cần gì VBA với hàm, mà bạn dùng pivot thường hay power pivot, vì pivot thường không thể CONCATENATE danh sách khách hàng được
Dữ liệu lũy kế nên càng ngày càng nhiều, nên mình cần hàm hay vba thì sẽ tiện hơn
 

excel_lv1.5

Thành viên tích cực
Tham gia ngày
20 Tháng mười 2017
Bài viết
805
Được thích
1,399
Điểm
360
Dữ liệu lũy kế nên càng ngày càng nhiều, nên mình cần hàm hay vba thì sẽ tiện hơn
Tại bạn thích VBA và hàm nên bạn chưa thấy những cái khác, power pivot là một trong những tool BI , nó có thể xử lý 50 triệu dòng file data 2GB , dữ liệu chuẩn chỉ việc kéo thả không cần coding cực như hàm hay VBA đâu bạn ạ
 

saobekhonglac

Thành viên mới
Tham gia ngày
1 Tháng mười một 2008
Bài viết
1,493
Được thích
1,389
Điểm
860
Nơi ở
Long An - HCM
Tại bạn thích VBA và hàm nên bạn chưa thấy những cái khác, power pivot là một trong những tool BI , nó có thể xử lý 50 triệu dòng file data 2GB , dữ liệu chuẩn chỉ việc kéo thả không cần coding cực như hàm hay VBA đâu bạn ạ
Mình thích sử dụng hàm hay vba hơn thuận tiện trong các báo cáo. Cám ơn bạn.
 

hocexcel_1991

Bắt đầu học Excel
Tham gia ngày
9 Tháng bảy 2018
Bài viết
515
Được thích
918
Điểm
360
Nơi ở
Từ Sơn, Bắc Ninh
Mình thích sử dụng hàm hay vba hơn thuận tiện trong các báo cáo. Cám ơn bạn.
Thử dùng hàm JoinText xem
Mã:
A2=INDEX('Chi tiet dat hang'!A$2:A$60,AGGREGATE(15,6,ROW($1:$60)/(MATCH('Chi tiet dat hang'!$A$2:$A$60&'Chi tiet dat hang'!$C$2:$C$60,'Chi tiet dat hang'!$A$2:$A$60&'Chi tiet dat hang'!$C$2:$C$60,0)=ROW($1:$60)),ROW(A1)))
C2=INDEX('Chi tiet dat hang'!C$2:C$60,AGGREGATE(15,6,ROW($1:$60)/(MATCH('Chi tiet dat hang'!$A$2:$A$60&'Chi tiet dat hang'!$C$2:$C$60,'Chi tiet dat hang'!$A$2:$A$60&'Chi tiet dat hang'!$C$2:$C$60,0)=ROW($1:$60)),ROW(A1)))
=>Enter

F2=JoinText("; ",IF(SUMIFS('Chi tiet dat hang'!$E$2:$E$60,'Chi tiet dat hang'!$A$2:$A$60,A2,'Chi tiet dat hang'!$C$2:$C$60,C2,'Chi tiet dat hang'!$B$2:$B$60,$J$2:$J$4)>0,$J$2:$J$4&": "&TEXT(SUMIFS('Chi tiet dat hang'!$E$2:$E$60,'Chi tiet dat hang'!$A$2:$A$60,A2,'Chi tiet dat hang'!$C$2:$C$60,C2,'Chi tiet dat hang'!$B$2:$B$60,$J$2:$J$4),"#,###"),1/0))
nhấn Ctrl+Shirt+Enter
 

File đính kèm

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
10,381
Được thích
12,675
Điểm
1,560
Tại bạn thích VBA và hàm nên bạn chưa thấy những cái khác, power pivot là một trong những tool BI , nó có thể xử lý 50 triệu dòng file data 2GB , dữ liệu chuẩn chỉ việc kéo thả không cần coding cực như hàm hay VBA đâu bạn ạ
Đúng sì tin GPE. Đã lên đây hỏi VBA thì trời gầm cũng nhất định tìm cớ dùng VBA.
Đã dùng đến cái cớ "Dữ liệu lũy kế nên càng ngày càng nhiều" tức là đã mang thành kiến không cần biết Power Pivot nó là cái gì.
 

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,965
Được thích
9,308
Điểm
860
Nơi ở
TP.HCM
Chào Anh, Chị.

Nhờ Anh, Chị giúp hàm hoặc vba liệt kê danh sách khách hàng và số lượng theo thông tin như bên dưới:

Sheet "Chi tiet dat hang" từ cột A đến H thể hiện thông tin chi tiết đơn hàng của từng MSKH theo Mã SP và Số kg, Ngày đặt,... Tại J3 Em muốn liệt kê danh sách Mã SP chỉ phát sinh từ ngày tại L2 đến ngày tại R2 (công thức Em đang dùng là liệt kê hết danh sách Mã SP,

Sheet "Tong hop dat hang" sẽ là bảng tổng hợp đặt theo ngày và theo Mã SP. Tại cột H mình muốn lọc ra danh sách MSKH và số kg của từng MSKH đặt (đã điền kết quả theo mẫu, điều kiện theo ngày đặt, Mã SP)

Ví dụ như file đính kèm. Mã SP 3004 có 2 MSKH đặt với tổng là 52,900 kg, thì cột H sẽ liệt kê ra MSKH và số kg của từng MSKH (trường hợp số Kg ít hoặc nhiều hơn so với sheet "Chi tiet dat hang" thì vẫn liệt kê MSKH và số kg theo sheet "Chi tiet dat hang").

Cám ơn Anh, Chị.
Làm trước yêu cầu 1, khi nào rảnh làm tiếp yêu cầu 2.
Nếu dữ liệu được sắp xếp theo Ngày đặt có thể dùng phương thức Find để giới hạn vùng dữ liệu cần xử lý, cải thiện đáng kể tốc độ khi dữ liệu lớn.
Mã:
Sub TongHopTheoTuan()
Dim aData As Variant, aResult(1 To 1000, 1 To 9) As Variant, i As Long, iR As Long, kR As Long, d As Long, FrDate As Double, ToDate As Double
Dim oDic As Object
FrDate = Sheet1.Range("L2").Value
ToDate = FrDate + 6
aData = Sheet1.Range("A2:E" & Sheet1.Cells(&H100000, 1).End(xlUp).Row).Value2
Set oDic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(aData, 1)
    If aData(i, 1) >= FrDate And aData(i, 1) <= ToDate Then
        If Not oDic.Exists(aData(i, 3)) Then
            iR = iR + 1
            aResult(iR, 1) = "'" & aData(i, 3)
            oDic.Add CStr(aData(i, 3)), iR
            kR = iR
        Else
            kR = oDic.Item(aData(i, 3))
        End If
        d = 3 + (aData(i, 1) - FrDate)
        aResult(kR, d) = aResult(kR, d) + aData(i, 5)
    End If
Next
Sheet1.Range("J3:R1000").ClearContents
PrintResult:
If iR > 0 Then
    Sheet1.Range("J3:R3").Resize(iR).Value = aResult
End If
End Sub
 

saobekhonglac

Thành viên mới
Tham gia ngày
1 Tháng mười một 2008
Bài viết
1,493
Được thích
1,389
Điểm
860
Nơi ở
Long An - HCM
Làm trước yêu cầu 1, khi nào rảnh làm tiếp yêu cầu 2.
Nếu dữ liệu được sắp xếp theo Ngày đặt có thể dùng phương thức Find để giới hạn vùng dữ liệu cần xử lý, cải thiện đáng kể tốc độ khi dữ liệu lớn.
Mã:
Sub TongHopTheoTuan()
Dim aData As Variant, aResult(1 To 1000, 1 To 9) As Variant, i As Long, iR As Long, kR As Long, d As Long, FrDate As Double, ToDate As Double
Dim oDic As Object
FrDate = Sheet1.Range("L2").Value
ToDate = FrDate + 6
aData = Sheet1.Range("A2:E" & Sheet1.Cells(&H100000, 1).End(xlUp).Row).Value2
Set oDic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(aData, 1)
    If aData(i, 1) >= FrDate And aData(i, 1) <= ToDate Then
        If Not oDic.Exists(aData(i, 3)) Then
            iR = iR + 1
            aResult(iR, 1) = "'" & aData(i, 3)
            oDic.Add CStr(aData(i, 3)), iR
            kR = iR
        Else
            kR = oDic.Item(aData(i, 3))
        End If
        d = 3 + (aData(i, 1) - FrDate)
        aResult(kR, d) = aResult(kR, d) + aData(i, 5)
    End If
Next
Sheet1.Range("J3:R1000").ClearContents
PrintResult:
If iR > 0 Then
    Sheet1.Range("J3:R3").Resize(iR).Value = aResult
End If
End Sub
Cám ơn bạn, khi nào rảnh làm giúp câu 2 nha.
 

levin1

Thành viên mới
Tham gia ngày
18 Tháng mười một 2010
Bài viết
42
Được thích
7
Điểm
665
Tuổi
31
Chào Anh, Chị.

Nhờ Anh, Chị giúp hàm hoặc vba liệt kê danh sách khách hàng và số lượng theo thông tin như bên dưới:

Sheet "Chi tiet dat hang" từ cột A đến H thể hiện thông tin chi tiết đơn hàng của từng MSKH theo Mã SP và Số kg, Ngày đặt,... Tại J3 Em muốn liệt kê danh sách Mã SP chỉ phát sinh từ ngày tại L2 đến ngày tại R2 (công thức Em đang dùng là liệt kê hết danh sách Mã SP,

Sheet "Tong hop dat hang" sẽ là bảng tổng hợp đặt theo ngày và theo Mã SP. Tại cột H mình muốn lọc ra danh sách MSKH và số kg của từng MSKH đặt (đã điền kết quả theo mẫu, điều kiện theo ngày đặt, Mã SP)

Ví dụ như file đính kèm. Mã SP 3004 có 2 MSKH đặt với tổng là 52,900 kg, thì cột H sẽ liệt kê ra MSKH và số kg của từng MSKH (trường hợp số Kg ít hoặc nhiều hơn so với sheet "Chi tiet dat hang" thì vẫn liệt kê MSKH và số kg theo sheet "Chi tiet dat hang").

Cám ơn Anh, Chị.
Em gửi code cho câu 2
Mã:
Option Explicit
Sub tonghop1()
    Dim Dic As Object
    Dim VungDuLieu As Variant
    Dim KetQua()
    Dim i As Long, dem As Long, k As Long
    Dim NgayDat As Date
    Dim MSKH As String
    Dim MaSP As String
    Dim SoKg As Long
    Dim SoKgCu As String, SoKgMoi As String
    Set Dic = CreateObject("Scripting.Dictionary")
    VungDuLieu = Sheet1.Range("A2:E60")
    ReDim KetQua(1 To UBound(VungDuLieu, 1), 1 To 4)
    For i = 1 To UBound(VungDuLieu, 1)
        NgayDat = VungDuLieu(i, 1)
        MSKH = VungDuLieu(i, 2)
        MaSP = VungDuLieu(i, 3)
        SoKg = VungDuLieu(i, 5)
        If Not Dic.Exists(NgayDat & "#" & MaSP) Then
            k = k + 1
            Dic.Add NgayDat & "#" & MaSP, k
            KetQua(k, 1) = NgayDat
            KetQua(k, 2) = MaSP
            KetQua(k, 3) = SoKg
            KetQua(k, 4) = MSKH & ": " & Format(SoKg, "#,###.00")
            Dic.Add NgayDat & "#" & MaSP & "#" & MSKH, SoKg
        Else
            dem = Dic.Item(NgayDat & "#" & MaSP)
            KetQua(dem, 3) = KetQua(dem, 3) + SoKg
            If Not Dic.Exists(NgayDat & "#" & MaSP & "#" & MSKH) Then
                KetQua(dem, 4) = KetQua(dem, 4) & Chr(10) & MSKH & ": " & Format(SoKg, "#,###.00")
                Dic.Add NgayDat & "#" & MaSP & "#" & MSKH, SoKg
            Else
                SoKgCu = Dic.Item(NgayDat & "#" & MaSP & "#" & MSKH)
                SoKgMoi = SoKgCu + SoKg
                Dic.Item(NgayDat & "#" & MaSP & "#" & MSKH) = SoKgMoi
                KetQua(dem, 4) = Replace(KetQua(dem, 4), MSKH & ": " & Format(SoKgCu, "#,###.00"), MSKH & ": " & Format(SoKgMoi, "#,###.00"))
            End If
        End If
    Next i
    If k Then
        Sheet2.Range("A2").Resize(k, 4) = KetQua
    End If
End Sub
 
Top Bottom