Code vba thay thế cho hàm COUNTIFS (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

dvh.hy.9902

Thành viên hoạt động
Tham gia
27/3/12
Bài viết
123
Được thích
9
- Em có vấn đề tổng hợp thống kê số lượng hàng hóa mà các nhân viên bán hàng được thưởng ở Sheets("Thuong_ban_hang"). Em có sử dụng công thức COUNTIFS để thống kê Tổng số mặt hàng bán được và Số lượng mặt hàng được thưởng; để tính tiền thưởng. Cụ thể em đã tổng hợp một số trường hợp.
- Em mong được mọi người giúp em tổng hợp bằng vba với ạ!. EM XIN TRÂN THÀNH CẢM ƠN!.
 

File đính kèm

- Em có vấn đề tổng hợp thống kê số lượng hàng hóa mà các nhân viên bán hàng được thưởng ở Sheets("Thuong_ban_hang"). Em có sử dụng công thức COUNTIFS để thống kê Tổng số mặt hàng bán được và Số lượng mặt hàng được thưởng; để tính tiền thưởng. Cụ thể em đã tổng hợp một số trường hợp.
- Em mong được mọi người giúp em tổng hợp bằng vba với ạ!. EM XIN TRÂN THÀNH CẢM ƠN!.

Tại sao bạn lại không thích COUNTIFS?
 
Upvote 0
Tại sao bạn lại không thích COUNTIFS?
- Không phải là em không thích hàm COUNTIFS? anh ạ!. Hàm COUNTIFS trong file khi sử dụng mà số nhân viên ở danh sách sheet(Nhan_vien) tăng lên thì em nhập công thức cũng lâu. Em muốn dùng vba để lọc được nhanh hơn!. Đặc biệt là em đang tìm hiểu về vba, qua bài này để em được học hỏi thêm!.
- Em có đọc code về mảng và Dic nhưng chưa viết được. Mong mọi người viết bằng vba giúp em "Viết code càng tường minh càng tốt ạ: nghĩa là đừng viết tắt quá!" để em có thê sử dụng và dùng code vào các trường hợp khác!. Em xin cảm ơn!.
 
Upvote 0
- Không phải là em không thích hàm COUNTIFS? anh ạ!. Hàm COUNTIFS trong file khi sử dụng mà số nhân viên ở danh sách sheet(Nhan_vien) tăng lên thì em nhập công thức cũng lâu. Em muốn dùng vba để lọc được nhanh hơn!. Đặc biệt là em đang tìm hiểu về vba, qua bài này để em được học hỏi thêm!.
- Em có đọc code về mảng và Dic nhưng chưa viết được. Mong mọi người viết bằng vba giúp em "Viết code càng tường minh càng tốt ạ: nghĩa là đừng viết tắt quá!" để em có thê sử dụng và dùng code vào các trường hợp khác!. Em xin cảm ơn!.

ai mà xài countif như bạn vậy?
Mã:
D11= COUNTIF(DATA!$AI$6:$AI$1000, B11)
=====
code thì có cái này (chưa cần xài tới dic),à quên nữa, nhân viên ko có trùng tên nha , trùng thì phải tạo mã
Mã:
Sub thuong_ban_hang()
Dim nv, data As Variant, R_nv As Range, i As Long, r
With Sheets("Nhan_vien")
    Set R_nv = .Range(.[c3], .[c60000].End(3))
    nv = R_nv.Resize(, 2).Value
End With
ReDim Preserve nv(1 To UBound(nv), 1 To 6)

With Sheets("DATA")
    data = Range(.[ah6], .[ak60000].End(3))
End With

For i = 1 To UBound(data)
    r = Application.Match(data(i, 2), R_nv, 0)
    If TypeName(r) <> "Error" Then
        nv(r, 3) = nv(r, 3) + 1
        If UCase(Left(data(i, 4), 1)) = "C" Then nv(r, 4) = nv(r, 4) + 1
        nv(r, 6) = "=RC[-2]*RC[-1]"
    End If
Next i
With Sheets("Thuong_ban_hang")
.[b11:g6000].Clear
.[b11].Resize(UBound(nv), 6) = nv
.[b11].Resize(UBound(nv), 6).Borders.Weight = xlThin
End With
End Sub
 
Upvote 0
ai mà xài countif như bạn vậy?
Mã:
D11= COUNTIF(DATA!$AI$6:$AI$1000, B11)
=====
code thì có cái này (chưa cần xài tới dic),à quên nữa, nhân viên ko có trùng tên nha , trùng thì phải tạo mã
Mã:
Sub thuong_ban_hang()
Dim nv, data As Variant, R_nv As Range, i As Long, r
With Sheets("Nhan_vien")
    Set R_nv = .Range(.[c3], .[c60000].End(3))
    nv = R_nv.Resize(, 2).Value
End With
ReDim Preserve nv(1 To UBound(nv), 1 To 6)

With Sheets("DATA")
    data = Range(.[ah6], .[ak60000].End(3))
End With

For i = 1 To UBound(data)
    r = Application.Match(data(i, 2), R_nv, 0)
    If TypeName(r) <> "Error" Then
        nv(r, 3) = nv(r, 3) + 1
        If UCase(Left(data(i, 4), 1)) = "C" Then nv(r, 4) = nv(r, 4) + 1
        nv(r, 6) = "=RC[-2]*RC[-1]"
    End If
Next i
With Sheets("Thuong_ban_hang")
.[b11:g6000].Clear
.[b11].Resize(UBound(nv), 6) = nv
.[b11].Resize(UBound(nv), 6).Borders.Weight = xlThin
End With
End Sub
- Hì hì ... Thực ra cái món Excel này em cũng có biết gì đâu!. Nghe nói COUNTIFS là đếm số lượng thì em cứ thử và kiểm tra thấy kết quả đúng là em dùng hì hì...
- Code của Anh cho đúng kết quả đếm. Nhưng Anh giúp em thêm số thứ tự và cột [Thành tiền(Cột G) = Số lượng hàng bán được (cột E)*(Thưởng trên 1 mặt hàng tại = giá trị em nhập tại ô K9) với ạ!. Code Anh viết nhiều chỗ em chưa hiểu để có thể tùy chỉnh được. Không biết anh còn cách viết nào mà sử dụng mảng mà rễ hiểu hơn không Anh.?. Vì em đọc chủ đề về mảng Thấy khác cách Anh viết quá.!.
- Còn dòng tính Tổng Các Bác giúp cho em với!.
 
Lần chỉnh sửa cuối:
Upvote 0
- Hì hì ... Thực ra cái món Excel này em cũng có biết gì đâu!. Nghe nói COUNTIFS là đếm số lượng thì em cứ thử và kiểm tra thấy kết quả đúng là em dùng hì hì...
- Code của Anh cho đúng kết quả đếm. Nhưng Anh giúp em thêm số thứ tự và cột [Thành tiền(Cột G) = Số lượng hàng bán được (cột E)*(Thưởng trên 1 mặt hàng tại = giá trị em nhập tại ô K9) với ạ!. Code Anh viết nhiều chỗ em chưa hiểu để có thể tùy chỉnh được. Không biết anh còn cách viết nào mà sử dụng mảng mà rễ hiểu hơn không Anh.?. Vì em đọc chủ đề về mảng Thấy khác cách Anh viết quá.!.
- Còn dòng tính Tổng Các Bác giúp cho em với!.

cột F lấy số ở đâu ra vậy? bạn nhập tay vào phải ko?
tôi đã làm sẳn cthuc
Mã:
G11=E11*F11
khi bạn nhập số vào F11 thì G11 có số thôi
ô k9 đâu có cái gì đâu?
 
Upvote 0
cột F lấy số ở đâu ra vậy? bạn nhập tay vào phải ko?
tôi đã làm sẳn cthuc
Mã:
G11=E11*F11
khi bạn nhập số vào F11 thì G11 có số thôi
ô k9 đâu có cái gì đâu?
Vâng: Vậy là ok chỗ công thức ạ; Nhưng để điền thêm cả số thứ tự thì sửa code sao anh?
 
Upvote 0
Vâng: Vậy là ok chỗ công thức ạ; Nhưng để điền thêm cả số thứ tự thì sửa code sao anh?

xem thử
Mã:
Sub thuong_ban_hang()
Dim nv, data As Variant, R_nv As Range, i As Long, r
With Sheets("Nhan_vien")
    Set R_nv = .Range(.[c3], .[c60000].End(3).Offset(1))
    nv = R_nv.Resize(, 2).Value
End With
ReDim Preserve nv(1 To UBound(nv), 1 To 6)

With Sheets("DATA")
    data = Range(.[ah6], .[ak60000].End(3))
End With

For i = 1 To UBound(data)
    r = Application.Match(data(i, 2), R_nv, 0)
    If TypeName(r) <> "Error" Then
        nv(r, 3) = nv(r, 3) + 1: tong_so_hang = tong_so_hang + nv(r, 3)
        If UCase(Left(data(i, 4), 1)) = "C" Then nv(r, 4) = nv(r, 4) + 1: tong_so_hang_thuong = tong_so_hang_thuong + nv(r, 4)
        nv(r, 6) = "=RC[-2]*RC[-1]"
    End If
Next i
nv(UBound(nv), 2) = "Tong"
nv(UBound(nv), 3) = tong_so_hang
nv(UBound(nv), 4) = tong_so_hang_thuong
nv(UBound(nv), 6) = "=SUM(R[-" & UBound(nv) - 1 & "]C:R[-1]C)"

With Sheets("Thuong_ban_hang")
.[a11:h6000].Clear
.[b11].Resize(UBound(nv), 6) = nv
.[a11].Resize(UBound(nv) - 1).Value = Sheet2.[a3].Resize(UBound(nv) - 1).Value
.[a11].Resize(UBound(nv), 8).Borders.Weight = xlThin
End With
End Sub
 
Upvote 0
xem thử
Mã:
Sub thuong_ban_hang()
Dim nv, data As Variant, R_nv As Range, i As Long, r
With Sheets("Nhan_vien")
    Set R_nv = .Range(.[c3], .[c60000].End(3).Offset(1))
    nv = R_nv.Resize(, 2).Value
End With
ReDim Preserve nv(1 To UBound(nv), 1 To 6)

With Sheets("DATA")
    data = Range(.[ah6], .[ak60000].End(3))
End With

For i = 1 To UBound(data)
    r = Application.Match(data(i, 2), R_nv, 0)
    If TypeName(r) <> "Error" Then
        nv(r, 3) = nv(r, 3) + 1: tong_so_hang = tong_so_hang + nv(r, 3)
        If UCase(Left(data(i, 4), 1)) = "C" Then nv(r, 4) = nv(r, 4) + 1: tong_so_hang_thuong = tong_so_hang_thuong + nv(r, 4)
        nv(r, 6) = "=RC[-2]*RC[-1]"
    End If
Next i
nv(UBound(nv), 2) = "Tong"
nv(UBound(nv), 3) = tong_so_hang
nv(UBound(nv), 4) = tong_so_hang_thuong
nv(UBound(nv), 6) = "=SUM(R[-" & UBound(nv) - 1 & "]C:R[-1]C)"

With Sheets("Thuong_ban_hang")
.[a11:h6000].Clear
.[b11].Resize(UBound(nv), 6) = nv
.[a11].Resize(UBound(nv) - 1).Value = Sheet2.[a3].Resize(UBound(nv) - 1).Value
.[a11].Resize(UBound(nv), 8).Borders.Weight = xlThin
End With
End Sub
- Cảm ơn anh code chạy ok ạ!.
- Anh ơi cho em hỏi thêm một câu nữa ạ!.
Dòng lệnh sau có ý nghĩa như thế nào ạ?
r = Application.Match(data(i, 2), R_nv, 0)
If TypeName(r) <> "Error" Then
- Một lần nữa cảm ơn sự giúp đỡ của Anh.!.
 
Upvote 0
xem thử
Mã:
Sub thuong_ban_hang()
Dim nv, data As Variant, R_nv As Range, i As Long, r
With Sheets("Nhan_vien")
    Set R_nv = .Range(.[c3], .[c60000].End(3).Offset(1))
    nv = R_nv.Resize(, 2).Value
End With
ReDim Preserve nv(1 To UBound(nv), 1 To 6)

With Sheets("DATA")
    data = Range(.[ah6], .[ak60000].End(3))
End With

For i = 1 To UBound(data)
    r = Application.Match(data(i, 2), R_nv, 0)
    If TypeName(r) <> "Error" Then
        nv(r, 3) = nv(r, 3) + 1: tong_so_hang = tong_so_hang + nv(r, 3)
        If UCase(Left(data(i, 4), 1)) = "C" Then nv(r, 4) = nv(r, 4) + 1: tong_so_hang_thuong = tong_so_hang_thuong + nv(r, 4)
        nv(r, 6) = "=RC[-2]*RC[-1]"
    End If
Next i
nv(UBound(nv), 2) = "Tong"
nv(UBound(nv), 3) = tong_so_hang
nv(UBound(nv), 4) = tong_so_hang_thuong
nv(UBound(nv), 6) = "=SUM(R[-" & UBound(nv) - 1 & "]C:R[-1]C)"

With Sheets("Thuong_ban_hang")
.[a11:h6000].Clear
.[b11].Resize(UBound(nv), 6) = nv
.[a11].Resize(UBound(nv) - 1).Value = Sheet2.[a3].Resize(UBound(nv) - 1).Value
.[a11].Resize(UBound(nv), 8).Borders.Weight = xlThin
End With
End Sub
- Anh ơi!. Khi em áp dụng vào file chứa dữ liệu thật của em thì phát sinh vấn đề sau: Mong được anh nghiên cứu giúp!. Vấn đề đó như sau:
- Tại sheet (
Nhan_vien) của em có khoảng hơn 100 người; nhưng số người thực hiện bán hàng khoảng vài trục người vì vậy ở sheet (Thuong_ban_hang) chỉ thống kê số nhân viên bán hàng và có thưởng thôi ạ!. còn chức vụ của họ thì lấy ở sheet (Nhan_vien)
- Dữ liệu tại cột người bán hàng ở sheet (Thuong_ban_hang) là không liên tục tức là tại cột này vẫn có ô trống vì trong kho hàng có những mặt hàng có thưởng nhưng vẫn chưa bán.
Em bổ sung thêm dữ liệu trong file đính kèm ạ!.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
- Anh ơi!. Khi em áp dụng vào file chứa dữ liệu thật của em thì phát sinh vấn đề sau: Mong được anh nghiên cứu giúp!. Vấn đề đó như sau:
- Tại sheet (
Nhan_vien) của em có khoảng hơn 100 người; nhưng số người thực hiện bán hàng khoảng vài trục người vì vậy ở sheet (Thuong_ban_hang) chỉ thống kê số nhân viên bán hàng và có thưởng thôi ạ!. còn chức vụ của họ thì lấy ở sheet (Nhan_vien)
- Dữ liệu tại cột người bán hàng ở sheet (Thuong_ban_hang) là không liên tục tức là tại cột này vẫn có ô trống vì trong kho hàng có những mặt hàng có thưởng nhưng vẫn chưa bán.
Em bổ sung thêm dữ liệu trong file đính kèm ạ!.

bạn xem lại tên nhân viên ở 2 sheet "data" và "nhan vien", thấy thì nó giống nhau, nhưng dùng hàm nó tìm ko ra, chắc là gọ bằng 2 loại font chữ khác nha
 

File đính kèm

Upvote 0
bạn xem lại tên nhân viên ở 2 sheet "data" và "nhan vien", thấy thì nó giống nhau, nhưng dùng hàm nó tìm ko ra, chắc là gọ bằng 2 loại font chữ khác nha
- Với việc nhập dữ liệu đầu vào chuẩn thì code chạy ok rồi ạ!.
- Em cảm ơn sự giúp đỡ của Anh ạ!. Hôm nay em đang kiểm tra dữ liệu, đúng như anh nói nếu nhập tên nhân viên giữa 2 sheet mà khác nhau kể như là "em tèo luôn ạ". Anh đã đặt cho em data Validation để lấy tên nhân viên từ sheet sheet (nhan_vien) Tuy nhiên nếu lựa chọn kiểu font chữ giữa 2 sheet này mà không thống nhất là cũng không được!.
- Với file dữ liệu như của em. Em mong được các anh cho lời khuyên nên thực hiện thế nào thì tốt nhất ạ. Vì file này không phải một mình em dùng mà là file được dùng chung. Tức là để ở máy của Phòng để 1 vài người thực hiện việc nhập.
- Một lần nữa em cảm ơn sự giúp đỡ của Anh. Trong quá trình sử dụng code nếu có những trường hợp phát sinh do không lường trước hết được các tình huống, em mong lại được sự giúp đỡ của Anh và các bạn. Em xin cảm ơn|!.
 
Upvote 0
- Với việc nhập dữ liệu đầu vào chuẩn thì code chạy ok rồi ạ!.
- Em cảm ơn sự giúp đỡ của Anh ạ!. Hôm nay em đang kiểm tra dữ liệu, đúng như anh nói nếu nhập tên nhân viên giữa 2 sheet mà khác nhau kể như là "em tèo luôn ạ". Anh đã đặt cho em data Validation để lấy tên nhân viên từ sheet sheet (nhan_vien) Tuy nhiên nếu lựa chọn kiểu font chữ giữa 2 sheet này mà không thống nhất là cũng không được!.
- Với file dữ liệu như của em. Em mong được các anh cho lời khuyên nên thực hiện thế nào thì tốt nhất ạ. Vì file này không phải một mình em dùng mà là file được dùng chung. Tức là để ở máy của Phòng để 1 vài người thực hiện việc nhập.
- Một lần nữa em cảm ơn sự giúp đỡ của Anh. Trong quá trình sử dụng code nếu có những trường hợp phát sinh do không lường trước hết được các tình huống, em mong lại được sự giúp đỡ của Anh và các bạn. Em xin cảm ơn|!.

Tôi đã xem lại, ko phải là do khác font chữ, mà bên sheet NV đánh tên cách nhau tới 2 khoảng trắng
ví dụ
Nguyễn_Tuấn__Anh, trong khi bên sheet data thì chỉ đánh một khoảng trắng
nếu đánh, nếu nó cùng một format như vậy thì xử được
tôi nghĩ là bạn nên đánh mã nhân viên, như vậy sẻ giúp bạn quản lý tốt hơn
 
Upvote 0
Nhiều người cứ đem bài lên đây hỏi với câu bất hủ "...nhưng sao không ra đúng...".
Lý do: những người này đi đường tắt, không nắm bắt được nguyên tắc căn bản của dữ liệu.

Trên bảng tính, muốn từ dữ liệu thô qua công đoạn phân tích phải qua một công đoạn phụ là chuẩn hoá.

Trước khi bắt đầu phân tích với dữ liệu nhập tay, LUÔN LUÔN chuẩn hoá các cột dữ liệu text bằng cách:
1. Dữ liệu nhập tay: bôi đen các cột text, dùng Ctrl+h đổi hai dấu cách liên tiếp thành 1. Lập lại vài lần để trừ luôn các trường hợp 3, 4 khoảng.
2. Dữ liệu nhập mạng: đổi tất cả các ký tự 160 (khoảng trống trên trang web) ra dấu cách, và thực hiện lại bước 1
 
Upvote 0
Nhiều người cứ đem bài lên đây hỏi với câu bất hủ "...nhưng sao không ra đúng...".
Lý do: những người này đi đường tắt, không nắm bắt được nguyên tắc căn bản của dữ liệu.

Trên bảng tính, muốn từ dữ liệu thô qua công đoạn phân tích phải qua một công đoạn phụ là chuẩn hoá.

Trước khi bắt đầu phân tích với dữ liệu nhập tay, LUÔN LUÔN chuẩn hoá các cột dữ liệu text bằng cách:
1. Dữ liệu nhập tay: bôi đen các cột text, dùng Ctrl+h đổi hai dấu cách liên tiếp thành 1. Lập lại vài lần để trừ luôn các trường hợp 3, 4 khoảng.
2. Dữ liệu nhập mạng: đổi tất cả các ký tự 160 (khoảng trống trên trang web) ra dấu cách, và thực hiện lại bước 1
- Trường hợp như của em chắc là phải dùng form nhập dữ liệu thì mới chuẩn được, khi nhập dữ liệu vào form thì sẽ được lưu vào sheet data có như vậy khi lọc mới chuẩn được. Lập form dữ liệu cho 38 cột; mà phải phải dùng hàm trim để cắt đi ký tự là dấu cách ... Thì em bó tay ạ, với những bài code thật đơn giản may ra em còn viết được chứ khó là em thua.
- Anh ơi cho em hỏi với. Trong vba có dùng được hàm trim như dùng trong công thức để bỏ đi ký tự là khoảng trắng (dấu cách) không ạ; Và nếu dùng được thì cách dùng thế nào ạ?. Em cảm ơn !.
 
Upvote 0
- Trường hợp như của em chắc là phải dùng form nhập dữ liệu thì mới chuẩn được, khi nhập dữ liệu vào form thì sẽ được lưu vào sheet data có như vậy khi lọc mới chuẩn được. Lập form dữ liệu cho 38 cột; mà phải phải dùng hàm trim để cắt đi ký tự là dấu cách ... Thì em bó tay ạ, với những bài code thật đơn giản may ra em còn viết được chứ khó là em thua.
- Anh ơi cho em hỏi với. Trong vba có dùng được hàm trim như dùng trong công thức để bỏ đi ký tự là khoảng trắng (dấu cách) không ạ; Và nếu dùng được thì cách dùng thế nào ạ?. Em cảm ơn !.

Tôi chỉ đề nghị chuẩn hoá bằng tay. Kỹ thuật "dùng form nhập dữ liệu thì mới chuẩn được" là trên trình độ của tôi, chỉ dẫn hổng nổi.
 
Upvote 0
Trong VBA, hàm Chim chỉ loại bỏ các ký tự trắng ở đầu và cuối; để loại bỏ các ký tự trắng ở giữa, chỉ giữ lại 1 ký tự thì dùng Application.Chim
 
Upvote 0
Mình chưa hiểu Application.Trim lắm bạn cho ví dụ đi
Chứng tỏ nhà bác học toàn tìm hiểu cái cao siêu, cái đơn giản thì không biết! Bạn nhập ?Application.Trim(" a........b ") trong cửa sổ Immediate sẽ được "a b", còn ?Trim(" a........b ") sẽ được "a.......b" (các dấu chấm thay cho khoảng trắng do diễn đàn không cho nhập nhiều khoảng trắng liên tiếp)
 
Lần chỉnh sửa cuối:
Upvote 0
Chứng tỏ nhà bác học toàn tìm hiểu cái cao siêu, cái đơn giản thì không biết! Bạn nhập ?Application.Trim(" a........b ") trong cửa sổ Immediate sẽ được "a b", còn ?Trim(" a........b ") sẽ được "a.......b" (các dấu chấm thay cho khoảng trắng do diễn đàn không cho nhập nhiều khoảng trắng liên tiếp)
Tại chưa hiểu Application.Trim nên mới hỏi...Tự Mò học nó vậy đó.... cảm ơn bạn --=0--=0--=0
PHP:
Sub Test_Trim()
    [A2].Value = ("Kieu           Manh")
    [A3] = Application.Trim([A2])
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
bạn xem lại tên nhân viên ở 2 sheet "data" và "nhan vien", thấy thì nó giống nhau, nhưng dùng hàm nó tìm ko ra, chắc là gọ bằng 2 loại font chữ khác nha
- Anh ơi!. Sau khi sử dụng code của anh để lọc ra danh sách.
Mục đích là lọc ra những người bán được những mặt hàng có thưởng, còn những người bán những mặt hàng không có thưởng thì không cần lọc vào danh sách. Anh giúp em chỉnh lại code với!. Em cảm ơn anh.
 
Upvote 0
- Anh ơi!. Sau khi sử dụng code của anh để lọc ra danh sách.
Mục đích là lọc ra những người bán được những mặt hàng có thưởng, còn những người bán những mặt hàng không có thưởng thì không cần lọc vào danh sách. Anh giúp em chỉnh lại code với!. Em cảm ơn anh.

viết lâu rồi, ko nhớ nổi, chỉnh đại lại xem xem có đúng ko
Mã:
Option Explicit

Public Sub thuong_ban_hang()
Dim data, NV, KQ As Variant, R_NV As Range, i, j, k, tong_so_hang, tong_so_hang_thuong As Long, dic As Object, r

ReDim KQ(1 To 6000, 1 To 8)

With Sheets("Nhan_vien")
    Set R_NV = .Range(.[c3], .[c60000].End(3))
    NV = R_NV.Resize(, 2).Value
End With

With Sheets("DATA")
    data = Range(.[ah6], .[ak60000].End(3)).Value
End With
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(data)
    If data(i, 2) <> "" Then
    If UCase(Left(data(i, 4), 1)) = "C" Then
    If Not dic.exists(data(i, 2)) Then
        k = k + 1
        dic.Add data(i, 2), k
        KQ(k, 1) = k
        KQ(k, 2) = data(i, 2)
        r = Application.Match(data(i, 2), R_NV, 0)
            If TypeName(r) <> "Error" Then
                KQ(k, 3) = NV(r, 2)
            Else
                KQ(k, 3) = "Ko co nhan vien nay trong danh sach"
            End If
        KQ(k, 4) = 1: tong_so_hang = tong_so_hang + 1
         KQ(k, 5) = 1: tong_so_hang_thuong = tong_so_hang_thuong + 1
        KQ(k, 7) = "=RC[-2]*RC[-1]"
    Else
    j = dic.Item(data(i, 2))
        KQ(j, 4) = KQ(j, 4) + 1: tong_so_hang = tong_so_hang + 1
        If UCase(Left(data(i, 4), 1)) = "C" Then KQ(k, 5) = KQ(j, 5) + 1: tong_so_hang_thuong = tong_so_hang_thuong + 1
    End If
    End If
    End If
Next i
k = k + 1
KQ(k, 2) = "Tong"
KQ(k, 4) = tong_so_hang
KQ(k, 5) = tong_so_hang_thuong
KQ(k, 7) = "=SUM(R[-" & k - 1 & "]C:R[-1]C)"

With Sheets("Thuong_ban_hang")
.[a11:H6000].Clear
.[a11].Resize(k, 8) = KQ
.[a11].Resize(k, 8).Borders.Weight = xlThin
End With
End Sub
 
Upvote 0
viết lâu rồi, ko nhớ nổi, chỉnh đại lại xem xem có đúng ko
Mã:
Option Explicit

Public Sub thuong_ban_hang()
Dim data, NV, KQ As Variant, R_NV As Range, i, j, k, tong_so_hang, tong_so_hang_thuong As Long, dic As Object, r

ReDim KQ(1 To 6000, 1 To 8)

With Sheets("Nhan_vien")
    Set R_NV = .Range(.[c3], .[c60000].End(3))
    NV = R_NV.Resize(, 2).Value
End With

With Sheets("DATA")
    data = Range(.[ah6], .[ak60000].End(3)).Value
End With
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(data)
    If data(i, 2) <> "" Then
    If UCase(Left(data(i, 4), 1)) = "C" Then
    If Not dic.exists(data(i, 2)) Then
        k = k + 1
        dic.Add data(i, 2), k
        KQ(k, 1) = k
        KQ(k, 2) = data(i, 2)
        r = Application.Match(data(i, 2), R_NV, 0)
            If TypeName(r) <> "Error" Then
                KQ(k, 3) = NV(r, 2)
            Else
                KQ(k, 3) = "Ko co nhan vien nay trong danh sach"
            End If
        KQ(k, 4) = 1: tong_so_hang = tong_so_hang + 1
         KQ(k, 5) = 1: tong_so_hang_thuong = tong_so_hang_thuong + 1
        KQ(k, 7) = "=RC[-2]*RC[-1]"
    Else
    j = dic.Item(data(i, 2))
        KQ(j, 4) = KQ(j, 4) + 1: tong_so_hang = tong_so_hang + 1
        If UCase(Left(data(i, 4), 1)) = "C" Then KQ(k, 5) = KQ(j, 5) + 1: tong_so_hang_thuong = tong_so_hang_thuong + 1
    End If
    End If
    End If
Next i
k = k + 1
KQ(k, 2) = "Tong"
KQ(k, 4) = tong_so_hang
KQ(k, 5) = tong_so_hang_thuong
KQ(k, 7) = "=SUM(R[-" & k - 1 & "]C:R[-1]C)"

With Sheets("Thuong_ban_hang")
.[a11:H6000].Clear
.[a11].Resize(k, 8) = KQ
.[a11].Resize(k, 8).Borders.Weight = xlThin
End With
End Sub
- Anh ơi!.
- Em đã chuẩn hóa lại dữ liệu giữa sheet(Nhan_vien) và sheet(DATA) rồi chạy code bài #28 code như trong file đính kèm thì kết quả không đúng như em tét bằng công thức ở sheet(Thuong_ban_hang (2)).
- Em tải lại file đính kèm, mong Anh và mọi người xem giúp em với.
 

File đính kèm

Upvote 0
- Câu lệnh này:
If UCase(Left(data(i, 4), 1)) = "C" Then
đặt trong code như trên bài #28 thì lọc ra những người bán được những mặt hàng có thưởng. Tuy nhiên tại cột tổng các mặt hàng bán được thì không còn chính xác nữa [Tổng các mặt hàng bán được bao gồm cả có thưởng, không thưởng và không ghi gì ở cột Ak của sheet(DATA)]. Em mần mãi mà chẳng biets sửa làm sao. Mọi người giúp em với.
 
Lần chỉnh sửa cuối:
Upvote 0
- Câu lệnh này:
đặt trong code như trên bài #28 thì lọc ra những người bán được những mặt hàng có thưởng. Tuy nhiên tại cột tổng các mặt hàng bán được thì không còn chính xác nữa. Em mần mãi mà chẳng biets sửa làm sao. Mọi người giúp em với.
hôm nay Chủ Nhật không ai xem bài viết của bạn cũng không có gì lạ . bạn muốn đợi Let's Gâu Gâu thì có thể chiều tối hoặc mai người ta nghỉ cuối tuần xong rồi người ta giúp bạn
 
Upvote 0
hôm nay Chủ Nhật không ai xem bài viết của bạn cũng không có gì lạ . bạn muốn đợi Let's Gâu Gâu thì có thể chiều tối hoặc mai người ta nghỉ cuối tuần xong rồi người ta giúp bạn
- Hôm trước Let's Gâu Gâu làm cho mình do dữ liệu mình giả lập không đề phòng được hết các trường hợp. Mình cũng không nghĩ ra. Hồi hôm lọc danh sách trình sếp ký duyệt thì mới thấy là chỉ cần lọc tên người ứng với các mặt hàng được thưởng.
- Trong khi mong đợi cách giải của anh Let's Gâu Gâu. Bạn giúp mình một cách với!.
 
Upvote 0
- Hôm trước Let's Gâu Gâu làm cho mình do dữ liệu mình giả lập không đề phòng được hết các trường hợp. Mình cũng không nghĩ ra. Hồi hôm lọc danh sách trình sếp ký duyệt thì mới thấy là chỉ cần lọc tên người ứng với các mặt hàng được thưởng.
- Trong khi mong đợi cách giải của anh Let's Gâu Gâu. Bạn giúp mình một cách với!.

bạn hỏi tôi giải pháp thay vì Let's Gâu Gâu chẳng khác nào bỏ ngọc lấy đá
mấy cái zụ này tôi đâu có biết làm mà chỉ được bạn
Let's Gâu Gâu đã có tham gia thì sẽ không để bạn bơ vơ đâu mà sợ
 
Upvote 0
bạn hỏi tôi giải pháp thay vì Let's Gâu Gâu chẳng khác nào bỏ ngọc lấy đá
mấy cái zụ này tôi đâu có biết làm mà chỉ được bạn
Let's Gâu Gâu đã có tham gia thì sẽ không để bạn bơ vơ đâu mà sợ
- Tôi đâu nói là thay?. Chỉ mong với bài của tôi nếu nhiều cách làm thì đó cũng chính là các giải pháp mà tôi được học hỏi thêm!.
 
Upvote 0
- Anh ơi!.
- Em đã chuẩn hóa lại dữ liệu giữa sheet(Nhan_vien) và sheet(DATA) rồi chạy code bài #28 code như trong file đính kèm thì kết quả không đúng như em tét bằng công thức ở sheet(Thuong_ban_hang (2)).
- Em tải lại file đính kèm, mong Anh và mọi người xem giúp em với.

Nhâm nhi trong lúc chờ đợi
Mã:
Public Sub Co_Khong()
Dim DSach, Tam(), kq(), r As Long, i

DSach = Sheet3.Range("AI6", Sheet3.Range("AK1000000").End(xlUp))
Tam = Sheet2.Range("C3", Sheet2.Range("D1000000").End(xlUp))

With CreateObject("scripting.dictionary")
For r = 1 To UBound(Tam)
.Add Tam(r, 1), Array(Tam(r, 2), 0, 0)
Next r
ReDim Tam(2)

For r = 1 To UBound(DSach)
If DSach(r, 1) <> "" And DSach(r, 3) <> "" Then
Tam = .Item(DSach(r, 1))
Tam(1) = Tam(1) + 1
If Left(DSach(r, 3), 1) = "C" Then Tam(2) = Tam(2) + 1
.Item(DSach(r, 1)) = Tam
End If
Next r
Tam = .keys
ReDim kq(1 To .Count + 1, 1 To 4)

For r = 0 To UBound(Tam)
If .Item(Tam(r))(1) + .Item(Tam(r))(2) > 0 Then
i = i + 1
kq(i, 1) = Tam(r)
kq(i, 2) = .Item(Tam(r))(0)
kq(i, 3) = .Item(Tam(r))(1)
kq(i, 4) = .Item(Tam(r))(2)
kq(.Count + 1, 3) = kq(.Count + 1, 3) + .Item(Tam(r))(1)
kq(.Count + 1, 4) = kq(.Count + 1, 4) + .Item(Tam(r))(2)
End If
Next r
kq(i + 1, 1) = "Tong"
kq(i + 1, 3) = kq(.Count + 1, 3)
kq(i + 1, 4) = kq(.Count + 1, 4)
End With

Sheet1.Range("A11", "H" & Sheet1.Range("B1000000").End(xlUp).Row).Clear
Sheet1.Range("B11").Resize(i + 1, 4) = kq
Sheet1.Range("A11").Resize(i) = "=row()-10"
Sheet1.Range("G11").Resize(i) = "=RC[-2]*RC[-1]"
End Sub
 
Upvote 0
Nhâm nhi trong lúc chờ đợi

Gtri làm thì ok rồi, còn chờ đợi gì nữa, có điều sao phải xài tới 3 vòng lặp, bỏ bớt được ko?

============
hôm nay Chủ Nhật không ai xem bài viết của bạn cũng không có gì lạ . bạn muốn đợi Let's Gâu Gâu thì có thể chiều tối hoặc mai người ta nghỉ cuối tuần xong rồi người ta giúp bạn
sáng thứ 7, cn phải d0i "chăn" con gái học av..........
 
Lần chỉnh sửa cuối:
Upvote 0
Nhâm nhi trong lúc chờ đợi
Mã:
Public Sub Co_Khong()
Dim DSach, Tam(), kq(), r As Long, i

DSach = Sheet3.Range("AI6", Sheet3.Range("AK1000000").End(xlUp))
Tam = Sheet2.Range("C3", Sheet2.Range("D1000000").End(xlUp))

With CreateObject("scripting.dictionary")
For r = 1 To UBound(Tam)
.Add Tam(r, 1), Array(Tam(r, 2), 0, 0)
Next r
ReDim Tam(2)

For r = 1 To UBound(DSach)
If DSach(r, 1) <> "" And DSach(r, 3) <> "" Then
Tam = .Item(DSach(r, 1))
Tam(1) = Tam(1) + 1
If Left(DSach(r, 3), 1) = "C" Then Tam(2) = Tam(2) + 1
.Item(DSach(r, 1)) = Tam
End If
Next r
Tam = .keys
ReDim kq(1 To .Count + 1, 1 To 4)

For r = 0 To UBound(Tam)
If .Item(Tam(r))(1) + .Item(Tam(r))(2) > 0 Then
i = i + 1
kq(i, 1) = Tam(r)
kq(i, 2) = .Item(Tam(r))(0)
kq(i, 3) = .Item(Tam(r))(1)
kq(i, 4) = .Item(Tam(r))(2)
kq(.Count + 1, 3) = kq(.Count + 1, 3) + .Item(Tam(r))(1)
kq(.Count + 1, 4) = kq(.Count + 1, 4) + .Item(Tam(r))(2)
End If
Next r
kq(i + 1, 1) = "Tong"
kq(i + 1, 3) = kq(.Count + 1, 3)
kq(i + 1, 4) = kq(.Count + 1, 4)
End With

Sheet1.Range("A11", "H" & Sheet1.Range("B1000000").End(xlUp).Row).Clear
Sheet1.Range("B11").Resize(i + 1, 4) = kq
Sheet1.Range("A11").Resize(i) = "=row()-10"
Sheet1.Range("G11").Resize(i) = "=RC[-2]*RC[-1]"
End Sub
- Cảm ơn bạn đã thêm một cách viêt. Có một vài chỗ trong cách viết của bạn mà mình chưa hiểu được mình sẽ tìm hiểu ngay.
- Anh Let's Gâu Gâu sửa lại code giúp em, em nhìn code của Anh đối với bài này cũng đã quen. Mong anh sửa lại giúp để em áp dụng ngay.
- Còn các phương án mà các bạn khác giúp mình, mình sẽ tìm hiểu và học từ từ mới được.
 
Upvote 0
Nhâm nhi trong lúc chờ đợi
Mã:
Public Sub Co_Khong()
Dim DSach, Tam(), kq(), r As Long, i

DSach = Sheet3.Range("AI6", Sheet3.Range("AK1000000").End(xlUp))
Tam = Sheet2.Range("C3", Sheet2.Range("D1000000").End(xlUp))

With CreateObject("scripting.dictionary")
For r = 1 To UBound(Tam)
.Add Tam(r, 1), Array(Tam(r, 2), 0, 0)
Next r
ReDim Tam(2)

For r = 1 To UBound(DSach)
If DSach(r, 1) <> "" And DSach(r, 3) <> "" Then
Tam = .Item(DSach(r, 1))
Tam(1) = Tam(1) + 1
If Left(DSach(r, 3), 1) = "C" Then Tam(2) = Tam(2) + 1
.Item(DSach(r, 1)) = Tam
End If
Next r
Tam = .keys
ReDim kq(1 To .Count + 1, 1 To 4)

For r = 0 To UBound(Tam)
If .Item(Tam(r))(1) + .Item(Tam(r))(2) > 0 Then
i = i + 1
kq(i, 1) = Tam(r)
kq(i, 2) = .Item(Tam(r))(0)
kq(i, 3) = .Item(Tam(r))(1)
kq(i, 4) = .Item(Tam(r))(2)
kq(.Count + 1, 3) = kq(.Count + 1, 3) + .Item(Tam(r))(1)
kq(.Count + 1, 4) = kq(.Count + 1, 4) + .Item(Tam(r))(2)
End If
Next r
kq(i + 1, 1) = "Tong"
kq(i + 1, 3) = kq(.Count + 1, 3)
kq(i + 1, 4) = kq(.Count + 1, 4)
End With

Sheet1.Range("A11", "H" & Sheet1.Range("B1000000").End(xlUp).Row).Clear
Sheet1.Range("B11").Resize(i + 1, 4) = kq
Sheet1.Range("A11").Resize(i) = "=row()-10"
Sheet1.Range("G11").Resize(i) = "=RC[-2]*RC[-1]"
End Sub
- Mình không hiểu lắm, nhưng có chỉnh lại một chút thì Thấy kết quả đúng như mình làm bằng công thức:
Mã:
Public Sub Co_Khong()    Dim DSach, Tam(), kq(), r As Long, i
    DSach = Sheet3.Range("AI6", Sheet3.Range("AK1000000").End(xlUp))
    Tam = Sheet2.Range("C3", Sheet2.Range("D1000000").End(xlUp))
    With CreateObject("scripting.dictionary")
        For r = 1 To UBound(Tam)
            .Add Tam(r, 1), Array(Tam(r, 2), 0, 0)
        Next r
        ReDim Tam(2)
        For r = 1 To UBound(DSach)
            If DSach(r, 1) <> "" Then 'And DSach(r, 3) <> ""
                Tam = .Item(DSach(r, 1))
                Tam(1) = Tam(1) + 1
                If Left(DSach(r, 3), 1) = "C" Then Tam(2) = Tam(2) + 1
                .Item(DSach(r, 1)) = Tam
            End If
        Next r
        Tam = .keys
        ReDim kq(1 To .Count + 1, 1 To 4)
        For r = 0 To UBound(Tam)
            If .Item(Tam(r))(1) + .Item(Tam(r))(2) > 0 Then
                i = i + 1
                kq(i, 1) = Tam(r)
                kq(i, 2) = .Item(Tam(r))(0)
                kq(i, 3) = .Item(Tam(r))(1)
                kq(i, 4) = .Item(Tam(r))(2)
                kq(.Count + 1, 3) = kq(.Count + 1, 3) + .Item(Tam(r))(1)
                kq(.Count + 1, 4) = kq(.Count + 1, 4) + .Item(Tam(r))(2)
            End If
        Next r
        kq(i + 1, 1) = "Tong"
        kq(i + 1, 3) = kq(.Count + 1, 3)
        kq(i + 1, 4) = kq(.Count + 1, 4)
    End With
    Sheet1.Range("A11", "H" & Sheet1.Range("B1000000").End(xlUp).Row).Clear
    Sheet1.Range("B11").Resize(i + 1, 4) = kq
    Sheet1.Range("A11").Resize(i) = "=row()-10"
    Sheet1.Range("G11").Resize(i) = "=RC[-2]*RC[-1]"
End Sub
- Mong được bạn hướng dẫn giải thích hoặc chỉ giúp mình ý nghĩa của các câu lệnh sau để mình áp dụng với!.
.Add Tam(r, 1), Array(Tam(r, 2), 0, 0)
- Mảng ReDim Tam(2) là mảng có mấy phần tử ?
- Còn câu này? Tam = .keys có nghĩa là gì a.?
Cảm ơn bạn đã giúp mình
 
Lần chỉnh sửa cuối:
Upvote 0
- Mong được bạn hướng dẫn giải thích hoặc chỉ giúp mình ý nghĩa của các câu lệnh sau để mình áp dụng với!.

- Mảng ReDim Tam(2) là mảng có mấy phần tử ?
- Còn câu này? Tam = .keys có nghĩa là gì a.?
Cảm ơn bạn đã giúp mình
theo tôi nếu bạn không hiểu dòng
Mã:
ReDim Tam(2)
thì bạn nên xóa luôn dòng đó chạy thử xem =))
lúc này là đưa vô
Mã:
.Add Tam(r, 1), [COLOR=#ff0000][B]Array(Tam(r, 2), 0, 0[/B][/COLOR][COLOR=#000000])[/COLOR][COLOR=#ff0000][/COLOR]
lúc này là lấy ra sử dụng
Mã:
[COLOR=#ff0000][B]Tam[/B][/COLOR] = .Item(DSach(r, 1))
giá trị của Tam màu đỏ ở dưới chính là cái thằng màu đỏ ở trên đấy
 
Upvote 0
- Bạn gtri ơi mình đã kiểm tra lại:
+ Nếu mình bỏ đi dòng này
trong code của bạn thì code vẫn lọc những người có mặt hàng không có thưởng, như vậy là không được. Còn để nguyên thì ở cột tổng các mặt hàng báng được là không chính xác.
+ bạn xem lại giúp mình với!.Ket quả bang cong thuc.jpg
Ket quả chay code.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
- Bạn gtri ơi mình đã kiểm tra lại:
+ Nếu mình bỏ đi dòng này trong code của bạn thì code vẫn lọc những người có mặt hàng không có thưởng, như vậy là không được. Còn để nguyên thì ở cột tổng các mặt hàng báng được là không chính xác.
+ bạn xem lại giúp mình với!.View attachment 144450
View attachment 144451

"Tổng số mặt hàng bán được" được tính theo cột số 36 hay 37 hay là 34 sheet DATA?
 
Lần chỉnh sửa cuối:
Upvote 0
- Anh Let's Gâu Gâu sửa lại code giúp em, em nhìn code của Anh đối với bài này cũng đã quen. Mong anh sửa lại giúp để em áp dụng ngay.

code cũ chạy sai (do khai báo biến cho mảng kết quả sai, thay vì j thì khai là k)
thực ra thì trong file của bạn, tất cả các nhân viên đều tham gian bán hàng có thưởng
trong file này tôi thử xóa mục có của "nguyễn thi mơ"
 

File đính kèm

Upvote 0
Sửa lại với giả định
"Người bán hàng" sheet DATA để trống sẽ bị loại ( kể cả có thưởng - AI39 sheet DATA )
"Tổng số mặt hàng bán được" tính theo cột số 36 sheet DATA
"Số lượng mặt hàng được thưởng" =0 sẽ bị loại

Mã:
Option Explicit
Public Sub Co_Khong()
    Dim DSach, Tam(), kq(), r As Long, i
    DSach = Sheet3.Range("AI6", Sheet3.Range("AK1000000").End(xlUp))
    Tam = Sheet2.Range("C3", Sheet2.Range("D1000000").End(xlUp))
    With CreateObject("scripting.dictionary")
        For r = 1 To UBound(Tam)
            .Add Tam(r, 1), Array(Tam(r, 2), 0, 0)
        Next r
        ReDim Tam(2)
        For r = 1 To UBound(DSach)
            If DSach(r, 1) <> "" And DSach(r, 2) <> "" Then   'Sửa điều kiện nhập liệu
                Tam = .Item(DSach(r, 1))
                Tam(1) = Tam(1) + 1
                If Left(DSach(r, 3), 1) = "C" Then Tam(2) = Tam(2) + 1
                .Item(DSach(r, 1)) = Tam
            End If
        Next r
        Tam = .keys
        ReDim kq(1 To .Count + 1, 1 To 4)
        For r = 0 To UBound(Tam)
            If .Item(Tam(r))(2) > 0 Then   'Sửa điều kiện truy xuất
                i = i + 1
                kq(i, 1) = Tam(r)
                kq(i, 2) = .Item(Tam(r))(0)
                kq(i, 3) = .Item(Tam(r))(1)
                kq(i, 4) = .Item(Tam(r))(2)
                kq(.Count + 1, 3) = kq(.Count + 1, 3) + .Item(Tam(r))(1)
                kq(.Count + 1, 4) = kq(.Count + 1, 4) + .Item(Tam(r))(2)
            End If
        Next r
        kq(i + 1, 1) = "Tong"
        kq(i + 1, 3) = kq(.Count + 1, 3)
        kq(i + 1, 4) = kq(.Count + 1, 4)
    End With
    Sheet1.Range("A11", "H" & Sheet1.Range("B1000000").End(xlUp).Row).Clear
    Sheet1.Range("B11").Resize(i + 1, 4) = kq
    Sheet1.Range("A11").Resize(i) = "=row()-10"
    Sheet1.Range("G11").Resize(i) = "=RC[-2]*RC[-1]"
End Sub

To Let's Gâu Gâu : Bớt vòng lặp điền trực tiếp vào mảng làm không quen, sợ bị rối nên để 3 cái vòng cho lành. Thank
 
Lần chỉnh sửa cuối:
Upvote 0
code cũ chạy sai (do khai báo biến cho mảng kết quả sai, thay vì j thì khai là k)
thực ra thì trong file của bạn, tất cả các nhân viên đều tham gian bán hàng có thưởng
trong file này tôi thử xóa mục có của "nguyễn thi mơ"
- Ở trong file dữ liệu em gửi thì tất tất cả các nhân viên đều tham gian bán hàng có thưởng, nhưng thực tế thì không phải như vậy. với danh sách còn nữa thì Có những nhân viên bán những mặt hàng không có thưởng. Như trong file anh gửi, Anh xóa đi mục có thưởng của "nguyễn thi mơ". Kết quả OK. Nhưng cũng trong file đó em thử xóa thêm trường hợp có thưởng của "Hà Thanh Hùng" ở aheet (DATA) và chạy code thì kết quả không được nư mong đợi. Anh xem giúp em với!.
 
Upvote 0
Sửa lại với giả định
"Người bán hàng" sheet DATA để trống sẽ bị loại ( kể cả có thưởng - AI39 sheet DATA )
"Tổng số mặt hàng bán được" tính theo cột số 36 sheet DATA
"Số lượng mặt hàng được thưởng" =0 sẽ bị loại

Mã:
Option Explicit
Public Sub Co_Khong()
    Dim DSach, Tam(), kq(), r As Long, i
    DSach = Sheet3.Range("AI6", Sheet3.Range("AK1000000").End(xlUp))
    Tam = Sheet2.Range("C3", Sheet2.Range("D1000000").End(xlUp))
    With CreateObject("scripting.dictionary")
        For r = 1 To UBound(Tam)
            .Add Tam(r, 1), Array(Tam(r, 2), 0, 0)
        Next r
        ReDim Tam(2)
        For r = 1 To UBound(DSach)
            If DSach(r, 1) <> "" And DSach(r, 2) <> "" Then   'Sửa điều kiện nhập liệu
                Tam = .Item(DSach(r, 1))
                Tam(1) = Tam(1) + 1
                If Left(DSach(r, 3), 1) = "C" Then Tam(2) = Tam(2) + 1
                .Item(DSach(r, 1)) = Tam
            End If
        Next r
        Tam = .keys
        ReDim kq(1 To .Count + 1, 1 To 4)
        For r = 0 To UBound(Tam)
            If .Item(Tam(r))(2) > 0 Then   'Sửa điều kiện truy xuất
                i = i + 1
                kq(i, 1) = Tam(r)
                kq(i, 2) = .Item(Tam(r))(0)
                kq(i, 3) = .Item(Tam(r))(1)
                kq(i, 4) = .Item(Tam(r))(2)
                kq(.Count + 1, 3) = kq(.Count + 1, 3) + .Item(Tam(r))(1)
                kq(.Count + 1, 4) = kq(.Count + 1, 4) + .Item(Tam(r))(2)
            End If
        Next r
        kq(i + 1, 1) = "Tong"
        kq(i + 1, 3) = kq(.Count + 1, 3)
        kq(i + 1, 4) = kq(.Count + 1, 4)
    End With
    Sheet1.Range("A11", "H" & Sheet1.Range("B1000000").End(xlUp).Row).Clear
    Sheet1.Range("B11").Resize(i + 1, 4) = kq
    Sheet1.Range("A11").Resize(i) = "=row()-10"
    Sheet1.Range("G11").Resize(i) = "=RC[-2]*RC[-1]"
End Sub

To Let's Gâu Gâu : Bớt vòng lặp điền trực tiếp vào mảng làm không quen, sợ bị rối nên để 3 cái vòng cho lành. Thank
- "Người bán hàng" sheet DATA để trống sẽ bị loại ( kể cả có thưởng - AI39 sheet DATA ) ----->OK
- Tỏng số hàng bán được của một nhân viên là số lần tên nhân viên đó xuất hiện ở cột 35 Sheet(DATA). Nhân viên có thể bán các mặt hàng có thưởng, không có thưởng (trong nhập liệu thì "không có thưởng" mình sẽ bỏ trống không nhập).
- "Số lượng mặt hàng được thưởng" =0 (ở sheet Thuong_ban_hang) sẽ bị loại ----->OK
- Bạn sử lại code giúp mình để mình nghiên cứu thêm cách viết của bạn nhé!. Cảm ơn bạn
 
Upvote 0
- "Người bán hàng" sheet DATA để trống sẽ bị loại ( kể cả có thưởng - AI39 sheet DATA ) ----->OK
- Tỏng số hàng bán được của một nhân viên là số lần tên nhân viên đó xuất hiện ở cột 35 Sheet(DATA). Nhân viên có thể bán các mặt hàng có thưởng, không có thưởng (trong nhập liệu thì "không có thưởng" mình sẽ bỏ trống không nhập).
- "Số lượng mặt hàng được thưởng" =0 (ở sheet Thuong_ban_hang) sẽ bị loại ----->OK
- Bạn sử lại code giúp mình để mình nghiên cứu thêm cách viết của bạn nhé!. Cảm ơn bạn

Sửa dòng này trong bài 43
Mã:
If DSach(r, 1) <> "" And DSach(r, 2) <> "" Then   'Sửa điều kiện nhập liệu
Thành thế này
Mã:
If DSach(r, 1) <> ""  Then   'Sửa điều kiện nhập liệu
Là đạt yêu cầu phần tô đậm.
 
Upvote 0
- Ở trong file dữ liệu em gửi thì tất tất cả các nhân viên đều tham gian bán hàng có thưởng, nhưng thực tế thì không phải như vậy. với danh sách còn nữa thì Có những nhân viên bán những mặt hàng không có thưởng. Như trong file anh gửi, Anh xóa đi mục có thưởng của "nguyễn thi mơ". Kết quả OK. Nhưng cũng trong file đó em thử xóa thêm trường hợp có thưởng của "Hà Thanh Hùng" ở aheet (DATA) và chạy code thì kết quả không được nư mong đợi. Anh xem giúp em với!.

haiz............
xài vlookup, sumifs, subtotal và sau đó chỉ cẩn filter chỉ có 30s là có kết quả, viết code chi cho nó mệt vậy...............hhihihi
kỳ này mà hỏng trúng nữa thì "em xin hàng"
 

File đính kèm

Upvote 0
Sửa dòng này trong bài 43
Mã:
If DSach(r, 1) <> "" And DSach(r, 2) <> "" Then   'Sửa điều kiện nhập liệu
Thành thế này
Mã:
If DSach(r, 1) <> ""  Then   'Sửa điều kiện nhập liệu
Là đạt yêu cầu phần tô đậm.
- Cảm ơn bạn nhiều!. vậy là mình có thêm một cách để tìm hiểu "lại khổ thêm -+*/--=0" mà còn không biết có hiểu nổi không, nhìn hoa hết cả mặt?.
- Em vẫn mong code Anh Let'GâuGâu vì code trước đó đã sử lý trong trường hợp nhân viên không có trong danh sách sheet(Nhan_vien) mà có trong nhập liệu của sheet(DATA).
 
Upvote 0
haiz............
xài vlookup, sumifs, subtotal và sau đó chỉ cẩn filter chỉ có 30s là có kết quả, viết code chi cho nó mệt vậy...............hhihihi
kỳ này mà hỏng trúng nữa thì "em xin hàng"
- Code đã lọc chuẩn rồi ạ!. Cảm ơn Anh Let'GâuGâu nhiều nha!.
- Cảm ơn Bác gtri và mọi người!. Với 2 cách viết của 2 Bác để mà hiểu được thì em phải đọc không biết bao nhiêu chủ đề của GPE này + với hỏi bao nhiêu bài nữa híc híc!$@!!!$@!!!. Để mà hiểu từng câu lệnh chứ chưa nói là để viết code.
 
Upvote 0

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

Back
Top Bottom