9 mẹo cải thiện tốc độ file chứa code VBA

GNV nhận thấy rằng một số người dùng đã gặp phải tình trạng VBA chạy chậm, điều này có thể gây khó chịu cho chúng ta khi làm việc.

Nếu bạn không may gặp phải tình trạng VBA chạy chậm, GNV sẽ giúp bạn cải thiện hiệu suất Macro, tăng tốc VBA một cách nhanh chóng và hiệu quả mà chưa ai hướng dẫn.

1. Tắt mọi thứ làm VBA chạy chậm trừ những thứ cần thiết.

Một trong những điều đầu tiên cần làm khi tăng tốc VBA là tắt các tính năng không cần thiết như Animations, cập nhật màn hình, tính toán tự động và các sự kiện trong khi macro của bạn đang chạy. Các tính năng này có thể làm chậm macro, đặc biệt nếu macro đang sửa đổi nhiều ô và kích hoạt nhiều cập nhật màn hình và tính toán lại.

Đoạn code mẫu dưới đây cho bạn biết cách bật / tắt:

  • Tính toán thủ công
  • Cập nhật màn hình
  • Animations
Option Explicit
Dim lCalcSave As Long
Dim bScreenUpdate As Boolean
Sub SwitchOff(bSwitchOff As Boolean)
  Dim ws As Worksheet
    
  With Application
    If bSwitchOff Then 

      ' OFF 
      lCalcSave = .Calculation
	bScreenUpdate = .ScreenUpdating
      .Calculation = xlCalculationManual
      .ScreenUpdating = False
      .EnableAnimations = False
      
      '
      ' switch off display pagebreaks for all worksheets
      '
      For Each ws In ActiveWorkbook.Worksheets
        ws.DisplayPageBreaks = False
      Next ws
    Else
 
      ' ON
      If .Calculation <> lCalcSave And lCalcSave <> 0 Then .Calculation = lCalcSave
      .ScreenUpdating = bScreenUpdate
      .EnableAnimations = True
      
    End If
  End With
End Sub

Sub Main()
  SwitchOff(True) ‘ turn off these features
  MyFunction() ‘ do your processing here
  SwitchOff(False) ‘ turn these features back on
End Sub
2. Tắt Animations Office thông qua cài đặt hệ thống

Animations có thể tắt trên Windows bằng cách truy cập Ease of Access Center. Bạn cũng có có thể tắt Animations trong Excel, trong Advanced hoặc Ease of Access tab, trong menu File > Options.

Xem liên kết sau để biết thêm thông tin: https: //support.office.com/en-us/article/turn-off-office-animations-9ee5c4d2-d144-4fd2-b670-22cef9fa

3. Tắt Animations Office thông qua Registry settings

Có thể tắt Animations Office trên nhiều máy tính bằng cách đặt khóa đăng ký thích hợp thông qua cài đặt chính sách nhóm.

 HIVE: HKEY_CURRENT_USER

Key Path: Software\Microsoft\Office\16.0\Common\Graphics
Key Name: DisableAnimations
Value type: REG_DWORD
Value data: 0x00000001 (1)

Lưu ý: Việc sử dụng Registry Editor không đúng cách có thể gây ra các sự cố nghiêm trọng trên toàn hệ thống mà bạn có thể yêu cầu để cài đặt lại Windows để sửa chúng. Microsoft không thể đảm bảo rằng mọi vấn đề do sử dụng Registry Editor đều có thể được giải quyết. Bạn nên cân nhắc khi sử dụng lựa chọn này

4. Loại bỏ các lựa chọn không cần thiết để tăng tốc VBA

Phương pháp Select thường thấy trong code VBA, tuy nhiên nó thường được thêm vào macro khi không cần thiết. Select có thể kích hoạt các sự kiện như Animations và định dạng có điều kiện (Conditional formatting) khiến cho VBA chạy chậm, vì vậy việc xóa các Select không cần thiết có thể giúp bạn tăng tốc VBA đáng kể.

Ví dụ sau đây cho thấy mã trước và sau khi thực hiện thay đổi để loại bỏ các lựa chọn không cần thiết.

Trước

Sheets("Order Details").Select
Columns("AC:AH").Select
Selection.ClearContents

Sau

Sheets("Order Details").Columns("AC:AH").ClearContents
5. Sử dụng câu lệnh With để đọc các thuộc tính của đối tượng

Khi làm việc với các đối tượng, hãy sử dụng câu lệnh With để giảm số lần các thuộc tính của đối tượng được đọc. Ví dụ sau đây cho thấy mã trước và sau khi thực hiện thay đổi để sử dụng câu lệnh With. Đây cũng là điều mà các bạn tự học VBA không biết, làm cho file chứa code VBA chạy chậm mà bạn không khắc phục được.

Trước

Range("A1").Value = “Hello”
Range("A1").Font.Name = “Calibri”
Range("A1").Font.Bold = True
Range("A1").HorizontalAlignment = xlCenter

Sau

With Range("A1")
  .Value2 = “Hello” 
  .HorizontalAlignment = xlCenter
    With .Font
      .Name = “Calibri”
      .Bold = True
    End With
End With
6. Sử dụng Ranges and Arrays

Đọc và ghi vào các ô trong Excel từ VBA rất mất thời gian phát sinh mỗi khi dữ liệu di chuyển giữa VBA và Excel. Đây cũng là một trong những nguyên nhân chính làm VBA chạy chậm.

Bạn nên cố gắng giảm số lần truyền dữ liệu giữa VBA và Excel. Đây là nơi mà phạm vi hữu ích. Thay vì đọc và ghi vào từng ô riêng lẻ trong một vòng lặp, hãy đọc toàn bộ phạm vi thành một mảng ở đầu, lặp qua mảng và sau đó ghi lại toàn bộ mảng ở cuối. Mã ví dụ sau đây cho thấy cách một phạm vi có thể được sử dụng để đọc và ghi các giá trị một lần, thay vì đọc từng ô riêng lẻ.

Dim vArray As Variant
Dim iRow As Integer
Dim iCol As Integer
Dim dValue As Double
vArray = Range("A1:C10000").Value2 ‘ read all the values at once from the Excel cells, put into an array 

For iRow = LBound(vArray, 1) To UBound(vArray, 1)
  For iCol = LBound(vArray, 2) To UBound(vArray, 2)
    dValue = vArray (iRow, iCol)
    If dValue > 0 Then 
      dValue=dValue*dValue ‘ Change the values in the array, not the cells 
    vArray(iRow, iCol) = dValue
  End If
Next iCol
Next iRow
Range("A1:C10000").Value2 = vArray ‘ writes all the results back to the range at once
7. Sử dụng .Value2 thay vì .Text hoặc .Value

Có nhiều cách khác nhau để bạn có thể truy xuất các giá trị từ một ô và thuộc tính nào bạn sử dụng có thể tạo ra sự khác biệt trong hiệu suất mã của bạn.

.Text thường được sử dụng để truy xuất giá trị của một ô – nó trả về giá trị được định dạng của một ô. Lấy định dạng của một ô phức tạp hơn là chỉ lấy một giá trị và làm cho .Text khá chậm.

 .Value là một cải tiến so với .Text, vì điều này chủ yếu lấy giá trị từ ô mà không cần định dạng. Tuy nhiên, đối với các ô được định dạng là ngày tháng hoặc đơn vị tiền tệ, .Value sẽ trả về ngày tháng VBA hoặc đơn vị tiền tệ VBA (có thể cắt bớt vị trí thập phân).

 .Value2 cung cấp giá trị cơ bản của ô. Vì nó không liên quan đến định dạng, .Value2 nhanh hơn .Value. .Value2 nhanh hơn .Value khi xử lý số (không có sự khác biệt đáng kể với văn bản) và nhanh hơn nhiều khi sử dụng một mảng biến thể.

Để có lời giải thích chi tiết hơn, vui lòng xem bài đăng trên blog của Charles William, “TEXT so với VALUE so với VALUE2”: https://fastexcel.wordpress.com/2011/11/30/text-vs-value-vs-value2-slow-text -và-làm-thế-để-tránh-nó /

8. Bỏ qua khay nhớ tạm/clipboard (sao chép và dán)

Khi bạn sử dụng Macro Recorder để ghi lại các thao tác sử dụng sao chép và dán, code sẽ sử dụng phương pháp sao chép và dán theo mặc định. Tuy nhiên, trong code VBA, việc bỏ qua khay nhớ tạm và sử dụng các thao tác nội bộ sẽ nhanh hơn nhiều. Hoạt động sao chép mặc định sẽ sao chép mọi thứ, bao gồm công thức, giá trị và định dạng. Bạn có thể sao chép nhanh hơn bằng cách chỉ sao chép các giá trị hoặc công thức mà không cần định dạng. Ví dụ sau đây cho thấy mã trước và sau khi thực hiện thay đổi để bỏ qua khay nhớ tạm.

Trước

Range("A1").Select
Selection.Copy
Range("A2").Select
ActiveSheet.Paste

Sau

‘ Approach 1: copy everything (formulas, values and formatting
Range("A1").Copy Destination:=Range("A2")

‘ Approach 2: copy values only
Range("A2").Value2 = Range("A1").Value2

‘ Approach 3: copy formulas only
Range("A2").Formula = Range("A1").Formula

Nếu bạn vẫn thấy rằng macro mất nhiều thời gian hơn dự kiến ​​để thực hiện nhiều thao tác sao chép và dán riêng lẻ, bạn có thể áp dụng bản sửa lỗi sau: https://support.microsoft.com/en-in/help/2817672/macro-takes-longer-than-expected-to-execute-many-individual-copy-and-paste-operations-in-excel-2010-and-later-403dc927-b7e7-7096-0cc8-bd8a2b1e685c

9. Sử dụng Option Explicit để bắt các biến chưa được khai báo

Option Explicit là một trong những Module có sẵn trong VBA, hướng dẫn VBA cách xử lý code trong Module. Thiết lập Option Explicit yêu cầu tất cả các biến phải được khai báo và sẽ gây ra lỗi biên dịch nếu một biến chưa được khai báo được sử dụng. Điều này giúp bắt các tên biến được nhập sai và cải thiện hiệu suất với tất cả các loại biến được xác định tại thời điểm biên dịch.

Điều này có thể được thiết lập bằng cách nhập: Option Explicit ở đầu mỗi Module trong Project hoặc bằng cách chọn tùy chọn “Require Variable Declaration” trong Tools -> Options trong VBA editor. 

Chi tiết bổ sung về Module có thể được tìm thấy tại đây: https: //docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/option-explicit-s …

Tổng kết

Chúng tôi hy vọng những mẹo trên đây có thể tăng tốc VBA, làm cho macro của bạn chạy nhanh hơn. Chúng tôi chắc chắn rằng chúng tôi chưa đề cập đến mọi thứ, vì vậy vui lòng nhận xét bên dưới với bất kỳ mẹo hoặc thủ thuật nào khác để cải thiện hiệu suất của macro của bạn trong Excel.

Nếu bạn muốn trở thành chuyên gia Excel VBA 2021, bạn có thể quan tâm đến bài VBA Excel cho người mới học

Nội dung