Em mais uma das solicitações de nosso fórum, veio a necessidade de fazer com que a janela do Microsoft Excel ganhasse foco quando uma macro fosse executada.
Normalmente, isso é feito quando a rotina que dá o foco roda sob um determinado evento externo, como o tempo, já que é um dos únicos casos em que a aplicação VBA não estará em uso e precisará ganhar o foco. Para tal necessidade, o pessoal da Ozgrid (sempre eles) disponibilizou uma macro que realiza o procedimento. Ela faz o uso de API, como já deveria ser esperado por uma função não nativa do Excel.
Option Explicit
'Windows API Declarations, variables
Declare Function alias_ShowWindow Lib "User32" Alias "ShowWindow" _
(ByVal hWnd As Integer, ByVal nCmdShow As Integer) As Integer
Declare Function alias_FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal lpclassname As String, ByVal lpCaption As Any) As Integer
Declare Function alias_SetActiveWindow Lib "User32" Alias "SetActiveWindow" _
(ByVal hWnd As Integer) As Integer
'Window handler function
Function AppActivateClass(lpclassname$)
Dim hWnd As Integer 'the application's window handle
Dim dummy As Integer 'Dummy variable
'Get the Window Handle
hWnd = alias_FindWindow(lpclassname$, 0&)
'Activate the Application
dummy = alias_SetActiveWindow(hWnd)
'First close the window
dummy = alias_ShowWindow(hWnd, 2)
'Then activate the window
dummy = alias_ShowWindow(hWnd, 9)
'Return True if Application Running, or False if not.
AppActivateClass = hWnd
End Function
'Code to activate the function above
Sub ActivateXLS()
x = AppActivateClass("XLMain")
End Sub |
Option Explicit
'Windows API Declarations, variables
Declare Function alias_ShowWindow Lib "User32" Alias "ShowWindow" _
(ByVal hWnd As Integer, ByVal nCmdShow As Integer) As Integer
Declare Function alias_FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal lpclassname As String, ByVal lpCaption As Any) As Integer
Declare Function alias_SetActiveWindow Lib "User32" Alias "SetActiveWindow" _
(ByVal hWnd As Integer) As Integer
'Window handler function
Function AppActivateClass(lpclassname$)
Dim hWnd As Integer 'the application's window handle
Dim dummy As Integer 'Dummy variable
'Get the Window Handle
hWnd = alias_FindWindow(lpclassname$, 0&)
'Activate the Application
dummy = alias_SetActiveWindow(hWnd)
'First close the window
dummy = alias_ShowWindow(hWnd, 2)
'Then activate the window
dummy = alias_ShowWindow(hWnd, 9)
'Return True if Application Running, or False if not.
AppActivateClass = hWnd
End Function
'Code to activate the function above
Sub ActivateXLS()
x = AppActivateClass("XLMain")
End Sub
O código é exatamente como o original, mas gera um erro. Ao chamar a função ActivateXLS, o sistema dá como variável não declarada, já que o Option Explicit está ativado na primeira linha. Basta excluir a linha ou retirar o “x = ” antes da chamada. Voilá!
Referência
http://www.ozgrid.com/forum/showthread.php?t=45148&page=1