2013-04-11 10 views
5

Desidero nascondere il pulsante Excel nella barra delle applicazioni e visualizzare un pulsante separato per il mio userform in modo che si senta come un'applicazione a sé stante. So che questo è stato trattato molto ma ho problemi con un problema specifico: il mio codice funziona bene quando lo passo, ma non se lo lascio funzionare normalmente. Ecco il codice, che ho messo nel modulo di classe di UserForm1:Visualizzazione di un userform di Excel come pulsante nella barra delle applicazioni

Option Explicit 

Private Declare Function GetWindowLong _ 
    Lib "user32" _ 
     Alias "GetWindowLongA" (_ 
      ByVal hWnd As Long, _ 
      ByVal nIndex As Long) _ 
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 DrawMenuBar _ 
    Lib "user32" (_ 
     ByVal hWnd As Long) _ 
As Long 

Private Declare Function FindWindowA _ 
    Lib "user32" (_ 
     ByVal lpClassName As String, _ 
     ByVal lpWindowName As String) _ 
As Long 

Private Const GWL_EXSTYLE = (-20) 
Private Const GWL_STYLE As Long = (-16) 
Private Const WS_EX_APPWINDOW = &H40000 
Private Const WS_SYSMENU As Long = &H80000 
Private Const WS_MINIMIZEBOX As Long = &H20000 
Private Const WS_MAXIMIZEBOX As Long = &H10000 

Private Sub UserForm_Activate() 

Dim lFrmWndHdl As Long 
Dim lStyle As Long 

lFrmWndHdl = FindWindowA(vbNullString, Me.Caption) 
lStyle = GetWindowLong(lFrmWndHdl, GWL_STYLE) 
lStyle = lStyle Or WS_SYSMENU 
lStyle = lStyle Or WS_MINIMIZEBOX 
lStyle = lStyle Or WS_MAXIMIZEBOX 
SetWindowLong lFrmWndHdl, GWL_STYLE, (lStyle) 
lStyle = GetWindowLong(lFrmWndHdl, GWL_EXSTYLE) 
lStyle = lStyle Or WS_EX_APPWINDOW 
SetWindowLong lFrmWndHdl, GWL_EXSTYLE, lStyle 
DrawMenuBar lFrmWndHdl 
AppActivate ("Microsoft Excel") 
ThisWorkbook.Application.Visible = False 

End Sub 

Facendo un passo attraverso il codice, quando faccio un passo nella seconda all'ultima riga AppActivate un pulsante separato compare nella barra delle applicazioni, e l'ultima riga nasconde il pulsante originale per la cartella di lavoro di Excel nella barra delle applicazioni. Mi rimane quindi solo un userform che può essere massimizzato o minimizzato sulla barra delle applicazioni come qualsiasi normale applicazione. Il problema è che se caricherò il form utente tramite codice, il pulsante separato per il form utente non verrà visualizzato nella barra delle applicazioni, quindi non ci sono pulsanti di Excel lasciati visualizzati nella barra delle applicazioni.

+0

Che cosa succede se si aggiunge '' DoEvents' dopo DrawMenuBar lFrmWndHdl' –

+0

E anche dopo il 'AppActivate ("Microsoft Excel")' –

+0

Ci ho provato. Non aiuta Ho provato anche application.wait. –

risposta

1

Per rispondere alla mia domanda: il problema non era nel codice che ho postato sopra, ma nel modo in cui è stato caricato il modulo utente. Dovrebbe essere caricato come non modale.

0

Inserisci semplicemente il codice seguente nel tuo sotto-oggetto principale UserForm_Initialize e ridurrà al minimo la finestra dell'applicazione Excel lasciando il modulo aperto sul desktop.

Private Sub minimizeWindow() 
    With Application 
    .WindowState = xlMinimized 
    End With 
End sub 
+0

Ciò visualizzerà ancora l'app Excel nella barra delle applicazioni. Volevo nasconderlo –

Problemi correlati