Các hàm tự tạo thông thường (UDF) chỉ trả về giá trị kết quả tại chính ô đó. Excel nghiêm cấm việc trả về các định dạng, thay đổi giá trị của ô khác, xóa thêm sheet.....
Để lách luật trên, có 1 số kỹ thuật mà các anh chị trong diễn đàn hay dùng. Một trong những kỹ thuật tiêu biểu mà làm hết được các yêu cầu bị cấm trên là dùng kỹ thuật
"Thực thi trễ"
Cái này em thấy tác giả Hesanbi thực hiện nhiều. Buổi sáng khi viết hàm cho chủ thớt (hàm AllBorder) tô viền toàn bộ ô thì được nhưng khi xóa đường viên hoặc chỉ vẽ 1 phần đường viền thì không được. Khi đó em mới thử viết kiểu của Hesanbi. e thấy quy luật như sau:
1. ở hàm chính: thay vì thực hiện lệnh luôn thì chỉ gọi Settimer với độ chễ 10 mili giây sau đó chạy Sub call back ở sau
2. Trong 10ms đó excel thực hiện quy trình tính toán và mở khóa giao diện
3. Hết 10ms window thực hiện sub Call back. Lúc này exel đã tính toán xong, còn rảnh nên code vba ở sub call back lúc này được phép thay đổi định dạng (kẻ khung, tô màu....) thoải mái mà không bị chặn.
Note1: Việc dùng settimer rất nguy hiểm vì tạo ra một vòng lặp liên tục theo chu kỳ (giống như kim giây đồng hồ, cứ mỗi X ms nó gõ 1 cái). Do đó cặp Settimer và Killtimer luôn đi kèm với nhau kiểu tạo vòng lặp và xóa vòng lặp đó. Em thấy tác giả Hesanbi tạo luôn Killtimer ở đầu thủ tục call back để thủ tục không chạy lại mỗi 10s 1 lần. (gọi liên tục như thế excel sẽ đơ lag, treo ......)
P/s đấy là em rút ra sau nhiều lần đọc code của tác giả trên, còn cần chia sẻ chi tiết phải chờ tác giả chia sẻ
Dùng settimer và killtimer để làm gì vậy bạn? Thực tình là tôi có thấy mấy lần nhưng không hiểu