Mọi thứ bên dưới áp dụng cho Excel 2007 trở về trước. Theo liên kết @ Ƭᴇcʜιᴇ007 được đăng trong các bình luận ở trên, có một số hỗ trợ riêng cho đa luồng trong Excel 2013. Điều đó nói rằng, cảnh báo chỉ cần quên nó trừ khi bạn là một lập trình viên có kinh nghiệm vẫn áp dụng.
Thật không may, VBA không hỗ trợ đa luồng, vì vậy các tính toán VBA của bạn sẽ bị giới hạn ở một lõi của bộ xử lý.
Tuy nhiên, có một phương pháp tiên tiến để lừa VBA chạy nhiều luồng bằng cách tạo các tệp VBscript và thực hiện chúng đồng thời. Điều này giải quyết vấn đề bằng cách chạy mã của bạn bên ngoài quy trình Excel và cho phép Windows quản lý các tài nguyên được phân bổ cho các luồng khác nhau.
Điều đó nói rằng, làm cho điều này hoạt động nhiều khả năng có nghĩa là hoàn toàn xem xét lại logic của mã của bạn (nghĩa là bạn sẽ phải tìm ra cách phân chia các nhiệm vụ theo cách hợp lý để chúng chạy đồng thời), có thể rất tốt là không khả thi cho dự án của bạn. Tôi chưa bao giờ tự mình thực hiện điều này, vì vậy tôi thực sự không thể giúp bạn điều này hơn là nói với bạn những gì tôi đã nói với bạn.
Tuy nhiên, nếu bạn muốn bước vào hố thỏ, đây là một bài đăng blog thú vị cho thấy một ví dụ về việc này đang được thực hiện. Được cảnh báo: trừ khi bạn là một lập trình viên thành đạt, bạn cũng có thể quên ý tưởng này và chỉ chấp nhận rằng VBA chạy trong một luồng duy nhất.
Các tài nguyên khác trên Stack Overflow cho sự táo bạo:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668
Tất nhiên có nhiều cách khác để tối ưu hóa mã VBA của bạn mà không cần sử dụng nhiều luồng. Không nhìn thấy mã của bạn, không thể đưa ra đề xuất nhọn, nhưng đây là một vài nghi phạm thông thường:
- Tải dữ liệu từ trang tính của bạn vào một mảng để xử lý nhanh hơn. Tương tác với bảng tính là một nút cổ chai lớn trong thực thi VBA và chúng có thể được giảm thiểu bằng cách làm việc với các mảng.
- Một vấn đề liên quan là Excel tính toán lại sổ làm việc sau mỗi thay đổi được thực hiện cho một ô. Điều này có thể tránh được bằng cách thiết lập
Application.Calculation = xlManual
. Chỉ cần chắc chắn để đặt lại Application.Calculation = xlAutomatic
trước khi thoát Sub.