AW: VBA Wechsel aus Excel zu geöffnetem Opera Browser
25.08.2025 17:28:13
volti
Hallo Udo,
es gibt verschiedene Methoden, eine Anwendung zu aktvieren.
Ich denke, der VBA-Befehl AppActivate wird hier nicht zum Ziel führen. Hier wird man wohl auch den momentanen Fenstertext des geöffneten Browsers haben müssen.
Habe ich aber nicht ausprobiert.
Bleiben noch Möglichkeiten über die Windows-API.
Allen voran die FindWindow-Funktion, die feststellt, ob die App schon geladen ist. Diese benötigt jedoch ebenfalls den vollständigen Fenstertext oder den vollständigen Klassennamen. Hier ein Beispiel, wie der Edge-Browser anhand der Klasse in den Vordergrund gebracht wird.
Private Declare PtrSafe Function FindWindowA Lib "user32" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" ( _
ByVal hwnd As LongPtr) As Long
Sub AnwendungInVordergrundSetzen()
Dim hwnd As LongPtr, sClassname As String
sClassname = "Chrome_WidgetWin_1" ' Hier Klasse ggf. ersetzen
hwnd = FindWindowA(sClassname, "")
If hwnd > 0 Then
SetForegroundWindow hwnd
Else
Shell "C:\Users\die\AppData\Local\Programs\Opera GX\opera.exe", vbNormalNoFocus
End If
End Sub
Es wird der Browser im Arbeitsspeicher des Computers gesucht und wenn gefunden in den Vordergrund geschoben. Es gibt noch andere Befehle wie z.B. ActivateWindow oder SetFocus, aber dieses hier dürfte genügen.
Wird der Browser nicht gefunden, weil nicht geladen, kann man ihn ja dann neu starten.
Da ich keinen Opera einsetze, kenne ich die Klasse nicht. Mit diesem code hier kannst Du die Klasse aber ganz einfach ermitteln.
Private Declare PtrSafe Function EnumWindows Lib "user32" ( _
ByVal lpEnumFunc As LongPtr, ByVal lparam As LongPtr) As Long
Private Declare PtrSafe Function GetWindowTextA Lib "user32" ( _
ByVal hwnd As LongPtr, ByVal lpString As String, _
ByVal cch As Long) As Long
Private Declare PtrSafe Function GetClassNameA Lib "user32" ( _
ByVal hwnd As LongPtr, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
Private msWindowTitle As String, msClassname As String
Private Function EnumWindowProc(ByVal hwnd As LongPtr, lparam As LongPtr) As Long
Dim sText As String * 255, L As Long
EnumWindowProc = 1
L = GetWindowTextA(hwnd, sText, 255) ' Fenstertext holen
If Left$(sText, L) Like msWindowTitle Then
msWindowTitle = Left$(sText, L)
L = GetClassNameA(hwnd, sText, 255) ' Klassennamen holen
msClassname = Left$(sText, L)
Debug.Print msClassname, msWindowTitle
End If
End Function
Sub ListeApps()
msWindowTitle = "*Edge"
msClassname = "*"
Call EnumWindows(AddressOf EnumWindowProc, 0)
End Sub
Starte Opera und passe die Variable msWindowTitle mit einem passenden Fenstertext des aktiven Opera in ListeApps an. Dann lass das Marko laufen. Es sollten jetzt die Klassen und Fenstertexte der gefundenen Anwendungen im Debug.Fenster angezeigt werden. Dann den Klassennamen in der Sub AnwendungInVordergrundSetzen anpassen.
Das sollte dann funktionieren.
Gruß
Karl-Heinz