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 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

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.

  1. 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

  1. 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.

  1. 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.

  1. 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.

VBA giúp ích rất nhiều trong công việc: giúp bạn tăng tốc trong quá trình xử lý trên Excel, giúp lập các báo cáo tự động, điều khiển các chương trình khác như Word, Power Point, Outlook … giúp biến file Excel của bạn trở thành 1 phần mềm chuyên nghiệp …

Để có thể học VBA một cách đầy đủ, có hệ thống, bạn hãy tham gia khoá học VBA101 – VBA cơ bản dành cho người mới bắt đầu của hệ thống Học Excel Online. Hiện nay hệ thống đang có nhiều ưu đãi khi bạn đăng ký khóa học này. Chi tiết xem tại: