ACC2000: Cannot Call Class Module Methods from MS Access Objects (208202)
The information in this article applies to:
This article was previously published under Q208202 Advanced: Requires expert coding, interoperability, and multiuser skills.
SYMPTOMS
When you call a class module method directly from a query, form, report, or
macro, you receive an error message.
CAUSE
In order to call a class module procedure, the calling object must
initialize an instance of the class. Access objects, such as
queries, forms, reports, and macros, cannot automatically initialize new
instances of a user-defined class. Only a Visual Basic for Applications
procedure can initialize a new instance of a user-defined class.
RESOLUTION
The following are two possible workarounds:
Method 1
If you plan to call the procedure from a query, form, report, or macro, then store it in a standard module. Having it in a standard module avoids the need to create a new instance of a user-defined class every time
you call it. This is the recommended method.
Method 2
Create a procedure in a standard module that initializes an instance of the
class. The procedure in the standard module then calls the procedure stored
in the class module and passes it any necessary arguments. This is
typically known as a "wrapper" procedure.
Using a wrapper procedure in this manner is not recommended because
additional overhead is created when the object is initialized. In some
instances, this creates more overhead than expected. For instance, calling a wrapper procedure from a query creates additional overhead for each record contained in the query. To increase query efficiency and to lessen resource usage, move the code in the class module to a standard module; this will eliminate additional overhead.
The following example demonstrates creating a class module method
named MultiplyByTen and a wrapper procedure named CallMultiplyByTen, that
makes the class method available to other Microsoft Access objects. It next
demonstrates calling the wrapper procedure from a query.
-
Open the sampe database Northwind.mdb.
-
On the Insert menu, click Class module.
-
Type the following line in the Declarations section if it is not
already there:
Option Explicit
-
Type the following procedure:
Function MultiplyByTen(clsVar As Variant) As Variant
MultiplyByTen = clsVar * 10
End Function
-
Close and save the class module as MultiplyClass.
-
Create a standard module and type the following line in the
Declarations section if it is not already there:
Option Explicit
-
Type the following procedure:
Function CallMultiplyByTen(stdVar As Variant) As Variant
Dim clsMultiply As New MultiplyClass
CallMultiplyByTen = clsMultiply.MultiplyByTen(stdVar)
End Function
-
To test this function, type the following line in the Immediate window, and then press ENTER.
?CallMultiplyByTen(5)
Note that the procedure returns the number 50 to the Immediate window.
-
Close and save the module as Module1.
-
Create a new query based on the Orders table with the following
fields:
Query: Query1
-----------------------------------------
Type: Select Query
Field: OrderID
Table: Orders
Field: Freight
Table: Orders
Field: EXPR1: CallMultiplyByTen([Freight])
-
Run the query. Note that the class module method returns a value for
each record.
REFERENCESFor more information about class modules, in the Visual Basic Editor, click Microsoft Visual Basic Help on the Help menu, type class modules in the Office Assistant or the Answer Wizard, and then click Search to view the topic.
For additional information about programming with class modules, please see the following article in the Microsoft Knowledge Base:
160007 Introduction to Stand-Alone Class Module Programming
Modification Type: | Minor | Last Reviewed: | 7/16/2004 |
---|
Keywords: | kbcode kbprb kbProgramming KB208202 |
---|
|