如何使用Excel VBA将ActiveWorkbook显示在窗口前面?

dwthyt8l  于 2023-01-21  发布在  其他
关注(0)|答案(5)|浏览(461)

我发现Workbook.Activate并不总是把工作簿放在窗口的最前面,我想知道什么是正确的方法来设置一个工作簿作为窗口的顶部,这样当宏完成时,这就是你正在查看的工作簿。
我应该使用任何基于Windows()的代码还是这与.setfocus有关?我只是猜测。

umuewwlo

umuewwlo1#

只需致电:

Windows("Book1.xlsm").Activate
flvlnr44

flvlnr442#

Workbook本身可能不够合格,具体取决于您在运行时在屏幕上实际看到的内容。如果VBA在同一工作簿中运行,请尝试
ThisWorkbook.Activate.
如果您的代码位于工作簿WB2中,但正在处理另一个工作簿WB1,则可能需要使用该工作簿作为参数调用VBA,并在代码结束时将其激活。
因此,示例VBA代码位于WB2中...

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

VBA启动前的情况... WB2处于活动状态并执行代码

2行代码WB2仍然有效后,准备参数为

的子程序
已处理WB1,但WB2仍处于活动状态

现在使WB1处于活动状态

sg3maiej

sg3maiej3#

Workbook.Activate不能将excel带到其他打开的窗口前面,例如浏览器或文件资源管理器。
为此,您可以使用Windows API:

#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

你可以像这样使用我写的Sub
SetWorkbookToForeground YourWorkbook
或者直接使用API函数,如下所示:
SetForegroundWindow FindWindow("XLMAIN", YourWorkbook.Name & " - Excel")
如果您在宏运行时打开VBA IDE,则宏运行完成后,它将被设置为前景窗口,我不知道如何更改此设置。
然而,我不认为这应该是一个问题,因为最终,无论如何,您将直接从工作簿中的按钮/快捷方式调用宏。

mrphzbgm

mrphzbgm4#

我也遇到了同样的问题,这个方法对我非常有效:

Workbooks.Open (ThisWorkBook.FullName)

由于这是您正在使用的当前工作簿,因此它不会打开另一个工作簿,但会激活您的窗口,即使您在顶部有其他应用程序。

but5z9lq

but5z9lq5#

我发现了一个技巧,迫使工作簿显示在前面:

Application.DisplayAlerts = False
WB2_TO_BRING_TO_FRONT.SaveAs "Error!" 
Application.DisplayAlerts = True

相关问题