- Posted on
- Học viện GNV
- Không có bình luận
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.