2009-04-10 43 views

Trả lời

3

Câu hỏi hay, nhưng tôi nghĩ rằng không thể thực hiện được.

+2

1: chính xác. Bạn có thể viết một thành phần đa luồng (hoặc sử dụng một thành phần hiện có) và gọi nó từ VBA, nhưng VBA không phải là chính nó đa luồng. – Joe

0

Cách nhanh nhất tôi có thể nghĩ là tạo Biểu mẫu và đặt kiểm soát hiện tại hoặc tự kiểm soát trên đó.

4

Không có cách nào để thực hiện việc này trực tiếp trong chính VBA. Here is a MSDN forum discussion nói về điều này một cách chi tiết. Văn phòng không bao giờ tiếp xúc với bất kỳ phần mở rộng VBA cho đa luồng.

Tuy nhiên, bạn có thể thực hiện điều này bằng cách gọi API Windows hoặc tạo đối tượng COM của riêng bạn trong VBA (được viết ở nơi khác) thực hiện các cuộc gọi đa luồng cho bạn. Chỉ cần chắc chắn để marshall tất cả mọi thứ trở lại chủ đề gọi điện thoại, bằng cách nào đó (có thể bỏ phiếu chống lại đối tượng COM của bạn, hoặc một cái gì đó tương tự).

Ngoài ra, bạn có thể muốn kiểm tra liên kết của bendewey trên luồng COM, vì nó rất phù hợp với điều này.

-1

Nếu MS Access VBA cho phép bạn sử dụng biểu mẫu, hãy thả bộ hẹn giờ trên biểu mẫu và đặt độ trễ thành giá trị thực sự thấp, như 10 ms. Sau đó, đặt mã của bạn trong chức năng sự kiện bộ đếm thời gian và nó sẽ được thực hiện trong một chuỗi riêng biệt.

+5

Bộ định thời trong biểu mẫu trong VBA xảy ra trên chuỗi chính. Biểu mẫu sử dụng các thông báo của Windows để lên lịch, không phải là một chuỗi riêng biệt. –

+0

Reed, tôi khá chắc chắn điều này đúng với VB6. Nó khác với VBA? – andrewrk

+0

Không, nó được thực hiện trên cùng một chủ đề – Onkelborg

1

Làm thế nào để sử dụng một cái gì đó như ShellOpen() để bắt đầu một kịch bản shell, ví dụ Visual Basic Script x lần, sẽ làm công việc, giao tiếp với kịch bản thông qua một tập tin (và một cơ chế tổng hợp để phát hiện khi kết quả đến)? Tôi nghĩ rằng nó là dễ dàng hơn để làm hơn là viết một thành phần COM. Ngoài ra, VB Script rất giống với VBA. Mặt xấu là khá ít, mặc dù - viết và đọc tệp tốn nhiều thời gian hơn chia sẻ bộ nhớ, việc gộp nhóm có thể làm cho tập lệnh VBA có vẻ không phản hồi, v.v.

-1

Bạn cũng có thể sử dụng quy trình DoEvents cho phép hệ thống xử lý sự kiện. Chỉ cần gọi phụ này theo thời gian và chủ đề chính không bị đóng băng.

+4

Đó không phải là một giải pháp tốt, nó xấu, thực sự xấu – Onkelborg

+0

Và tại sao một giải pháp xấu như vậy? Tôi đã sử dụng cách tiếp cận này trong kịch bản của tôi và nó đã làm việc tốt đẹp. Tôi chỉ gọi là DoEvents với khoảng thời gian là 1000 ms hoặc một giây. – Ionut

+0

Vâng, nó hoạt động, nhưng đó là nó. Giao diện phản hồi thư một lần mỗi giây không phản hồi. Và đó là thực tế xấu để có một chương trình thực thi mã chỉ để bỏ phiếu. Đẩy là tốt hơn để cho chương trình ngủ khi không có gì xảy ra. Các chương trình khác được hưởng lợi từ việc này khiến ít công tắc ngữ cảnh đang diễn ra, và tiêu thụ điện năng giảm xuống. Nếu bạn thực sự, thực sự phải bỏ phiếu, không sử dụng phương pháp DoEvents, sử dụng bộ hẹn giờ ít nhất, nó sẽ không làm hỏng hàng đợi tin nhắn của bạn và khiến ứng dụng của bạn không phản hồi – Onkelborg

4

Bạn có thể muốn kiểm tra workaround này: http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html

Đó là Excel, nhưng nó phải là thực tế giống nhau. Nó hoạt động bằng cách xây dựng "đại lý" VBScript và họ đã thực hiện nhiệm vụ .. Kiểm tra ví dụ này, nó là khá ấn tượng

-Viggo

Các vấn đề liên quan