2017-03-06 4 views
0

Ich habe ein Benutzerformular, das beim Öffnen der Arbeitsmappe geöffnet wird. Excel ist auch ausgeblendet, so dass das Benutzerformular alles ist, was dem Benutzer angezeigt wird.vba Benutzerformular beim Öffnen anzeigen, Arbeitsblatt ausblenden, Taskleisten-Symbol beibehalten

Private Sub Workbook_Open() 
Application.Visible = False 
UserForm1.Show vbModeless 
End Sub 

Dies ist jedoch verbirgt sich auch das Symbol für Excel in der Taskleiste, so dass, wenn ein Benutzer aus dem Benutzerformular Klicks entfernt sie bekommen können in sie nicht zurück, es sei denn mit Alt + Tab oder schließt/minimiert andere Fenster, die vor sind des Benutzerformulars. Ich möchte nicht, dass die Benutzer dies tun, und manche versuchen sogar, das Formular erneut zu öffnen (vorausgesetzt, es ist geschlossen), was wiederum zu Aufforderungen und Fehlern führt, die ich auch nicht möchte.

Im Wesentlichen brauche ich ein Symbol in der Taskleiste für das Benutzerformular.

Sobald die Userform geschlossen ist, ich habe es so, dass Excel

schließt
Unload UserForm1 
Application.Quit 

Beispiele Ich habe im Internet für dieses Problem gefunden nicht ganz erreichen, was ich zu tun versuchen. Ändern der Form zu minimieren und offen wie modal arbeitet das Symbol in der Taskleiste zu halten und den Benutzer nicht bearbeiten lassen Sie das Arbeitsblatt

Application.WindowState = xlMinimized 
UserForm1.Show (1) 

Das hat aber zwei Probleme ..... 1. - die Userform nicht der Fokus wird, 2. - der Benutzer kann auf das Taskleistensymbol klicken und das Blatt ist jetzt hinter dem Benutzerformular sichtbar, was ich nicht tun kann, was sie können.

+1

Was ist damit: http://stackoverflow.com/questions/15949023/displaying-an-excel-userform-as-a-button-in-the-taskbar –

+0

Ich habe gerade versucht, und es ist nicht erschienen etwas tun. Ich bin nicht vertraut mit Klassenmodulen, so ist es wahrscheinlich etwas falsch mit der Implementierung. Ich habe es in ein neues Klassenmodul für das Benutzerformular eingefügt (Rechtsklick> Einfügen> Klassenmodul), gespeichert und die Arbeitsmappe erneut ausgeführt. – Aurelius

+0

Ich verstehe, dass die Lösung in der Frage nicht geradlinig ist, aber es sieht sehr * aus * ein Duplikat Ihrer Frage. Der Code in dieser Frage wird in das Userform-Modul eingegeben - was eigentlich eine Klasse ist. –

Antwort

0

Anstatt verstecken die Anwendung minimieren die Arbeitsmappe:

ThisWorkbook.Windows(1).WindowState = xlMinimized 
+0

Entschuldigung, ich sollte dieses enthalten, da ich das schon habe. Das Problem ist dann, dass der Benutzer auf das Taskleistensymbol klicken kann, um das Arbeitsblatt wieder zu maximieren. – Aurelius

0

ich eine beträchtliche Menge an Zeit, diese Aufgabe in der Entwicklung von Excel-Visio-Anwendung ausgegeben und mit dem gleichen Problem (Excel-Formular oben Visio konfrontiert/Excel- und VBA-Editor sind ausgeblendet - aber der Benutzer kann den Fokus einfach und nur weit hinten verlieren - Alt-Tabbing. Das gleiche Problem wie es ist!

Mein Algorithmus dieses Problem zu lösen war so etwas wie dies (All Code in Userform-Klasse):

Private Sub UserForm_Initialize() 

    'some init's above 
    ToggleExcel   'Toggle excel, all windows are hidden now! 
    ActivateVisio  'Visio fired and on top 
    SetStandAloneForm 'Let's customize form 
End Sub 

So beim Start wir unsere gewünschten Visio und Form aufweisen. Auf Terminate Ereignis I ToggleExcel wieder und minimieren Visio.

ToggleExcel:

Private Function ToggleExcel() 
    Static IsVBEWasVisible As Boolean 

    With Application 
     If .Visible = True Then 
      IsVBEWasVisible = .VBE.MainWindow.Visible 
      If IsVBEWasVisible Then _ 
        .VBE.MainWindow.Visible = False 
      .WindowState = xlMinimized 
      .Visible = False 
     Else 
      If IsVBEWasVisible Then _ 
        .VBE.MainWindow.Visible = True 
      .WindowState = xlMaximized 
      .Visible = True 
     End If 
    End With 
End Function 

SetStandAloneForm:

Um SetStandAloneForm ich diesen Block von API-Funktion deklariert:

#If VBA7 Then 
    Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long 
    Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
    Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
    Private Declare PtrSafe Function SetFocus Lib "user32" (ByVal hWnd As Long) As Long 
#Else 
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long 
    Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
    Private Declare Function SetFocus Lib "user32" (ByVal hWnd As Long) As Long 
#End If 

Actual SetStandAloneForm:

Private Function SetStandAloneForm() 
    Const GWL_STYLE As Long = -16 
    Const GWL_EXSTYLE As Long = -20 
    Const WS_CAPTION As Long = &HC00000 
    Const WS_MINIMIZEBOX As Long = &H20000 
    Const WS_MAXIMIZEBOX As Long = &H10000 
    Const WS_POPUP As Long = &H80000000 
    Const WS_VISIBLE As Long = &H10000000 
    Const WS_EX_DLGMODALFRAME As Long = &H1 
    Const WS_EX_APPWINDOW As Long = &H40000 
    Const SW_SHOW As Long = 5 

    Dim Hwnd As Long 
    Dim CurrentStyle As Long 
    Dim NewStyle As Long 

    If Val(Application.Version) < 9 Then 
     Hwnd = FindWindow("ThunderXFrame", Me.Caption) 'XL97 
    Else 
     Hwnd = FindWindow("ThunderDFrame", Me.Caption) '>XL97 
    End If 

    'Let's give to userform minimise and maximise buttons 
    CurrentStyle = GetWindowLong(Hwnd, GWL_STYLE) 
    NewStyle = CurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX 
    NewStyle = NewStyle And Not WS_VISIBLE And Not WS_POPUP 
    Call SetWindowLong(Hwnd, GWL_STYLE, NewStyle) 

    'Let's give to userform a taskbar icon 
    CurrentStyle = GetWindowLong(Hwnd, GWL_EXSTYLE) 
    NewStyle = CurrentStyle Or WS_EX_APPWINDOW 
    Call SetWindowLong(Hwnd, GWL_EXSTYLE, NewStyle) 
    Call ShowWindow(Hwnd, SW_SHOW) 

End Function 
+0

Wo befindet sich der dritte Codeabschnitt (SetStandAloneForm)? Es zeigt mir einen Fehler, wenn es in die Benutzerformular-Klasse – Aurelius

+1

@Demo, Hey, welcher Fehler? Dieser Block kann beliebig platziert werden (aber im Rahmen der API-Funktionen), Sie müssen nur dort "Caption" des Formulars übergeben und "Me.Caption" Abschnitte innerhalb ersetzen. – CommonSense

+0

Ich platziere sie nacheinander, also setze ich sie nach 'End Function' des Codes in der ersten Box und vor' Private Funtion ToggleExcel() 'in Ihre 3.Code Box. Der Fehler ist Compile Error: Nur Kommentare können nach End Sub, End Function, End Property angezeigt werden. – Aurelius

Verwandte Themen