Code vba thay thế cho hàm COUNTIFS

Liên hệ QC

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

  • Thuong doanh so.rar
    63.8 KB · Đọc: 108
- 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

  • Thuong doanh so_1.rar
    88.3 KB · Đọc: 46
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

  • Thuong doanh so_1.rar
    49.5 KB · Đọc: 59
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
Web KT
Back
Top Bottom