Tìm số lượng người bán theo ngưỡng cho trước

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Yeuvoyeucon

Thành viên hoạt động
Tham gia
30/10/09
Bài viết
143
Được thích
23
Em xin chào anh chị và các bạn trên diễn đàn ạ,
Em có vấn đề xin trợ giúp của anh chị và mọi người ạ. Em thấy pivotable trong excel nó có liệt kê và tính theo ngưỡng nào đó. Vậy ví dụ em có cột A là mã người bán, cột B là doanh thu thì code như nào để như yêu cầu như vùng E:G ạ. Em cảm ơn anh chị và mọi người ạ.
 

File đính kèm

  • Lay so luong nguoi ban theo nguong.xlsm
    24.4 KB · Đọc: 30
Em xin chào anh chị và các bạn trên diễn đàn ạ,
Em có vấn đề xin trợ giúp của anh chị và mọi người ạ. Em thấy pivotable trong excel nó có liệt kê và tính theo ngưỡng nào đó. Vậy ví dụ em có cột A là mã người bán, cột B là doanh thu thì code như nào để như yêu cầu như vùng E:G ạ. Em cảm ơn anh chị và mọi người ạ.
Xem hướng dẫn tại đây, là có thể dùng pivottable đơn giản là có kết quả như muốn
 
Upvote 0
Xem ở đâu xa xôi. Tài liệu tiếng Việt ngay ở GPE.

1673754302997.png
 
Upvote 0
xem tiếng anh cho các bạn trẻ (gen Z) quen rồi bác
Theo tôi, các bạn trẻ một là không thích đọc, hai là sợ tiếng Anh. À mà gen Z là gì tôi không hiểu? Tôi cứ thắc mắc tại sao cứ phải dùng từ ngữ có vẻ ngoại lai cho những thứ tiếng Việt có sẵn.
 
Upvote 1
Xem ở đâu xa xôi. Tài liệu tiếng Việt ngay ở GPE.

View attachment 285746
Em cảm ơn anh ạ. Bình thường nếu dùng Dic em thấy việc đếm duy nhất, cộng dồn thì không khó lắm, nhưng ở đây cái điều kiện đầu vào lại là các ngưỡng là số tiền từ đâu đến đâu nên nếu làm code em chưa nghĩ ra giải thuật làm cái này nếu là code thay vì Pivotable ạ.
 
Upvote 0
Em xin chào anh chị và các bạn trên diễn đàn ạ,
Em có vấn đề xin trợ giúp của anh chị và mọi người ạ. Em thấy pivotable trong excel nó có liệt kê và tính theo ngưỡng nào đó. Vậy ví dụ em có cột A là mã người bán, cột B là doanh thu thì code như nào để như yêu cầu như vùng E:G ạ. Em cảm ơn anh chị và mọi người ạ.
Kiểm tra lại . . .
Mã:
Option Explicit
Sub ABC()
  Dim arr(), aDT, dic As Object, tmp
  Dim sRow&, sR&, i&, r&
 
  Set dic = CreateObject("scripting.dictionary")
  aDT = Array(0, 500, 1000, 2000, 2500) 'Các to
  sR = UBound(aDT)
  ReDim res(1 To sR + 1, 1 To 2)
  arr = Sheet1.Range("A2", Sheet1.Range("B" & Rows.Count)).Value
  sRow = UBound(arr)
  For i = 1 To sRow 'Tong doanh thu tung nguoi ban
    dic(arr(i, 1)) = dic(arr(i, 1)) + arr(i, 2)
  Next i
  For Each tmp In dic.items
    For r = 1 To sR
      If tmp <= aDT(r) Then Exit For
    Next r
    res(r, 1) = res(r, 1) + 1
    res(r, 2) = res(r, 2) + tmp
  Next tmp
  Sheet1.Range("F4").Resize(sR + 1, 2) = res
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Kiểm tra lại . . .
Mã:
Option Explicit
Sub ABC()
  Dim arr(), aDT, dic As Object, tmp
  Dim sRow&, sR&, i&, r&
 
  Set dic = CreateObject("scripting.dictionary")
  aDT = Array(0, 500, 1000, 2000, 2500) 'Các to
  sR = UBound(aDT)
  ReDim res(1 To sR + 1, 1 To 2)
  arr = Sheet1.Range("A2", Sheet1.Range("B" & Rows.Count)).Value
  sRow = UBound(arr)
  For i = 1 To sRow 'Tong doanh thu tung nguoi ban
    dic(arr(i, 1)) = dic(arr(i, 1)) + arr(i, 2)
  Next i
  For Each tmp In dic.items
    For r = 1 To sR
      If tmp < aDT(r) Then Exit For
    Next r
    res(r, 1) = res(r, 1) + 1
    res(r, 2) = res(r, 2) + tmp
  Next tmp
  Sheet1.Range("F4").Resize(sR + 1, 2) = res
End Sub
Nhìn giải thuật của anh quá đang phục ạ. Em cảm ơn anh nhiều ạ!
 
Upvote 0
Bác ạ, Pivot nó không loại bỏ được trùng mã ạ?
Loại trùng là vô nghĩa, vì 1 người bán có nhiều lần bán, mỗi lần có những giá trị doanh thu khác nhau, và đang nằm rải rác trong các nhóm (0-500, 500-1000, ...). Làm sao loại trùng trong tất cả các nhóm?
 
Upvote 0
Loại trùng là vô nghĩa, vì 1 người bán có nhiều lần bán, mỗi lần có những giá trị doanh thu khác nhau, và đang nằm rải rác trong các nhóm (0-500, 500-1000, ...). Làm sao loại trùng trong tất cả các nhóm?
Vâng, nếu vậy phải dùng bảng dữ liệu thật.
Bảng giả này 2 dòng đầu nằm trong khoảng 0-500 lẽ ra tính là 1 người thì vẫn chuẩn hơn, ít ra phải thêm cột cửa hàng hay ngày, ... nữa.
 
Upvote 0
Nếu chỉ có kiến thức về mảng (Array) thì có thể giải quyết vấn đề thống kê này không, các bạn nhỉ?
Em cũng chỉ nghĩ đến Dic khi có yêu cầu này ạ. Nhìn giải thuật của anh Hiếu hay mà đọc mãi em còn dốt nên cũng chỉ hiểu hiểu được phần nào. Chưa tường tận được ạ. Nếu có cách khác mong anh chỉ bảo thêm ạ.
 
Upvote 0
. . . . . . . Nếu có cách khác mong anh chỉ bảo thêm ạ.
Mình mường tượng như vầy; Nếu rỗi bạn có thể thử:
B1: Lập danh sách duy nhất những người bán (ví dụ tới cột 'J') (DS B)
B2 Đưa 2 cột dữ liệu vô mảng (như Arr()) (DS A)
B3: Tạo 2 vòng lặp duyệt 2 danh sách A & B để tìm ra tổng doanh thu (DT) của từng người trong DS B;
B4 : Khai báo Mảng (5 hàng & 2 cột)
B5 Duyệt DS B; Thỏa điều kiện khoảng DT nào thì ghi vô dòng tương ứng của mảng (vừa khai báo)

Tất nhiên có thể là rủa bò hơn nhiều khi xài Dict . . . .
 
Upvote 0
Mình mường tượng như vầy; Nếu rỗi bạn có thể thử:
B1: Lập danh sách duy nhất những người bán (ví dụ tới cột 'J') (DS B)
B2 Đưa 2 cột dữ liệu vô mảng (như Arr()) (DS A)
B3: Tạo 2 vòng lặp duyệt 2 danh sách A & B để tìm ra tổng doanh thu (DT) của từng người trong DS B;
B4 : Khai báo Mảng (5 hàng & 2 cột)
B5 Duyệt DS B; Thỏa điều kiện khoảng DT nào thì ghi vô dòng tương ứng của mảng (vừa khai báo)

Tất nhiên có thể là rủa bò hơn nhiều khi xài Dict . . . .
Dạ vâng ạ ! Em sẽ thử thêm xem sao ạ.
 
Upvote 0
Vâng, nếu vậy phải dùng bảng dữ liệu thật.
Bảng giả này 2 dòng đầu nằm trong khoảng 0-500 lẽ ra tính là 1 người thì vẫn chuẩn hơn, ít ra phải thêm cột cửa hàng hay ngày, ... nữa.
Dữ liệu thật vẫn vậy. Mỗi dòng là 1 lần bán, bán cho cửa hàng nào hay ngày nào cũng là 1 lần bán, doanh thu 1 lần thì vô chừng.
Code bài 7 cũng là số lần bán, chưa gộp trùng thành số người.
Minh họa việc vô nghĩa của việc đếm số lần bán khác với số người bán như sau: Số lượng mã duy nhất là 265. Số lần bán là 421. Vậy thì 1 mã người bán phải nằm nhiều chỗ trong pivot table.
Nếu báo cáo như sau thì mới gọi là có ý nghĩa về mặt quản lý:
- anh A bán được cả chục lần, nhưng chỉ có 1 lần doanh thu được 5, 6 trăm, những lần khác bán được chưa tới 100, thậm chí có lần bán chỉ được 1, 2 đồng.
- anh B bán được 2 lần, lần nào cũng 5, 6 ngàn.
1673800213805.png

Hoặc báo cáo như sau sẽ lọc ra được: Những anh nào bán nhiều lần mà doanh thu bèo quá, và những anh nào bán được ít lần mà doanh thu rất cao:

1673799639581.png
Sau khii có Data Model rồi thì dùng các hàm DAX đẻ làm việc.
Lý thuyết là vậy, nhưng nếu đúng theo yêu cầu bài 1 thì DAX vẫn được, nhưng cũng không dễ (row context or field context). Mà field lại chia 4, 5 khoảng bất kỳ.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình mường tượng như vầy; Nếu rỗi bạn có thể thử:
B1: Lập danh sách duy nhất những người bán (ví dụ tới cột 'J') (DS B)
B2 Đưa 2 cột dữ liệu vô mảng (như Arr()) (DS A)
B3: Tạo 2 vòng lặp duyệt 2 danh sách A & B để tìm ra tổng doanh thu (DT) của từng người trong DS B;
B4 : Khai báo Mảng (5 hàng & 2 cột)
B5 Duyệt DS B; Thỏa điều kiện khoảng DT nào thì ghi vô dòng tương ứng của mảng (vừa khai báo)
Làm cách này tính ra tổng doanh thu từng người bán, chưa chia doanh thu thành từng khoảng theo doanh số từng lần bán.
 
Upvote 0
Web KT
Back
Top Bottom