2010-04-22 18 views
6

Thật dễ dàng để gọi một hàm bên trong một classModule sử dụng CallByName Làm thế nào về các hàm bên trong mô-đun chuẩn?Gọi một phụ hoặc chức năng chứa trong một mô-đun bằng cách sử dụng "CallByName" trong VB/VBA

''#inside class module 
''#classModule name: clsExample 
    Function classFunc1() 
    MsgBox "I'm class module 1" 
    End Function 
''# 
''#inside standard module 
''#Module name: module1 
    Function Func1() 
    MsgBox "I'm standard module 1" 
    End Function 
''# 
''# The main sub 
Sub Main() 
''# to call function inside class module 
dim clsObj as New clsExample 
Call CallByName(clsObj,"ClassFunc1") 

''# here's the question... how to call a function inside a standard module 
''# how to declare the object "stdObj" in reference to module1? 
Call CallByName(stdObj,"Func1") ''# is this correct? 

End Sub 
+1

Bạn không thể. Tra cứu 'Application.Run', hoạt động với các thường trình trong các mô-đun chuẩn. – jtolle

+0

Vì 'hàm số' của bạn không phải là giá trị retuning, bạn nên sử dụng 'Sub' thay vì' Hàm'. 'Gọi' là không bao giờ cần thiết, bạn chỉ có thể viết' CallByName clsObj, "ClassFunc1" '. Để gọi hàm Func1 bên trong một mô-đun chuẩn đơn giản là 'Func1' - sử dụng các công cụ sửa đổi thích hợp trong khai báo để thay đổi phạm vi nếu cần – barrowc

Trả lời

2

CallByName chỉ hoạt động với các đối tượng lớp.

Nếu chương trình con của bạn đang ở trong một mô-đun tiêu chuẩn, bạn có thể làm điều này:

Sub Main() 
    Module1.Func1 
End Sub 

Nếu đó là một chức năng, sau đó có thể bạn sẽ muốn nắm bắt được giá trị trả về; một cái gì đó như thế này:

Sub Main() 
    Dim var 
    var = Module1.Func1 
End Sub 
3

Tôi nghĩ câu trả lời của jtolle đã giải quyết câu hỏi tốt nhất - tham chiếu nhỏ đến Application.Run có thể là câu trả lời. Người hỏi không muốn sử dụng chỉ đơn giản là func1 hoặc Module1.func1 - lý do người ta muốn sử dụng CallByName ở nơi đầu tiên là tên function.sub mong muốn không được biết tại thời gian biên dịch. Trong trường hợp này, Application.Run không hoạt động, ví dụ:

Dim ModuleName As String 
Dim FuncName As String 
Module1Name = "Module1" 
FuncName = "func1" 
Application.Run ModuleName & "." & FuncName 

Bạn cũng có thể thêm tên dự án trước tên mô-đun và thêm khoảng thời gian khác ".". Thật không may, Application.Run không trả về bất kỳ giá trị nào, vì vậy trong khi bạn có thể gọi hàm, bạn sẽ không nhận được giá trị trả về của nó.

+3

Điều này thật khó chịu. Rõ ràng sự khôn ngoan internet là sử dụng 'Application.Run' nếu bạn có một module và' CallByName' nếu bạn có một đối tượng lớp. Thật không may họ không thể hoán đổi cho nhau! Lỗi xử lý, đặc biệt, là khác nhau. Nếu ai đó nêu ra một lỗi trong mã được gọi là 'Application.Run', tôi không thể bắt nó trong thủ tục của tôi, nhưng' CallByName' không cho phép tôi bắt nó. Có bất kỳ công việc xung quanh? –

0

Rất tiếc, không thể thêm trước ProjectName trước ModuleName và thêm một khoảng thời gian khác "." Trong MS Word này ném một lỗi thời gian chạy 438. Cuộc gọi bị hạn chế sử dụng đơn giản ModuleName.ProcName.

1

Mô-đun trong VB6 và VBA giống như các lớp tĩnh, nhưng tiếc là VB không chấp nhận Module1 làm đối tượng. Bạn có thể viết Module1.Func1 như C.Func1 (C là một thể hiện của một số Class1), nhưng điều này rõ ràng được thực hiện bởi trình biên dịch, không phải lúc chạy.

Ý tưởng: Chuyển đổi mô-đun1 thành một lớp, tạo "Mô-đun công cộng1 làm mô-đun1" trong mô-đun khởi động và "Đặt mô-đun1 = Mô-đun mới1" trong "Tiểu chính" của bạn.

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