2016-12-19 21 views
5

Trong VBA, bạn có thể gọi các phương thức/hàm của bạn với Call trước chúng, để cho trình biên dịch biết rõ ràng rằng bạn không muốn sử dụng giá trị trả về nếu có.Tại sao tôi không thể sử dụng Gọi trước mặt của DoEvents?

Hiện tại, DoEvents function cũng có thể được gọi qua số Call, nhưng tôi không thể thực hiện điều đó.

Khi tôi gõ:

Call DoEvents 

nó chỉ đơn giản nói "lỗi cú pháp" khi biên dịch.

Tại sao tôi không thể sử dụng Call mặt trước của DoEvents?


Sử dụng VBA từ VBE trong Excel 2016, IIRC nó cũng không làm việc vào năm 2013, 2010 vv

+0

Tôi không nghĩ bạn có thể gọi bất kỳ thành viên nào của Lớp Tương tác VBA (Environ, MsgBox, v.v.) –

+0

@JiminyCricket 'Gọi MsgBox (" Test ", vbOKOnly)' chắc chắn hoạt động. 'DoEvents' là lần đầu tiên (chức năng?) Tôi stumbeled khi đó đã không cho phép tôi để' Call' nó – Mafii

+0

Ahh, tôi đã cố gắng sử dụng nó như là một cuộc gọi phụ MsgBox "Test" không hoạt động. Tốt nhất là không sử dụng Gọi và chỉ cần sử dụng DoEvents. Tôi sử dụng điều đó như là thực hành chung cho tất cả các chương trình con và chức năng khi nó cắt giảm code/visual clutter –

Trả lời

3

TLDR; Bạn có thểCall nó, nhưng chỉ rõ ràng từ mô-đun VBA.

Khi tài liệu được liên kết bởi @ Gary'sStudent (see the application agnostic version here) chỉ ra, DoEvents thực sự là một không Function một Sub, và nó sẽ luôn luôn trở về 0 trong VBA. Trong Visual Basic không được lưu trữ (tức là VB6), nó trả về tổng số cửa sổ đang mở. Suy đoán hoàn toàn không được chứng minh của tôi là lý do tại sao nó trả về 0 là trong VBA cửa sổ cấp cao nhất của quá trình mà mã đang chạy không thuộc sở hữu của mã bạn đang thực hiện.

Chức năng chính nó là trong module VBA.Interaction, như bạn có thể nhìn thấy trong Object Browser:

DoEvents in the Object Browser

Điều đó nói rằng, bạn nên lưu ý rằng bạn thể sử dụng DoEvents chức năng trước bởi các Call từ khóa - nhưng bạn cần tham chiếu rõ ràng cụm từ VBA:

Sub Example() 
    'This is perfectly fine. 
    Call VBA.DoEvents 
End Sub 

Một lần nữa, đây chỉ là suy đoán, nhưng tôi nghi ngờ lý do phải làm với việc thực hiện nội bộ. Thông thường sẽ gọi hàm SwitchToThread (mà vbe7.dll nhập). Nhưng bản chất của giá trị trả lại chỉ để liệt kê các cửa sổ được mang lại đến, do đó, có thể chỉ cần một tay cầm để VBA để chạy. Không có bất cứ điều gì trong typelib cho thấy nó khác nhau từ bất kỳ chức năng khác trong module Tương tác (mặc dù có thể có một lá cờ mà tôi bị mất ở đâu đó):

[entry(598), helpcontext(0x000f7900)] 
short _stdcall DoEvents(); 

Bản chất của lỗi biên dịch "Dự kiến: số nhận dạng" cho biết có nội dung nào đó "ẩn" DoEvents từ các hàm VBA có thể truy cập toàn cầu.


Cuối cùng lưu ý: Cú pháp Call Foo là hoàn toàn không cần thiết - tất cả nó được loại bỏ một cách rõ ràng giá trị trả về của một hàm.Không phải chỉ định giá trị trả lại thực hiện chính xác điều tương tự.

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