MẸO NHỎ KHI VIẾT VBA KHÔNG BỊ TREO EXCEL

5 comments
Nhiều bạn khi lập trình VBA nhưng lại không hiểu sao hàm của mình nó lại chạy chậm như rùa bò. Mình sẽ mô tả một tình huống như sau:

Mình có  một hàm VBA thực hiện một công việc đó là lựa chọn vào các ô từ A1 đến D10000 và sau đó sẽ gán một giá trị nào đó cho ô, hàm có dạng như sau:

Sub Vidu1()
    Dim sh As Worksheet
    Set sh = ActiveSheet
    For Each Rng In sh.Range("A1:D10000")
        Rng.Select
        Rng.Value = Rnd
    Next
End Sub

Các bạn copy hàm về mở Excel lên nhấn tổ hợp phím Alt+ F11 rồi chọn Insert/Module sau đó paster đoạn code này vào và tạo một nút bấm ở excel thử chạy cái hàm này xem máy tính nó có chạy như thế nào nhé.
Tiếp theo giờ mình thử sửa đoạn code VBA trên thêm một số lệnh vào như sau:

Sub Vidu2()
    Dim sh As Worksheet
    Application.Interactive = False 
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Set sh = ActiveSheet
    For Each Rng In sh.Range("A1:D10000")
        Rng.Select
        Rng.Value = Rnd
    Next
     Application.Interactive = True
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

Làm tương tự rồi copy rồi paster một hàm mới sau đó tạo thêm mới 1 nút bấm rồi chạy thử hàm Vidu2 bạn sẽ thấy sự khác biệt khi gọi hàm Vidu2 tốc độ chạy VBA rất chi là nhanh, mượt.
Giải thích :
Hàm Vidu1 bạn bắt excel phải làm những công việc tốn thời gian mà lại ko có ích. Tại sao lại nói vậy vì khi bạn chạy vòng lặp For mỗi lần gọi lệnh select và gán giá trị thì excel sẽ tự động gọi sự kiện vẽ lại màn hình và điều đó là không cần thiết mình chỉ cần excel sau khi chạy xong hàm và gán giá trị đầy đủ là được. Để làm được việc này trong Hàm Vidu2 mình đã thêm lệnh  Application.ScreenUpdating = False
mục đích là tắt chức năng vẽ lại màn hình và sau khi thực hiện xong các lệnh trong hàm thì mình mới báo cho excel là vẽ lại màn hình hiển thị cho ta xem kết quả thì lệnh Application.ScreenUpdating = True sẽ làm việc báo cho excel. Còn 2 hàm Application.Interactive,Application.EnableEvents nhằm mục đích khóa tác động của người dùng và sự kiện khi excel đang chạy hàm. Giả sử thời gian chạy hàm của chúng ta khi đang chạy mà trong Sheet đó có sự kiện ví dụ như là Worksheet_change thì chả nhẽ mỗi lần ta có lênh Rng.Value thì excel lại chạy sự kiện Worksheet_change như vậy sẽ khiến cho excel lại mất thời gian chạy vào hàm này tính toán. Vậy nếu chúng ta biết kết hợp những tính năng mà excel cung cấp sẽ giúp xây dựng nên một ứng dụng làm việc hiệu quả. Mình viết bài viết này giành cho các bạn nào mới học VBA nếu thấy hay các bạn có thể chia sẻ cho những người khác nhé.

5 nhận xét: