HeSanbi
Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
- Tham gia
- 24/2/13
- Bài viết
- 2,692
- Được thích
- 4,246
- Giới tính
- Nam
Bài viết chủ đề hôm nay tôi sẽ giới thiệu cho các bạn một cách tiếp cận mới với lập trình VBA.
Các bạn học VBA chắc chắn đa số sẽ biết rằng VBA chỉ hoạt động duy nhất một luồng cho một lớp đối tượng Application. Một số bạn mới học có thể chưa biết được điều này. Có thể hiểu đơn giản là VBA được dịch và thực thi theo thứ tự chứ không thể thực thi song song cùng một lúc nhiều lệnh.
Tuy nhiên, chúng ta vẫn có thể vượt qua giới hạn đơn luồng bằng cách khởi tạo một Lớp đối tượng Application mới ngoài tiến trình chính để phục vụ tính toán riêng biệt mà không tác động đến tiến trình chính.
Ví dụ các bạn đang cho một Macro chạy vòng lặp mười triệu, thì tất nhiên không thể gọi một Macro chạy song song trên tiến trình này được, bởi vậy buộc chúng ta phải tạo một tiến trình khác.
Để gọi được một thủ tục chạy song song chúng ta có thể thực hiện như sau:
Để bắt đầu: (Tải hai dự án ở bên dưới phần đính kèm)
Chúng ta tạo hai dự án Excel với tên MainProcess.xlsb và Process1.xlam
Dự án Process1.xlam là một bổ trợ cần được đặt trong thư mục khởi động XLSTART của Excel
Sử dụng câu lệnh để mở thư mục và tạo dự dán:
Vì sao phải thực hiện như vậy? Bởi vì nếu dự án được khởi động trong thư mục đã được xác nhận quyền thì dự án sẽ được mở và khởi động Script mà không cần phải hỏi trước.
1. Khởi tạo tiến trình Excel mới:
-------------------
-------------------
3. Ẩn cửa sổ tiến trình mới:
Các bạn có thể sử dụng hàm WinAPI ShowWindow để ẩn của sổ đi
-------------------
---------------------------------
Tôi khuyên các bạn lập trình sử dụng ứng dụng Rainmeter để kiểm tra CPU, RAM, Network, để tránh các rủi ro, khi test một file nào đó.
---------------------------------
-------------------
Mặc dù hướng dẫn trên rất đơn giản, nhưng trong quá trình lập trình, sẽ có nhiều thử thách phức tạp hơn rất nhiều. Nếu các bạn có cố gắng thì sẽ thành công.
Chúc các bạn thành công!
Các bạn học VBA chắc chắn đa số sẽ biết rằng VBA chỉ hoạt động duy nhất một luồng cho một lớp đối tượng Application. Một số bạn mới học có thể chưa biết được điều này. Có thể hiểu đơn giản là VBA được dịch và thực thi theo thứ tự chứ không thể thực thi song song cùng một lúc nhiều lệnh.
Tuy nhiên, chúng ta vẫn có thể vượt qua giới hạn đơn luồng bằng cách khởi tạo một Lớp đối tượng Application mới ngoài tiến trình chính để phục vụ tính toán riêng biệt mà không tác động đến tiến trình chính.
Ví dụ các bạn đang cho một Macro chạy vòng lặp mười triệu, thì tất nhiên không thể gọi một Macro chạy song song trên tiến trình này được, bởi vậy buộc chúng ta phải tạo một tiến trình khác.
Để gọi được một thủ tục chạy song song chúng ta có thể thực hiện như sau:
Để bắt đầu: (Tải hai dự án ở bên dưới phần đính kèm)
Chúng ta tạo hai dự án Excel với tên MainProcess.xlsb và Process1.xlam
Dự án Process1.xlam là một bổ trợ cần được đặt trong thư mục khởi động XLSTART của Excel
Sử dụng câu lệnh để mở thư mục và tạo dự dán:
PHP:
Shell "Explorer.exe """ & Application.StartupPath & """", vbNormalFocus
1. Khởi tạo tiến trình Excel mới:
Trong dự án MainProcess.xlsb ta sẽ đặt code để khởi tạo tiến trình với dự án Process1.xlam
Ví dụ các bạn có thể xem ở code Workbook.Muốn mở một tiến trình mới thì trước hết chúng ta cần phải thực hiện lệnh kiểm tra xem tiến trình mới đã được mở hay chưa.
Trong Module1 sẽ có Hàm kiểm tra là IsOpenX
Khi mở tiến trình mới hãy sử dụng lệnh Cmd.exe, trong file lệnh:
PHP:
VBA.Shell "cmd.exe /S /C START ""XLProcess1"" """ & Application.Path & "\EXCEL.EXE"" /x " & XLMODE & " """ & StartupPath & "Process1.xlam""", 0
START ""XLProcess1"" - Mở ứng dụng gán tiêu đề là XLProcess1.
Đối số /x sẽ mở Excel ở tiến trình mới.
Đối số XLMODE có thể để trống hoặc là:
/safe - mở Excel ở chế độ An toàn (Safe Mode) chế độ này chỉ mở Dự án đã nhập vào
/n và /f - mở Excel.
2. Kết nối với tiến trình mới và gửi lệnh thực thi:- Để kết nối tiến trình mới ta sử dụng hàm VBA GetObject:
Xác nhận xem File đã được mở ở tiến trình mới hay chưa thì mới thực hiện kết nối
Nếu không Hàm GetObject sẽ tự động mở file cùng tiến trình chính.
Trong file các bạn sẽ thấy dòng code VBA.GetObject(StartupPath & "Process1.xlam")
- Gửi lệnh thực thi:
File Process1.xlam sẽ nhận lệnh thực thi, nếu ta vô tình gửi lệnh trực tiếp thì tiến trình chính buộc phải đợi cho Thủ tục ở tiến trình mới thực thi xong, vì vậy ta sẽ gán các đối số vào biến trung gian và sử dụng phương thức OnTime gọi thủ tục thực thi.
Trong File Process1.xlam module1 các bạn sẽ thấy thủ tục test, nó là một thủ tục gọi gián tiếp.
-------------------
PHP:
Private Function test(Target As Range) As Boolean
Set Main_Target = Target
Application.OnTime VBA.Now, "'" & ThisWorkbook.Name & "'!test_Run"
End Function
3. Ẩn cửa sổ tiến trình mới:
Các bạn có thể sử dụng hàm WinAPI ShowWindow để ẩn của sổ đi
-------------------
PHP:
Private Sub HideWindowUI()
ShowWindow Application.hwnd, 0
End Sub
---------------------------------
Tôi khuyên các bạn lập trình sử dụng ứng dụng Rainmeter để kiểm tra CPU, RAM, Network, để tránh các rủi ro, khi test một file nào đó.
---------------------------------
-------------------
Mặc dù hướng dẫn trên rất đơn giản, nhưng trong quá trình lập trình, sẽ có nhiều thử thách phức tạp hơn rất nhiều. Nếu các bạn có cố gắng thì sẽ thành công.
Chúc các bạn thành công!
File đính kèm
Lần chỉnh sửa cuối: