ACC95: GetObject Sample Function Does Not Detect Excel 7.0
ID: Q155201
|
The information in this article applies to:
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")
REFERENCES
For more information about the GetObject function, search on the phrase
"GetObject," and then view "GetObject Function" using the Answer Wizard
from the Microsoft Access for Windows 95 Help menu.
For more information about GetObject not detecting Microsoft Excel Version
7.0, please see the following articles in the Microsoft Knowledge Base:
Q138723 Code to Access MS Excel Doesn't Work in Version 7.0
Q153029 Microsoft Excel 95 Doesn't Respond Correctly to GetObject
Additional query words:
started open
Keywords : kbinterop kbprg IntpOlea
Version : WINDOWS:7.0
Platform : WINDOWS
Issue type :