Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1420to1424
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Excel Focus

Excel Focus
10.04.2015 17:12:30
Albert
Ich starte aus einem Menü-Workbook mit einem Makro eine neue Excelinstanz und öffne mit open ein Workbook. Im geöffneten Workbook wird mit Sub Workbook_open eine userform geöffnet. Da jedoch im Menü-Workbook das Makro noch nicht fertig ist, liegt der Focus von Excel immer noch beim Menü-Makro und ich kann im Menü-Workbook keine Eingaben mehr machen, bis ich im neuen Workbook die userform schliesse. Wie kann ich den Focus vom Menü-Makro auf das neue Workbook bekommen.
Aufruf des neuen Workbook:
Dim myExcel As Object
Dim myExcelSheet As Object
Set myExcel = CreateObject("Excel.Application")
With myExcel
.Workbooks.Open "Z:\Intern\Montageleitung\Wocheneinteilung.xlsm"
End
End With
GoTo ende

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel Focus
10.04.2015 17:49:24
Klexy
Was ist ein "Menü-Workbook" und ein "Menü-Makro"?

AW: Excel Focus
10.04.2015 18:03:36
Nepumuk
Hallo,
wenn du von der aufrufenden Mappe keinen Zugriff auf die andere Mappe benötigst, ändere das Makro so:
Public Sub Start()
    Dim objExcel As Application
    Set objExcel = CreateObject("Excel.Application")
    Call objExcel.Workbooks.Open(Filename:="Z:\Intern\Montageleitung\Wocheneinteilung.xlsm")
    Set objExcel = Nothing
End Sub

In der aufgerufenen Mappe:
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_Open()
    Call Application.OnTime(Now, "StartUserform")
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub StartUserform()
    UserForm1.Show
End Sub

' **********************************************************************
' Modul: UserForm1 Typ: Userform
' **********************************************************************

Option Explicit

Private Declare PtrSafe Function SetForegroundWindow Lib "user32.dll" ( _
    ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As LongPtr) As LongPtr
Private Declare Function SetActiveWindow Lib "user32.dll" ( _
    ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function FormatMessageA Lib "kernel32.dll" ( _
    ByVal dwFlags As Long, _
    ByRef lpSource As Any, _
    ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, _
    ByVal lpBuffer As String, _
    ByVal nSize As Long, _
    ByRef Arguments As LongPtr) As Long
Private Declare PtrSafe Function GetLastError Lib "kernel32.dll" () As Long

Private Const GWL_EXSTYLE As Long = -20&
Private Const WS_EX_APPWINDOW As LongPtr = &H40000
Private Const LANG_NEUTRAL As Long = &H0
Private Const ERROR_BUFFER As Long = &HC8
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Const GC_CLASSNAMEUSERFORM As String = "ThunderDFrame"

Private Sub CommandButton1_Click()
    Call Unload(Me)
End Sub

Private Sub UserForm_Activate()
    
    Dim lngptrFormHwnd As LongPtr, lngptrStyle As LongPtr
    Dim lngptrReturn As LongPtr, lngptrThreadWindow As LongPtr
    Dim lngptrForegroundWindow As LongPtr, lngptrThreadForeWindow As LongPtr
    Dim strBuffer As String
    
    With Application
        .IgnoreRemoteRequests = True
        .Visible = False
    End With
    
    lngptrFormHwnd = FindWindowA(GC_CLASSNAMEUSERFORM, Caption)
    If lngptrFormHwnd = 0 Then Call Err.Raise(Number:=vbObjectError, _
        Description:="Userformfenster nicht gefunden.")
    
    lngptrStyle = GetWindowLongA(lngptrFormHwnd, GWL_EXSTYLE)
    
    If lngptrStyle = 0 Then
        strBuffer = Space$(ERROR_BUFFER)
        Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, _
            LANG_NEUTRAL, strBuffer, ERROR_BUFFER, ByVal CLngPtr(0))
        Call Err.Raise(Number:=vbObjectError, Description:=strBuffer)
    Else
        
        lngptrStyle = lngptrStyle Or WS_EX_APPWINDOW
        
        lngptrReturn = SetWindowLongA(lngptrFormHwnd, GWL_EXSTYLE, lngptrStyle)
        
        If lngptrReturn = 0 Then
            strBuffer = Space$(ERROR_BUFFER)
            Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, _
                LANG_NEUTRAL, strBuffer, ERROR_BUFFER, ByVal CLngPtr(0))
            Call Err.Raise(Number:=vbObjectError, Description:=strBuffer)
        Else
            
            DoEvents
            lngptrReturn = SetForegroundWindow(CLngPtr(Application.hwnd))
            
            If lngptrReturn = 0 Then
                strBuffer = Space$(ERROR_BUFFER)
                Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, _
                    LANG_NEUTRAL, strBuffer, ERROR_BUFFER, ByVal CLngPtr(0))
                Call Err.Raise(Number:=vbObjectError, Description:=strBuffer)
            Else
                
                DoEvents
                lngptrReturn = SetForegroundWindow(lngptrFormHwnd)
                
                If lngptrReturn = 0 Then
                    strBuffer = Space$(ERROR_BUFFER)
                    Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, _
                        LANG_NEUTRAL, strBuffer, ERROR_BUFFER, ByVal CLngPtr(0))
                    Call Err.Raise(Number:=vbObjectError, Description:=strBuffer)
                End If
            End If
        End If
    End If
    Exit Sub
    err_exit:
    Call MsgBox("Fehler: " & CStr(Err.Number) & vbLf & vbLf & _
        Err.Description, vbCritical, "Fehlermeldung")
End Sub

Private Sub UserForm_Terminate()
    With Application
        .IgnoreRemoteRequests = False
        .Visible = True
        .WindowState = xlMaximized
    End With
End Sub

Das Userform kommt in den Vordergrund und bekommt einen Eintrag in der Taskleiste damit du es hinter einem anderen Fenster wieder hervorholen kannst.
Gruß
Nepumuk

Anzeige
AW: Excel Focus
10.04.2015 18:07:54
Daniel
Hi
die Userform in der geöffneten Datei muss die Eigenschaft: ShowModal = False haben.
Wenn ShowModal = True ist, dann wartet Excel mit allen Aktivitäten bis die Userform geschlossen wird.
Du kannst dies in der Eigenschaftsliste der Userfom so einstellen oder mit Userform1.Show False beim Öffnen angeben.
Gruß Daniel

AW: Excel Focus
13.04.2015 09:38:06
Albert
Hallo an alle,
habe mich für die einfache Lösung vom Daniel entschieden.
Danke für die Hilfe.
Schöne Grüsse

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige