Sub CallStuff()
Debug.Print "Hey, I am " & ThisWorkbook.Name
Debug.Print "starting to work on " & Application.Workbooks("Book1").Name
DoStuff Application.Workbooks("Book1")
End Sub
Sub DoStuff(WB As Workbook)
WB.Worksheets("Sheet1").[A1] = "Co-cooo!"
'do other stuff on WB
WB.Activate
End Sub
#If VBA7 Then
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hWnd As LongPtr) As Boolean
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Boolean
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If
Sub SetWorkbookToForeground(Optional ByVal wb as Workbook = Nothing)
If wb Is Nothing Then Set wb = ThisWorkbook
SetForegroundWindow FindWindow("XLMAIN", wb.Name & " - Excel")
End Sub
5条答案
按热度按时间umuewwlo1#
只需致电:
flvlnr442#
Workbook
本身可能不够合格,具体取决于您在运行时在屏幕上实际看到的内容。如果VBA在同一工作簿中运行,请尝试ThisWorkbook.Activate
.如果您的代码位于工作簿WB2中,但正在处理另一个工作簿WB1,则可能需要使用该工作簿作为参数调用VBA,并在代码结束时将其激活。
因此,示例VBA代码位于WB2中...
VBA启动前的情况... WB2处于活动状态并执行代码
2行代码WB2仍然有效后,准备参数为
的子程序
已处理WB1,但WB2仍处于活动状态
现在使WB1处于活动状态
sg3maiej3#
Workbook.Activate
不能将excel带到其他打开的窗口前面,例如浏览器或文件资源管理器。为此,您可以使用Windows API:
你可以像这样使用我写的
Sub
:SetWorkbookToForeground YourWorkbook
或者直接使用API函数,如下所示:
SetForegroundWindow FindWindow("XLMAIN", YourWorkbook.Name & " - Excel")
如果您在宏运行时打开VBA IDE,则宏运行完成后,它将被设置为前景窗口,我不知道如何更改此设置。
然而,我不认为这应该是一个问题,因为最终,无论如何,您将直接从工作簿中的按钮/快捷方式调用宏。
mrphzbgm4#
我也遇到了同样的问题,这个方法对我非常有效:
由于这是您正在使用的当前工作簿,因此它不会打开另一个工作簿,但会激活您的窗口,即使您在顶部有其他应用程序。
but5z9lq5#
我发现了一个技巧,迫使工作簿显示在前面: