Giải thuật của bạn không phù hợp với cơ cấu. Dẫu có chỉnh sửa code cũng không thể nhanh.
Bạn phải xem lại toàn bộ cách sắp xếp dữ liệu.
Một khi cách xếp dữ liệu trên các bảng đã thống nhất rồi thì bạn có thể dùng giải thuật sau:
1. Lập một sheet tạm (STam)
2. Đọc từng sheet dữ liệu: copy vùng dữ liệu sang STam; ghi tên sheet vào cột cuối cùng
3. sort STam theo tên và môn học
4. đọc STam, tổng kết kết quả và ghi vào sheet kết quả
5. xoá STam
Nếu bạn muốn, có thể dùng ADO để thực hiện các bước 1-4 trên.
Cách khác (ví dụ bạn có mã thống nhất cho các môn học, toán=1, văn=2,...)
1. lập một array ứng với số môn, phần tử 1 ứng với toán, 2 ứng với văn,...
2. lập một dictionary
3. đọc bảng tên, ghi dictionary với key là tên, và value là array trống
4. đọc dữ liệu từng sheet, dùng tên làm key để lấy value và dùng tên sheet để chọn phần tử cập nhật điểm
5. duyệt dictionary, ghi kết quả vào sheet kết quả.
(*) đừng dùng tiếng "cao thủ". Tôi đọc thấy từ này tôi mắc cở lắm. Mắc cở cho tôi chưa xứng đáng và đồng thời cũng mắc cở cho cái tính chất nịnh bợ của từ này.