ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   GetObject when more than 1 Excel is running (https://www.excelbanter.com/excel-programming/414453-re-getobject-when-more-than-1-excel-running.html)

Peter T

GetObject when more than 1 Excel is running
 
As already suggested, where the filename is known use GetObject to reference
the workbook then attach to the parent application.

For situations where there is no known loaded wb, Jialiang Ge appears to
have demonstrated how to find multiple instances with .net

For VBA, I have two methods, briefly:

The first enumerates Excel windows, then workbook windows to find the file
name of a loaded wb. Having got that try GetObject parent. If that fails,
eg no loaded workbooks at all or some other reason, use DDE (from a helper
app) to add a new dummy hidden wb and try again.

The other way is finding in the ROT (clever stuff, not mine!) There are
dis/advantages with each. Via the ROT is faster but can't get be sure to get
all instances, eg no loaded wb as can with DDE (usually!).

If anyone is interested I have a demo that implements both methods. Having
got the ref's the withevents xlApp classes can track and record changes to
cells in all wb's in all instances, and one or two other things.

Regards,
Peter T
pmbthornton gmail com



"Ed White" wrote in message
...
From within VB.Net, if I want to access an instance of Excel that is

already
running, I'd use something like.
dim Exc as Excel.Application
Exc = GetObject(, "Excel.Application")

However, suppose I have more than one instance of Excel open. Is there a
way to cycle through each open instance, and to pick a specific one to

open?
--
Ed




Obaid Ullah

enumerates Excel windows
 
Can you share code that enumerates multiple Excel windows.



Peter T wrote:

As already suggested, where the filename is known use GetObject to
23-Jul-08

As already suggested, where the filename is known use GetObject to reference
the workbook then attach to the parent application.

For situations where there is no known loaded wb, Jialiang Ge appears to
have demonstrated how to find multiple instances with .net

For VBA, I have two methods, briefly:

The first enumerates Excel windows, then workbook windows to find the file
name of a loaded wb. Having got that try GetObject parent. If that fails,
eg no loaded workbooks at all or some other reason, use DDE (from a helper
app) to add a new dummy hidden wb and try again.

The other way is finding in the ROT (clever stuff, not mine!) There are
dis/advantages with each. Via the ROT is faster but can't get be sure to get
all instances, eg no loaded wb as can with DDE (usually!).

If anyone is interested I have a demo that implements both methods. Having
got the ref's the withevents xlApp classes can track and record changes to
cells in all wb's in all instances, and one or two other things.

Regards,
Peter T
pmbthornton gmail com



"Ed White" wrote in message
...
already
open?

Previous Posts In This Thread:

On Tuesday, July 22, 2008 6:41 PM
ewhit wrote:

GetObject when more than 1 Excel is running
From within VB.Net, if I want to access an instance of Excel that is already
running, I'd use something like.
dim Exc as Excel.Application
Exc = GetObject(, "Excel.Application")

However, suppose I have more than one instance of Excel open. Is there a
way to cycle through each open instance, and to pick a specific one to open?
--
Ed

On Tuesday, July 22, 2008 10:49 PM
Doug Glancy wrote:

GetObject when more than 1 Excel is running
Ed,

Check out this page:
http://support.microsoft.com/kb/288902

Here's the relevant part:
You can attach to a specific instance if you know the name of an open
document in that instance. For example, if an instance of Excel is running
with an open workbook named Book2, the following code attaches successfully
to that instance even if it is not the earliest instance that was launched:
Set xlApp = GetObject("Book2").Application

Depending on what you're doing you might consider using CreateObject instead
and opening the file you are interested in. I think that's generally
considered a safer practice.
hth,

Doug

"Ed White" wrote in message
...

On Wednesday, July 23, 2008 8:35 AM
Peter T wrote:

As already suggested, where the filename is known use GetObject to
As already suggested, where the filename is known use GetObject to reference
the workbook then attach to the parent application.

For situations where there is no known loaded wb, Jialiang Ge appears to
have demonstrated how to find multiple instances with .net

For VBA, I have two methods, briefly:

The first enumerates Excel windows, then workbook windows to find the file
name of a loaded wb. Having got that try GetObject parent. If that fails,
eg no loaded workbooks at all or some other reason, use DDE (from a helper
app) to add a new dummy hidden wb and try again.

The other way is finding in the ROT (clever stuff, not mine!) There are
dis/advantages with each. Via the ROT is faster but can't get be sure to get
all instances, eg no loaded wb as can with DDE (usually!).

If anyone is interested I have a demo that implements both methods. Having
got the ref's the withevents xlApp classes can track and record changes to
cells in all wb's in all instances, and one or two other things.

Regards,
Peter T
pmbthornton gmail com



"Ed White" wrote in message
...
already
open?


Submitted via EggHeadCafe - Software Developer Portal of Choice
Xcompress - IIS HTTP Compression
http://www.eggheadcafe.com/tutorials...http-comp.aspx

Peter T

enumerates Excel windows
 
One way -

Option Explicit
Private Declare Function FindWindowEx Lib "user32" Alias _
"FindWindowExA" ( _
ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long

Sub test()
Dim i As Long
Dim arrXLhWnd() As Long

If GetXLhWnds(arrXLhWnd) Then
For i = LBound(arrXLhWnd) To UBound(arrXLhWnd)
Debug.Print arrXLhWnd(i)
Next
End If

End Sub

Function GetXLhWnds(arrXLhWnd() As Long) as Long
Dim n As Long
Dim hWndXL As Long, hWndDT As Long

ReDim arrXLhWnd(1 To 100) ' cater for 100 potential Excelinstances
hWndDT = GetDesktopWindow

Do
hWndXL = FindWindowEx(hWndDT, hWndXL, "XLMAIN", vbNullString)
If hWndXL Then
n = n + 1
arrXLhWnd(n) = hWndXL
End If
Loop Until hWndXL = 0

If n Then
ReDim Preserve arrXLhWnd(1 To n)
GetXLhWnds = n
Else
Erase arrXLhWnd
End If

End Function

Regards,
Peter T


<Obaid Ullah wrote in message ...
Can you share code that enumerates multiple Excel windows.



Peter T wrote:

As already suggested, where the filename is known use GetObject to
23-Jul-08

As already suggested, where the filename is known use GetObject to
reference
the workbook then attach to the parent application.

For situations where there is no known loaded wb, Jialiang Ge appears to
have demonstrated how to find multiple instances with .net

For VBA, I have two methods, briefly:

The first enumerates Excel windows, then workbook windows to find the file
name of a loaded wb. Having got that try GetObject parent. If that
fails,
eg no loaded workbooks at all or some other reason, use DDE (from a helper
app) to add a new dummy hidden wb and try again.

The other way is finding in the ROT (clever stuff, not mine!) There are
dis/advantages with each. Via the ROT is faster but can't get be sure to
get
all instances, eg no loaded wb as can with DDE (usually!).

If anyone is interested I have a demo that implements both methods. Having
got the ref's the withevents xlApp classes can track and record changes to
cells in all wb's in all instances, and one or two other things.

Regards,
Peter T
pmbthornton gmail com



"Ed White" wrote in message
...
already
open?

Previous Posts In This Thread:

On Tuesday, July 22, 2008 6:41 PM
ewhit wrote:

GetObject when more than 1 Excel is running
From within VB.Net, if I want to access an instance of Excel that is
already
running, I'd use something like.
dim Exc as Excel.Application
Exc = GetObject(, "Excel.Application")

However, suppose I have more than one instance of Excel open. Is there a
way to cycle through each open instance, and to pick a specific one to
open?
--
Ed

On Tuesday, July 22, 2008 10:49 PM
Doug Glancy wrote:

GetObject when more than 1 Excel is running
Ed,

Check out this page:
http://support.microsoft.com/kb/288902

Here's the relevant part:
You can attach to a specific instance if you know the name of an open
document in that instance. For example, if an instance of Excel is running
with an open workbook named Book2, the following code attaches
successfully
to that instance even if it is not the earliest instance that was
launched:
Set xlApp = GetObject("Book2").Application

Depending on what you're doing you might consider using CreateObject
instead
and opening the file you are interested in. I think that's generally
considered a safer practice.
hth,

Doug

"Ed White" wrote in message
...

On Wednesday, July 23, 2008 8:35 AM
Peter T wrote:

As already suggested, where the filename is known use GetObject to
As already suggested, where the filename is known use GetObject to
reference
the workbook then attach to the parent application.

For situations where there is no known loaded wb, Jialiang Ge appears to
have demonstrated how to find multiple instances with .net

For VBA, I have two methods, briefly:

The first enumerates Excel windows, then workbook windows to find the file
name of a loaded wb. Having got that try GetObject parent. If that
fails,
eg no loaded workbooks at all or some other reason, use DDE (from a helper
app) to add a new dummy hidden wb and try again.

The other way is finding in the ROT (clever stuff, not mine!) There are
dis/advantages with each. Via the ROT is faster but can't get be sure to
get
all instances, eg no loaded wb as can with DDE (usually!).

If anyone is interested I have a demo that implements both methods. Having
got the ref's the withevents xlApp classes can track and record changes to
cells in all wb's in all instances, and one or two other things.

Regards,
Peter T
pmbthornton gmail com



"Ed White" wrote in message
...
already
open?


Submitted via EggHeadCafe - Software Developer Portal of Choice
Xcompress - IIS HTTP Compression
http://www.eggheadcafe.com/tutorials...http-comp.aspx





All times are GMT +1. The time now is 12:42 PM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com