2013-04-11 30 views
5

Chcę ukryć przycisk programu Excel na pasku zadań i wyświetlić osobny przycisk dla mojego formularza użytkownika, aby samemu poczuł się jak aplikacja. Wiem, że to zostało dużo pokryte, ale mam problem z konkretnym problemem: mój kod działa poprawnie, kiedy go przejdę, ale nie, jeśli pozwolę mu działać normalnie. Oto kod, który umieściłem w module klasy UserForm1:Wyświetlanie formularza użytkownika programu Excel jako przycisku na pasku zadań

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 

Stepping za pomocą kodu, kiedy wkroczyć 2 do ostatniego wiersza AppActivate oddzielny przycisk pojawia się na pasku zadań, a ostatnim wierszu ukrywa oryginalny przycisk skoroszytu programu Excel na pasku zadań. Zostaje mi wtedy tylko formularz użytkownika, który można zmaksymalizować lub zminimalizować na pasku zadań, jak każdą normalną aplikację. Problem polega na tym, że jeśli załaduję formularz użytkownika za pomocą kodu, oddzielny przycisk dla formularza użytkownika nie pojawi się na pasku zadań, więc na pasku zadań nie ma już przycisków Excel.

+0

Co się stanie, jeśli dodasz 'DoEvents' po' DrawMenuBar lFrmWndHdl' –

+0

a także po 'AppActivate ("Microsoft Excel")' –

+0

Próbowałem tego. To nie pomaga. Próbowałem również application.wait. –

Odpowiedz

1

Aby odpowiedzieć na własne pytanie: problemu nie było w kodzie podanym powyżej, ale w sposobie załadowania formularza użytkownika. Powinien być załadowany jako modeless.

0

Wystarczy umieścić poniższy kod w głównej podmenu UserForm_Initialize, co zminimalizuje okno aplikacji Excel, pozostawiając formularz otwarty na pulpicie.

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

To nadal będzie wyświetlać aplikację Excel na pasku zadań. Chciałem to ukryć. –

Powiązane problemy