Link to home
Start Free TrialLog in
Avatar of ltdanp22
ltdanp22Flag for United States of America

asked on

How to close a specific Access.Application object

I'm trying to make sure that a specific Access.Application object is closed before running an Excel macro. Right now I just call Access.Application.Quit when the Excel macro starts. That works except that it closes every instance of Access instead of one. Is there a way to close an Application.Access object by file name?

Thanks in advance!
Avatar of Helen Feddema
Helen Feddema
Flag of United States of America image

If you assign the Application object to a variable, say appAccess, then you can close that specific instance using the variable.  If you are talking about a file name, that would be a database.  Here is some code for working with the Access Application object and a specific database:
Public Sub OpenAnotherDatabase()
'Created by Helen Feddema 14-Feb-2010
'Last modified by Helen Feddema 14-Feb-2010

   Dim appAccess As New Access.Application
   Dim strDBNameAndPath As String
   Dim dbs As DAO.Database
   Dim rst As DAO.Recordset
   Dim dbe As DAO.DBEngine
   
   'Change to your db name and path
   strDBNameAndPath = "G:\Documents\Access 2002-2003 Databases\General.mdb"
   appAccess.Visible = True
   appAccess.OpenCurrentDatabase filepath:=strDBNameAndPath, _
      exclusive:=False
      
   'Run a procedure
   'appAccess.Run "PrintOrdersReport"
   
   'Run a macro
   'appAccess.DoCmd.RunMacro "mcrPrintOrdersReport"
   
   'Run an action query
   'appAccess.DoCmd.OpenQuery "qryDeleteSomeOrders"
   
   'Run SQL code
   strSQL = "DELETE tblOrders.ShippedDate FROM tblOrders WHERE ShippedDate = #8/4/1994#;"
   Debug.Print "SQL string: " & strSQL
   'appAccess.DoCmd.RunSQL strSQL
   
   'Iterate through a recordset
   Set dbe = appAccess.DBEngine
   Set dbs = dbe.OpenDatabase(strDBNameAndPath)
    
   Set rst = dbs.OpenRecordset("tblCategories")
   Do Until rst.EOF
      Debug.Print rst![CategoryName]
      rst.MoveNext
   Loop
   rst.Close
    
   Set dbs = Nothing
   Set appAccess = Nothing
   
End Sub

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of puppydogbuddy
puppydogbuddy

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of ltdanp22

ASKER

To recap, I have an Excel macro that opens an Access database. If the code breaks, this instance of Access is left open (it's also invisible which is why I'm trying to close it for the user).
The file will always have the same name: "ISCM Database.accdb". Unfortunately, the path to the Access file is not always. I've only seen examples that pass the full file path as a parameter.
Is it possible to use GetObject with only the file name and not the full file path? If so, what's the correct syntax?
Is it possible to loop through all the open Access objects and check the filename, and then get the file path if the file name matches "ISCM Database.accdb"
If your code breaks for any reason, you shouldn't need to know which/what databases are currently open, since you have created a specific object/connection to the database you are working within("ISCM Database.accdb").

Upon a break, the error handling you should have in place would clean up the issue for you.

E.g. (note: borrowing some of Helen's code posted) this would be a very basic way of handling things:
Public Sub OpenDatabase()

Dim appAccess As Access.Application
Dim strDBName As String

On Error Goto ErrHandler

    Set appAccess = New Access.Application

'-- Set the filepath/name
    strDBName = "...ISCM Database.accdb"

'-- Open the database
    appAccess.OpenCurrentDatabase filepath:=strDBName, _
                                  exclusive:=False

'-- Display (or hide) the app window
    appAccess.Visible = True

'-- Do stuff......


'-- Close the database
    Set appAccess = Nothing
    
Exit Sub

ErrHandler:

'-- Do something with the error
    msgbox Err.Number & " - " & Err.Description

'-- Close the database
    Set appAccess = Nothing

End Sub

Open in new window