ACC2000: "Object invalid or no longer set" Error with CurrentDb

ID: Q200592


The information in this article applies to:


SYMPTOMS

Moderate: Requires basic macro, coding, and interoperability skills.

When you refer to properties and methods belonging to objects created with the CurrentDb function, you may receive the following error message:

Object invalid or no longer set.


CAUSE

When you set an object variable, such as a TableDef object, which requires a reference to a database object, your code refers directly to the CurrentDb function instead of referring to a database object variable that you set with the CurrentDb function.


RESOLUTION

Microsoft provides programming examples for illustration only, without warranty either expressed or implied, including, but not limited to, the implied warranties of merchantability and/or fitness for a particular purpose. This article assumes that you are familiar with the programming language being demonstrated and the tools used to create and debug procedures. Microsoft support professionals can help explain the functionality of a particular procedure, but they will not modify these examples to provide added functionality or construct procedures to meet your specific needs. If you have limited programming experience, you may want to contact a Microsoft Certified Solution Provider or the Microsoft fee-based consulting line at (800) 936-5200. For more information about Microsoft Certified Solution Providers, please see the following page on the World Wide Web:

http://www.microsoft.com/mcsp/
For more information about the support options available from Microsoft, please see the following page on the World Wide Web:

http://www.microsoft.com/support/supportnet/overview/overview.asp
The sample code in this article uses Microsoft Data Access Objects. For this code to run properly, you need to reference the Microsoft DAO 3.6 Object Library.



Create a database object variable in your code that refers to the CurrentDb function, rather than using the CurrentDb function directly in Set statements to create other objects, as in the following example:
  1. Start Access and open the sample database Northwind.mdb.


  2. Create a module and type the following procedure:


  3. 
    Sub CurrentDbSuccess()
       Dim db As DAO.Database
       Dim td As DAO.TableDef
       Set db = CurrentDb()
       Set td = db.TableDefs("Customers")
       MsgBox td.Name
    End Sub
     
  4. To test this procedure, type the following line in the Debug window, and then press ENTER:


  5. 
    CurrentDbSuccess 
Note that you receive the message "Customers" indicating the name of the Customers table.


MORE INFORMATION

Steps to Reproduce Behavior

The following example attempts to use the CurrentDb function to return a pointer to the database that is currently open in Microsoft Access. Because the code does not assign that database to an object variable, the pointer returned by the CurrentDb function is temporary and becomes invalid after the TableDef object is set. Consequently, any later references in your code to the TableDef object variable will result in an error.
  1. Start Access and open the sample database Northwind.mdb.


  2. Create a module and type the following procedure:


  3. 
    Sub CurrentDbFail()
       Dim td As DAO.TableDef
       Set td = CurrentDb.TableDefs("Customers")
       MsgBox td.Name
    End Sub
     
  4. To test this procedure, type the following line in the Immediate window, and then press ENTER:


  5. 
    CurrentDbFail 
Note you receive the error described in the Symptoms section of this article

Additional query words:


Keywords          : kbprg 
Version           : WINDOWS:2000
Platform          : WINDOWS 
Issue type        : kbprb 

Last Reviewed: July 6, 1999