Microsoft KB Archive/155201

= ACC95: GetObject Sample Function Does Not Detect Excel 7.0 =

Article ID: 155201

Article Last Modified on 10/11/2006

-

APPLIES TO


 * Microsoft Access 95 Standard Edition

-



This article was previously published under Q155201



SUMMARY
Advanced: Requires expert coding, interoperability, and multiuser skills.

The GetObject Function Example in online Help for Microsoft Access for Windows 95 states that you can use GetObject to test if a copy of Microsoft Excel is already running. This works fine with versions of Microsoft Excel earlier than version 7.0. However, because Microsoft Excel version 7.0 does not register itself in the running object table (ROT) by default on startup, you must use a combination of Windows application programming interface (API) functions and GetObject to be certain to detect an instance of Microsoft Excel 7.0.

The following is an excerpt from the GetObject Function Example in Microsoft Access for Windows 95 online Help:

' Test to see if there is a copy of Microsoft Excel already running. On Error Resume Next  ' Defer error trapping. ' GetObject function called without the first argument returns a  ' reference to an instance of the application. If the application ' is not running, an error occurs. Note the comma used as the first ' argument placeholder. Set MyXL = GetObject(, "Excel.Application")

Notice that the comment states that Set MyXL = GetObject(, "Excel.Application") will detect whether there is an instance of Excel already open.



MORE INFORMATION
In versions of Microsoft Excel prior to version 7.0, Excel was automatically registered in the ROT when it opened. Microsoft Excel 7.0 doesn't automatically register in the ROT by default on startup. The following sample code uses Windows API functions to detect if Microsoft Excel 7.0 is running and to register it in the ROT.

  Create a module and type the following lines in the Declarations section: Option Explicit

Const WM_USER = 1024 Declare Function FindWindow Lib "user32" Alias _ "FindWindowA" (ByVal lpClassName As String, ByVal _        lpWindowName As Long) As Long

Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hwnd As Long, ByVal wMsg _        As Long, ByVal wParam As Long, lParam As Long) As Long   Type the following procedure: Sub DetectExcel '=================================================================     'This procedure detects if Excel7 is running and registers it. '=================================================================     '      Dim hwnd As Long 'Find the windows handle for Excel. 'This returns a valid handle number, 'or zero if Excel is not running hwnd = FindWindow("XLMAIN", 0) If hwnd = 0 Then 'Excel is not running Exit Sub End If     'Excel is running 'Registers Excel in the ROT SendMessage hwnd, WM_USER + 18, 0, 0 End Sub 

In the GetObject Function Example in Microsoft Access for Windows 95 online Help, you can call the DetectExcel function before you run the GetObject procedure to be certain Microsoft Excel 7.0 is detected. For example, you can change the Help excerpt referenced earlier to: ' Test to see if there is a copy of Microsoft Excel already running. On Error Resume Next  ' Defer error trapping. ' GetObject function called without the first argument returns a  ' reference to an instance of the application. If the application ' is not running, an error occurs. Note the comma used as the first ' argument placeholder. DetectExcel Set MyXL = GetObject(, "Excel.Application")

