Nhờ giúp đỡ công thức vba lọc có điều kiện

Liên hệ QC

nguyenkar

Thành viên mới
Tham gia
6/3/22
Bài viết
26
Được thích
6
Mình có đăng 1 bài nhờ giúp đỡ bên box gỡ rối công thức nhưng có bạn nói sai địa chỉ nên mình hỏi lại ở bên đây ạ.
link bài cũ: https://www.giaiphapexcel.com/diendan/threads/nhờ-mọi-người-giúp-đỡ-công-thức-update.163041/
Vấn đề cần hỏi:
Mình dùng vba để làm cái báo cáo cho bảng dữ liệu như trong file đính kèm nhưng không được như ý muốn, mong mọi người giúp đỡ sửa công thức với ạ.
Yêu cầu là nhấn update thì in ra những dữ liệu đang có từ sheet 1 sang sheet 2 (mình làm bị in sai cột và in hết chứ không cắt được dòng chưa có dữ liệu).
Phần in tên mình chưa làm được, ý tưởng là so sánh 2 mảng để lấy ra kết quả nhưng không thành công. Mong mọi người giúp đỡ ạ.

Update:
Mình vẫn đã giải quyết được phần in dư và đang nghiên cứu tiếp phương pháp dùng Dic để lấy kết quả. Do mới tập tành vba nên có nhiều cái vẫn cần học hỏi ạ. Hiện tại mình đang thử 2 phương án
1. Add tất cả ô trong bảng dữ liệu vào Dic, sau đó so sánh cột stt với stt ngang, nếu có thì in phần có ra
2. So sánh cột stt dọc với stt ngang, nếu có thì tạo và ghi vào dic, không có thì không ghi, sau đó in Dic ra.

Cả 2 phương pháp đều chưa làm được thành code ạ, rất mong các anh chị cho ý kiến.
 

File đính kèm

  • bangkiemtra.xlsm
    33.7 KB · Đọc: 11
Giải pháp
Đúng ra bạn nên điền tay kết quả mong muốn bên sheet tongket và mọi người sẽ giúp bạn code.
Trong ví dụ của bạn thì danh sách học viên không trùng, không cần dùng dic.
Tạm thời dùng code này.
PHP:
Option Explicit
Sub inra()
Dim lr&, lc&, i&, j&, k&, rng, result(1 To 10000, 1 To 5)
With Sheets("kiemtra")
    lr = .Cells(Rows.Count, "C").End(xlUp).Row
    lc = .Cells(7, Columns.Count).End(xlToLeft).Column
    rng = .Range(.Cells(7, "C"), .Cells(lr, lc)).Value ' nap gia tri trong bang vao mang rng
End With
For j = 5 To UBound(rng, 2) ' loop tu cot 5 cua rng
    If rng(2, j) <> "" Then
        For i = 4 To UBound(rng) ' loop tu dong 4 cua rng
            If rng(2, j) = rng(i, 1) Then
                k = k + 1
                result(k, 1) =...
Sau 2 ngày mò mẫm dò dẫm thì mình cũng đã tìm được phương pháp xử lý khá là cồng kềnh, và theo mình nghĩ là chuối hơn cả dùng match index.
Rất cảm ơn @batman1 vì đoạn code copy của bạn, cảm ơn luôn bạn @tuhumg00 vì bài viết hỏi của bạn mà mình mới tìm ra hướng giải quyết.

Nhân đây nhờ @batman1 và các anh chị trong diễn đàn chỉnh giúp em đoạn code này cho đỡ rườm rà phức tạp hơn được không? Em mới tiếp xúc với vba chưa tròn tháng nên code còn yếu quá, không tìm ra hướng giải quyết khác. Mong các anh chị giúp đỡ.
 

File đính kèm

  • bangkiemtra.xlsm
    32.9 KB · Đọc: 12
Upvote 0
Đúng ra bạn nên điền tay kết quả mong muốn bên sheet tongket và mọi người sẽ giúp bạn code.
Trong ví dụ của bạn thì danh sách học viên không trùng, không cần dùng dic.
Tạm thời dùng code này.
PHP:
Option Explicit
Sub inra()
Dim lr&, lc&, i&, j&, k&, rng, result(1 To 10000, 1 To 5)
With Sheets("kiemtra")
    lr = .Cells(Rows.Count, "C").End(xlUp).Row
    lc = .Cells(7, Columns.Count).End(xlToLeft).Column
    rng = .Range(.Cells(7, "C"), .Cells(lr, lc)).Value ' nap gia tri trong bang vao mang rng
End With
For j = 5 To UBound(rng, 2) ' loop tu cot 5 cua rng
    If rng(2, j) <> "" Then
        For i = 4 To UBound(rng) ' loop tu dong 4 cua rng
            If rng(2, j) = rng(i, 1) Then
                k = k + 1
                result(k, 1) = rng(2, j): result(k, 2) = rng(3, j)
                result(k, 3) = rng(1, j)
                result(k, 4) = rng(i, 2) & " - " & rng(i, 3)
                result(k, 5) = k
                Exit For ' thoat vong lap dong va tiep tuc vong lap cot
            End If
        Next
    End If
Next
With Sheets("tongket")
    .Range("C4:G10000").ClearContents ' Xoa du lieu cu
    If k > 0 Then .Range("C4").Resize(k, 5).Value = result ' dan du lieu moi vao
    .Activate
    .Range("C3").Select
End With
End Sub
 

File đính kèm

  • bangkiemtra (1).xlsm
    42 KB · Đọc: 21
Upvote 0
Giải pháp
Đúng ra bạn nên điền tay kết quả mong muốn bên sheet tongket và mọi người sẽ giúp bạn code.
Trong ví dụ của bạn thì danh sách học viên không trùng, không cần dùng dic.
Tạm thời dùng code này.
Vâng, em cảm ơn bác nhiều, em sẽ rút kinh nghiệm lần sau ạ. Qua bài này mới hiểu được nhiều thứ, lúc trước e cũng chỉ nghĩ nếu chuyển workbook hay worksheet thì range hay array sẽ reset nên mới tìm dic, giờ hiểu được rồi ạ.
 
Upvote 0
Đúng ra bạn nên điền tay kết quả mong muốn bên sheet tongket và mọi người sẽ giúp bạn code.
Trong ví dụ của bạn thì danh sách học viên không trùng, không cần dùng dic.
Tạm thời dùng code này.
PHP:
Option Explicit
Sub inra()
Dim lr&, lc&, i&, j&, k&, rng, result(1 To 10000, 1 To 5)
With Sheets("kiemtra")
    lr = .Cells(Rows.Count, "C").End(xlUp).Row
    lc = .Cells(7, Columns.Count).End(xlToLeft).Column
    rng = .Range(.Cells(7, "C"), .Cells(lr, lc)).Value ' nap gia tri trong bang vao mang rng
End With
For j = 5 To UBound(rng, 2) ' loop tu cot 5 cua rng
    If rng(2, j) <> "" Then
        For i = 4 To UBound(rng) ' loop tu dong 4 cua rng
            If rng(2, j) = rng(i, 1) Then
                k = k + 1
                result(k, 1) = rng(2, j): result(k, 2) = rng(3, j)
                result(k, 3) = rng(1, j)
                result(k, 4) = rng(i, 2) & " - " & rng(i, 3)
                result(k, 5) = k
                Exit For ' thoat vong lap dong va tiep tuc vong lap cot
            End If
        Next
    End If
Next
With Sheets("tongket")
    .Range("C4:G10000").ClearContents ' Xoa du lieu cu
    If k > 0 Then .Range("C4").Resize(k, 5).Value = result ' dan du lieu moi vao
    .Activate
    .Range("C3").Select
End With
End Sub
Mong bác giúp em phát nữa ạ. Bảng dữ liệu đổi thành điểm số, em muốn thêm 2 cột sum điểm của cá nhân và điểm theo từng lượt vào array luôn thì phải làm sao ạ?
 

File đính kèm

  • bangkiemtra (1).xlsm
    42.5 KB · Đọc: 5
Upvote 0
Góp 1 ý nhỏ với chủ bài đăng (& có thể coi là ngoài lề) nhưng quan trong trong xây dựng CSDL:
Hoàn toàn không nên trong 1 cột lại chứa 2 loại thông tin như của bạn hiện tại:

TÊN HỌC VIÊNTHỨ TỰ KIỂM TRATổng điểm cá nhânTổng điểm theo Lượt
Hà Văn Năng - Nam
1​
57​
115​
Trần Thị Bảy - Nữ
2​
54​
117​
Hoàng Nhật Khánh - Nữ
3​
60​
124​
Nguyễn Thị Thu Thuỷ - Nữ
4​
50​
111​
Lê Văn Được - Nam
5​
50​
117​
Trần Văn Hiệp - Nam
6​
58​
117​
Hồng Văn Bé Tám - Nữ
7​
53​
118​

Mà nên là như ví dụ:




STTHo & Ten
1Võ Thanh SangVTS00
2Võ Ngọc BíchVNB00
3Trần Văn HiệpTVH00
4Trần Thị BảyTTB00
5Trần Ngọc TuyếnTNT00
6Phạm Thanh ThảoPTT00
7Phạm Thanh ThảoPTT00
8Nguyễn Thị Thu ThuỷNTT00
9Lê Văn ĐượcLVF00
10Lê Ngọc BíchLNB00
11Hà Văn NăngHVN00
12Hoàng Nhật KhánhHNK01
13Hoàng Nhật KhánhHNK00
14Hồng Văn Bé TámHBT00
15Hoàng Bích DiệpHBD00
16Dương ĐỗDJF00

Lúc đó ta nên xài mã (duy nhất) của mỗi học viên/nhân viên thay vì cột 'TÊN HỌC VIÊN' đang có của bạn.


Chúc các bạn có ngày vui!
 
Upvote 0
Góp 1 ý nhỏ với chủ bài đăng (& có thể coi là ngoài lề) nhưng quan trong trong xây dựng CSDL:
Hoàn toàn không nên trong 1 cột lại chứa 2 loại thông tin như của bạn hiện tại:

TÊN HỌC VIÊNTHỨ TỰ KIỂM TRATổng điểm cá nhânTổng điểm theo Lượt
Hà Văn Năng - Nam
1​
57​
115​
Trần Thị Bảy - Nữ
2​
54​
117​
Hoàng Nhật Khánh - Nữ
3​
60​
124​
Nguyễn Thị Thu Thuỷ - Nữ
4​
50​
111​
Lê Văn Được - Nam
5​
50​
117​
Trần Văn Hiệp - Nam
6​
58​
117​
Hồng Văn Bé Tám - Nữ
7​
53​
118​

Mà nên là như ví dụ:




STTHo & Ten
1Võ Thanh SangVTS00
2Võ Ngọc BíchVNB00
3Trần Văn HiệpTVH00
4Trần Thị BảyTTB00
5Trần Ngọc TuyếnTNT00
6Phạm Thanh ThảoPTT00
7Phạm Thanh ThảoPTT00
8Nguyễn Thị Thu ThuỷNTT00
9Lê Văn ĐượcLVF00
10Lê Ngọc BíchLNB00
11Hà Văn NăngHVN00
12Hoàng Nhật KhánhHNK01
13Hoàng Nhật KhánhHNK00
14Hồng Văn Bé TámHBT00
15Hoàng Bích DiệpHBD00
16Dương ĐỗDJF00

Lúc đó ta nên xài mã (duy nhất) của mỗi học viên/nhân viên thay vì cột 'TÊN HỌC VIÊN' đang có của bạn.


Chúc các bạn có ngày vui!
Vâng cảm ơn bác đã góp ý, lúc đầu em cũng định tách ra cột giới tính mà nhìn nó hơi rối nên gộp vào luôn ạ. Rút kinh nghiệm lần sau e sẽ tách ra.
 
Upvote 0
Mong bác giúp em phát nữa ạ. Bảng dữ liệu đổi thành điểm số, em muốn thêm 2 cột sum điểm của cá nhân và điểm theo từng lượt vào array luôn thì phải làm sao ạ?
E đã giải quyết được rồi ạ, e thêm 1 range nữa bắt đầu từ cell G10 đến cells lastrow, lastcol, sau đó nạp vào arr1, transpose thành arr2, rồi gọi tổng các cột là result(k, 10) = WF.Sum(WF.Index(arr2, j - 4, 0)).

Chúc các bác 1 ngày vui vẻ, rất cảm ơn các bác đã giúp đỡ ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom