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

Liên hệ QC

saobekhonglac

Thành viên mới
Tham gia
1/11/08
Bài viết
1,565
Được thích
1,450
Giới tính
Nam
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

  • Liet ke danh sach KH va so luong.xlsx
    23.3 KB · Đọc: 29
Lần chỉnh sửa cuối:
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

  • Liet ke danh sach KH va so luong.xlsx
    165.9 KB · Đọc: 25
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
 
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 ạ
 
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.
 
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

  • GPE.xlsm
    31.6 KB · Đọc: 16
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ì.
 
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
 
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.
 
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
 
Web KT
Back
Top Bottom