2013-04-11 16 views
5

Tôi muốn ẩn nút Excel trên thanh tác vụ và hiển thị nút riêng cho biểu mẫu người dùng của tôi để nó giống như một ứng dụng. Tôi biết điều này đã được bảo hiểm rất nhiều nhưng tôi gặp rắc rối với một vấn đề cụ thể: mã của tôi hoạt động tốt khi tôi bước qua nó, nhưng không phải nếu tôi để cho nó chạy bình thường. Đây là mã, mà tôi đã đặt trong các mô-đun lớp Userform1:Hiển thị biểu mẫu người dùng Excel dưới dạng nút trên thanh tác vụ

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 

Bước qua mã, khi tôi bước vào thứ 2 đến dòng cuối cùng AppActivate một nút riêng biệt xuất hiện trong thanh tác vụ, và dòng cuối cùng ẩn nút gốc cho sổ làm việc Excel trong thanh tác vụ. Sau đó tôi chỉ còn lại một biểu mẫu người dùng có thể được phóng to hoặc thu nhỏ thành thanh tác vụ giống như bất kỳ ứng dụng thông thường nào. Vấn đề là nếu tôi tải biểu mẫu người dùng thông qua mã, nút riêng biệt cho biểu mẫu người dùng không xuất hiện trên thanh tác vụ, do đó không có các nút Excel nào hiển thị trên thanh tác vụ.

+0

gì sẽ xảy ra nếu bạn thêm 'DoEvents' sau' DrawMenuBar lFrmWndHdl' –

+0

Và cũng sau 'AppActivate ("Microsoft Excel") ' –

+0

Tôi đã cố gắng đó. Nó không giúp được gì. Tôi cũng đã thử application.wait. –

Trả lời

1

Để trả lời câu hỏi của riêng tôi: sự cố không nằm trong mã tôi đã đăng ở trên, nhưng theo cách thức, biểu mẫu người dùng đã được tải. Nó sẽ được nạp như là vô dụng.

0

Chỉ cần đặt mã sau vào phần chính UserForm_Initialize của bạn và nó sẽ thu nhỏ cửa sổ ứng dụng Excel trong khi vẫn để biểu mẫu của bạn mở trên màn hình.

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

Điều đó sẽ vẫn hiển thị ứng dụng Excel trong Thanh tác vụ. Tôi muốn giấu nó. –