Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Wechsel zwischen Anwendungen mit VBA

Wechsel zwischen Anwendungen mit VBA
04.01.2007 12:05:55
Lars
Hallo,
ich rufe per VBA eine externe Anwendung auf. Diese wird ein einem neuen aktiven Fester ausgeführt.
Wie kann ich das aktive Fenster mit VBA wechseln?
Ich möchte an dem ExcelSheet weiterarbeiten!
Viele Grüsse und Dank!
Lars
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wechsel zwischen Anwendungen mit VBA
04.01.2007 12:51:20
Ramses
Hallo
Wie rufst du die externe Anwendung auf ?
Du musst doch nicht den Focus übergeben.
zeig mal den Code den du verwendest
Gruss Rainer
AW: Wechsel zwischen Anwendungen mit VBA
04.01.2007 13:59:40
Lars
Hallo Rainer!
Hier ist mein Code:

Sub pdfe()
blp = DDEInitiate("WinBlp", "bbk")
Call DDEExecute(blp, "<blp-0>" & "<cancel>" & "PDFE<go><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr><tabr>Y<go>1<go>")
End Sub

Grüsse und Dank!
Lars
Anzeige
AW: Wechsel zwischen Anwendungen mit VBA
04.01.2007 16:03:39
Ramses
Hallo
Sorry, ich dachte du verwendest den SHELL- Befehl.
Mit DDE kann ich hier leider nix anfangen :-(
Daher die Frage noch auf offen.
Ich würde an Deiner Stelle eine API Funktion verwenden, die vorher das Handle für das Aktive EXCEL Window zurückgibt, das kannst du nach dem DDE Befehl dann wieder in den Vordergrund bringen.
Musst du mal probieren
Option Explicit

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd 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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function SetActiveWindow Lib "User" (ByVal hwnd As Integer) As Integer
Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
    ByVal cy As Long, ByVal wFlags As Long) As Long


Const HWND_Top = 0
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const FLAGS = 0 'SWP_NOMOVE Or SWP_NOSIZE
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GWL_STYLE = (-16)
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000

Public Sub GetWindowBack()
    Dim hwnd As Long, sTitle As String, lStyle As Long, Task_name() As String
    Dim myApplication
    Dim count As Integer, index As Integer, gefunden As Boolean
    hwnd = FindWindow(ByVal 0&, ByVal 0&)
    hwnd = GetWindow(hwnd, GW_HWNDFIRST)
    Do
        lStyle = GetWindowLong(hwnd, GWL_STYLE)
        lStyle = lStyle And (WS_VISIBLE Or WS_BORDER)
        sTitle = GetWindowTitle(hwnd)
        'Sucht in den gerade geöffneten Fenster nach einem
        'Fenster mit dem Teilstring "TabellenNammen"
        If Trim(sTitle) <> "" And InStr(UCase(sTitle), UCase(ActiveWorkbook.Name)) <> 0 Then
            MsgBox "Titel: " & sTitle & ", Instanznummer: " & hwnd
            myApplication = SetWindowPos(hwnd, HWND_Top, 0, 0, 0, 0, FLAGS)
            Exit Sub
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop Until hwnd = 0
End Sub

Private Function GetWindowTitle(ByVal hwnd As Long) As String
    Dim lResult As Long, sTemp As String
    lResult = GetWindowTextLength(hwnd) + 1
    sTemp = Space(lResult)
    lResult = GetWindowText(hwnd, sTemp, lResult)
    GetWindowTitle = Left(sTemp, Len(sTemp) - 1)
End Function

Gruss Rainer
Anzeige
AW: Wechsel zwischen Anwendungen mit VBA
04.01.2007 17:10:41
Lars
Hallo Rainer,
erstmal großartigen Dank! Deine Hilfe löst mein Problem.
Nur noch eines: Das Excelfenster ist zwar nach Ausführung deines Makros aktiv, aber es befindet sich nicht im Vordergrund. Im Vordergrund befindet sich immer noch die DDE Anwendung.
Wie kann man ein aktives Fenster in den Vordergrund zu Ansicht bringen?
Vielen Dank & Grüsse
Lars
Anzeige
AW: Wechsel zwischen Anwendungen mit VBA
04.01.2007 18:34:21
Ramses
Hallo
Das ist abhängig von der anderern Anwendung wie die programmiert ist.
Wenn die sich selbst auf "TopMost" setzt kannst daran nichts ändern,... ausser du setzt deine eigene Application auf "TopMost"
Aber ACHTUNG !!!
Die ist dann wirklich "TopMost" und schwebt über allem wie z.B. der TaskManager.
Ändere die Zeile
myApplication = SetWindowPos(hwnd, HWND_Top, 0, 0, 0, 0, FLAGS)
in
myApplication = SetWindowPos(hwnd, HWND_TopMost, 0, 0, 0, 0, FLAGS)
Gruss Rainer
Anzeige
AW: Wechsel zwischen Anwendungen mit VBA
04.01.2007 19:02:00
Lars
Danke für deine super Hilfe!
Grüsse Lars
;
Anzeige
Anzeige

Infobox / Tutorial

Wechsel zwischen Excel-Anwendungen mit VBA


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.
  2. Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (deinWorkbookName)" und wähle Einfügen > Modul.
  3. Code einfügen: Kopiere den folgenden VBA-Code in das Modul:

    Option Explicit
    
    Private Declare Function SetWindowPos Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal hWndInsertAfter As Long, _
        ByVal X As Long, _
        ByVal Y As Long, _
        ByVal cx As Long, _
        ByVal cy As Long, _
        ByVal wFlags As Long) As Long
    
    Const HWND_TOP = 0
    Const HWND_TOPMOST = -1
    Const FLAGS = 0 'SWP_NOMOVE Or SWP_NOSIZE
    
    Public Sub WechselZuExcel()
        Dim hwnd As Long
        hwnd = Application.hWnd ' Holt das Handle des Excel-Fensters
        SetWindowPos hwnd, HWND_TOP, 0, 0, 0, 0, FLAGS ' Verschiebt das Excel-Fenster in den Vordergrund
    End Sub
  4. Makro ausführen: Schließe den VBA-Editor und kehre zu Excel zurück. Drücke ALT + F8, wähle WechselZuExcel und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Problem: Das Excel-Fenster bleibt im Hintergrund.

    • Lösung: Stelle sicher, dass die externe Anwendung nicht als "TopMost" gesetzt ist. Ändere den Code in SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS, um sicherzustellen, dass Excel in den Vordergrund kommt.
  • Problem: Fehlermeldung beim Ausführen des Makros.

    • Lösung: Überprüfe, ob der VBA-Code korrekt eingefügt wurde und dass die Bibliothek user32 verfügbar ist.

Alternative Methoden

  • Verwendung von API-Funktionen: Anstelle von SetWindowPos kannst du auch ShowWindow verwenden, um das Fenster sichtbar zu machen. Beispiel:

    Private Declare Function ShowWindow Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal nCmdShow As Long) As Long
    
    Const SW_SHOW = 5
    
    Public Sub ShowExcelWindow()
        Dim hwnd As Long
        hwnd = Application.hWnd
        ShowWindow hwnd, SW_SHOW
    End Sub
  • Shell-Befehl verwenden: Mit dem Shell-Befehl kannst du Anwendungen direkt aufrufen und den Fokus setzen, bevor du zu Excel zurückkehrst.


Praktische Beispiele

  1. Fenster zwischen Excel und einer DDE-Anwendung wechseln:

    Sub WechselZuDDE()
        Dim blp As Long
        blp = DDEInitiate("WinBlp", "bbk")
        ' Führe DDE-Befehle aus ...
        Call WechselZuExcel ' Wechsel zurück zu Excel
    End Sub
  2. Anwendung im Vordergrund halten:

    Sub SetzeAufTopMost()
        Dim hwnd As Long
        hwnd = Application.hWnd
        SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS
    End Sub

Tipps für Profis

  • Fehlerbehandlung einbauen: Verwende On Error Resume Next, um deinen Code robuster zu machen und unerwartete Fehler abzufangen.
  • Befehle automatisieren: Kombiniere mehrere VBA-Befehle in einem Makro, um einen reibungslosen Arbeitsablauf zwischen Excel und anderen Anwendungen zu gewährleisten.
  • Dokumentation: Kommentiere deinen Code gut, damit du und andere ihn später leicht verstehen können.

FAQ: Häufige Fragen

1. Wie kann ich das aktive Fenster einer Anwendung im Vordergrund halten?
Verwende die SetWindowPos-Funktion mit dem Parameter HWND_TOPMOST, um sicherzustellen, dass dein Excel-Fenster immer im Vordergrund bleibt.

2. Welche Excel-Version benötige ich für diese Methoden?
Die beschriebenen VBA-Methoden funktionieren in den meisten Versionen von Excel, die VBA unterstützen, einschließlich Excel 2010 und später.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige