ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   How to detect MS Word or MS Access calls MS Excel using VBA (https://www.excelbanter.com/excel-programming/348276-how-detect-ms-word-ms-access-calls-ms-excel-using-vba.html)

Bon

How to detect MS Word or MS Access calls MS Excel using VBA
 
Hello all

Is it possible to detect which application call the MS Excel using VBA?

I want to put some conditions in the Workbook_Open() method.

IF MS Word call Then
Do Job 1
Else
Do Job 2

Any methods for doing it?

Thanks
Bon


RB Smissaert

How to detect MS Word or MS Access calls MS Excel using VBA
 
Application.Hinstance
Will give you the window handle of the calling application.

Then with this you can get the full path of the calling application with
code that was recently posted in
the microsoft.public.vb.winapi newsgroup:
GetModulePathFromHandle - by request. posted on 4 December by Kevin
Provance.

Maybe somebody knows a more direct way.

RBS


"Bon" wrote in message
oups.com...
Hello all

Is it possible to detect which application call the MS Excel using VBA?

I want to put some conditions in the Workbook_Open() method.

IF MS Word call Then
Do Job 1
Else
Do Job 2

Any methods for doing it?

Thanks
Bon



RB Smissaert

How to detect MS Word or MS Access calls MS Excel using VBA
 
Ignore my post as Hinstance returns the instance handle not the window
handle.

RBS

"RB Smissaert" wrote in message
...
Application.Hinstance
Will give you the window handle of the calling application.

Then with this you can get the full path of the calling application with
code that was recently posted in
the microsoft.public.vb.winapi newsgroup:
GetModulePathFromHandle - by request. posted on 4 December by Kevin
Provance.

Maybe somebody knows a more direct way.

RBS


"Bon" wrote in message
oups.com...
Hello all

Is it possible to detect which application call the MS Excel using VBA?

I want to put some conditions in the Workbook_Open() method.

IF MS Word call Then
Do Job 1
Else
Do Job 2

Any methods for doing it?

Thanks
Bon




RB Smissaert

How to detect MS Word or MS Access calls MS Excel using VBA
 
This is more difficult than I thought and I still don't understand it fully,
but here is some
code that might give you a start.
I am sure somebody more familiar with this can improve on it.


Option Explicit
Private Const GW_HWNDFIRST As Long = 0
Private Const GW_HWNDLAST As Long = 1
Private Const GW_HWNDNEXT As Long = 2
Private Const GW_HWNDPREV As Long = 3
Private Const GW_OWNER As Long = 4
Private Const GW_CHILD As Long = 5
Private Const GWL_HINSTANCE As Long = -6

Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long
Private Declare Function GetClassName Lib "user32" _
Alias "GetClassNameA" _
(ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hwnd As Long,
_
ByVal nIndex _
As Long) As Long

Function FindWindowHwndLike(hWndStart As Long, _
ClassName As String, _
WindowTitle As String, _
level As Long, _
lHolder As Long, _
Optional lHinstanceToFind As Long = -1, _
Optional coll As Collection) As Long

'finds the first window where the class name starts with ClassName
'and where the Window title starts with WindowTitle, returns Hwnd
'optionally finds:
'the hwnd of the calling process found by the Hinstance
'the window title of this calling application
'the window class of this calling application
'------------------------------------------------------------------
Dim hwnd As Long
Dim sWindowTitle As String
Dim sClassName As String
Dim r As Long
Static bFound As Boolean
Dim lCurrentHinstance As Long
Dim arr(1 To 3)

If level = 0 Then
bFound = False
End If

If bFound Then
Exit Function
End If

'Initialize if necessary. This is only executed
'when level = 0 and hWndStart = 0, normally
'only on the first call to the routine.
'----------------------------------------------
If level = 0 Then
If hWndStart = 0 Then
hWndStart = GetDesktopWindow()
End If
End If

'Increase recursion counter
'--------------------------
level = level + 1

'Get first child window
'----------------------
hwnd = GetWindow(hWndStart, GW_CHILD)

Do While hwnd 0 And bFound = False

'Search children by recursion
'----------------------------
lHolder = FindWindowHwndLike(hwnd, _
ClassName, _
WindowTitle, _
level, _
lHolder, _
lHinstanceToFind, _
coll)

'Get the window text
'-------------------
sWindowTitle = Space$(255)
r = GetWindowText(hwnd, sWindowTitle, 255)
sWindowTitle = Left$(sWindowTitle, r)

'get the class name
'------------------
sClassName = Space$(255)
r = GetClassName(hwnd, sClassName, 255)
sClassName = Left$(sClassName, r)

If lHinstanceToFind -1 Then
lCurrentHinstance = GetWindowLong(lHolder, _
GWL_HINSTANCE)
If lCurrentHinstance = lHinstanceToFind Then
arr(1) = lHolder
arr(2) = sWindowTitle
arr(3) = sClassName
coll.Add arr
FindWindowHwndLike = hwnd
lHolder = hwnd
bFound = True
Exit Function
End If
End If

If InStr(1, sWindowTitle, WindowTitle, vbTextCompare) 0 And _
InStr(1, sClassName, ClassName, vbTextCompare) 0 Then
FindWindowHwndLike = hwnd
lHolder = hwnd
If lHinstanceToFind = -1 Then
bFound = True
Exit Function
End If
End If

'Get next child window
'---------------------
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
Loop

FindWindowHwndLike = lHolder

End Function

Sub test()

Dim lHinstance As Long
Dim coll As Collection
Dim strResult As String
Dim i As Long

Set coll = New Collection

lHinstance = Application.Hinstance

FindWindowHwndLike 0, _
"", _
"CallingApp.xls", _
0, _
0, _
lHinstance, _
coll

For i = 1 To coll.Count
strResult = strResult & _
coll(i)(1) & " -- " & _
coll(i)(2) & " -- " & _
coll(i)(3) & _
vbCrLf
Next

MsgBox "Finding callers for Hinstance: " & lHinstance & _
vbCrLf & vbCrLf & _
strResult, , _
"calling hwnd -- calling window title -- calling window class"

End Sub


RBS



"Bon" wrote in message
oups.com...
Hello all

Is it possible to detect which application call the MS Excel using VBA?

I want to put some conditions in the Workbook_Open() method.

IF MS Word call Then
Do Job 1
Else
Do Job 2

Any methods for doing it?

Thanks
Bon




All times are GMT +1. The time now is 11:40 AM.

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