Cách tốt nhất để cải thiện tốc độ phản hồi của macro VBA cũng như hạn chế tình trạng lệnh chạy ì ạch
Đây là vấn đề đã được bàn luận nhiều lần, tuy vậy đối với người mới làm quen với VBA cũng như khái niệm lập trình tin học nói chung, việc có một phương pháp tiếp cận đơn giản hơn mà không dùng quá nhiều kiến thức chuyên ngành là rất quan trọng. Đoạn mã dưới đây có khả năng giúp tăng tốc độ chạy ...
Đây là vấn đề đã được bàn luận nhiều lần, tuy vậy đối với người mới làm quen với VBA cũng như khái niệm lập trình tin học nói chung, việc có một phương pháp tiếp cận đơn giản hơn mà không dùng quá nhiều kiến thức chuyên ngành là rất quan trọng.
Đoạn mã dưới đây có khả năng giúp tăng tốc độ chạy lệnh của bạn, chỉ bằng 2 bước đơn giản là sao chép và dán. Đầu tiên, bạn chỉ cần sao chép 2 hàm thủ tục dưới đây và sau đó dán chúng vào mô-đun lệnh của VBA là xong.
Đoạn mã VBA thứ nhất
Public CalcState As Long Public EventState As Boolean Public PageBreakState As Boolean Sub OptimizeCode_Begin() Application.ScreenUpdating = False EventState = Application.EnableEvents Application.EnableEvents = False CalcState = Application.Calculation Application.Calculation = xlCalculationManual PageBreakState = ActiveSheet.DisplayPageBreaks ActiveSheet.DisplayPageBreaks = False End Sub
Đoạn mã VBA thứ hai
Sub OptimizeCode_End() ActiveSheet.DisplayPageBreaks = PageBreakState Application.Calculation = CalcState Application.EnableEvents = EventState Application.ScreenUpdating = True End Sub
Xem thêm: Học VBA tại Hà Nội
Tiếp theo, bạn cần phải điền 2 lệnh này vào phần đầu và phần cuối của macro. Ví dụ minh họa như sau:
Sub MyAwesomeMacro() Dim x As Long Dim y As Long Dim cell As Range 'Optimize Code Call OptimizeCode_Begin 'Insert your macro code here... x = Range("A1") y = Range("A3") For Each cell In Range("C2:C2000)") cell.Value = (x - cell.Row) / y Next cell 'Optimize Code Call OptimizeCode_End End Sub
Lý do vì sao đoạn mã trên có khả năng tăng tốc chuỗi lệnh?
Đoạn mã VBA phía trên về cơ bản có tác dụng tắt bỏ một thiết lập quan trọng trong Office: tận dụng bộ nhớ máy tính để liên tục cập nhật hoạt động của macro lên màn hình (theo thời gian thực). Chính tính năng này khiến máy chạy chậm hơn mỗi khi phải xử lý mã lệnh và dần dần khiến máy không thể hoạt động nhanh nhất có thể. Lý do là bởi bạn đã ép chiếc máy tính của mình phải làm quá nhiều việc cùng một lúc.
Để dập tắt mọi hoài nghi, dưới đây là những lý do cụ thể giải thích vì sao đoạn mã trên lại có tác dụng tăng tốc tốt đến vậy.
- Tắt bỏ tính năng cập nhật màn hình liên tục
Tôi còn nhớ đã từng phải chờ 30 phút để chạy xong một macro do chính đồng nghiệp của tôi viết (quy trình chạy khá phức tạp và nội dung câu lệnh cũng khá lủng củng nữa). Cảm giác lúc đó giống như bị tẩy não vậy, đặc biệt là khi bạn phải dán mắt vào màn hình máy tính nhấp nháy liên tục trong suốt 30 phút! Thật may là tôi đã phát hiện ra được một đoạn mã nhỏ có khả năng vừa bảo vệ được thị giác của mình, đồng thời tăng tốc đáng kể thời gian chạy lệnh trên thực tế. Việc bạn luôn phải làm đó là tắt bỏ chế độ cập nhật màn hình liên tục đi. Nó thực sự chỉ có ích nếu như câu lệnh bạn chạy có kèm theo các hiệu ứng đồ họa đẹp mắt
- Tắt chế độ tự động ngắt trang
Bản thân tôi không thích bật dấu ngắt trang trong văn bản cho lắm, nhưng thực tế có một vài người lại thích điều đó. Hạn chế của dấu ngắt trang trong quá trình chạy lệnh VBA đó là việc Excel luôn tự động ngắt trang lại mỗi khi người dùng thay đổi nội dung của trang tính. Bạn hãy thử tưởng tượng rằng nếu như ta phải xóa hoặc thêm bớt hàng nghìn dòng dữ liệu thì sẽ mất bao lâu để chạy xong đoạn lệnh VBA đó. Chính vì lý do kể trên, lời khuyên tốt nhất đó là nên tắt đi chức năng tự ngắt trang này trong quá trình khởi động lệnh.
Đừng bỏ lỡ: Học Excel nhanh cùng các chuyên gia
Cách sử dụng Page Break trong trường hợp này sẽ không giống với những lần trước đó. Ta sử dụng Page Break làm thiết lập cho bảng tính, thay vì chỉ đơn giản là thiết lập trong ứng dụng thông thường. Điều đó có nghĩa là mỗi bảng tính đều sẽ xuất hiện một “công tắc mềm” bên cạnh có chức năng ngắt trang. Để không ảnh hưởng đến nội dung mã lệnh, giả sử rằng macro chỉ tác động đến trang tính đang mở hiện tại. Nếu như có nhiều trang tính đều chịu ảnh hưởng của câu lệnh, bạn nên tắt chức năng tự động ngắt trang cho tất cả. Để tiện lợi nhất, bạn thậm chí có thể tạo 1 đoạn mã lệnh VBA có chức năng tắt tất cả các dấu ngắt trang đang hoạt động trong quá trình mã lệnh được chạy.
- Tắt chế độ tự động tính toán lại
Nếu trong quá trình chạy lệnh có một số ô tính chứa công thức bị ảnh hưởng, Excel sẽ tự tính toán lại giá trị của ô tính đó theo thời gian thực. Để nâng cao hiệu suất của mã lệnh, bạn cần phải tắt chức năng này đi trong quá trình lệnh được chạy. Lưu ý là sau khi lệnh chạy xong, bạn nhớ phải bật lại chế độ tự động cập nhật công thức (hoặc chế độ bán tự động), nếu không bạn hoặc người dùng sẽ không thể hình dung được nội dung bảng tính thay đổi như thế nào.
- Hạn chế tác động của các kích ứng hiện tượng ngoài ý muốn
VBA rất dễ chịu tác động của những “hiện tượng kích ứng” xảy ra trong quá trình người dùng làm việc với Excel. Đó có thể là việc khởi động một bảng tính lên hoặc thay đổi nội dung nào đó trong bảng. Hiện tượng sau khi bị kích ứng sẽ xảy ra và hoạt động liên tục trong quá trình lệnh VBA đang chạy. Điều này dẫn đến việc một số đoạn mã không cần thiết được khởi động chạy, dẫn đến tình huống xấu nhất đó là bảng tính bị xáo trộn và làm gián đoạn quá trình chạy mã VBA. Tắt đi các kích ứng này sẽ làm cho việc chạy lệnh VBA trở nên mượt mà hơn.