2009-02-01 68 views
0

我有一個小程序,可以在運行時打開和關閉大量不同的文檔文檔。它從網上加載一些文件,因此需要一段時間,我寧願讓用戶看一個小進度條,或者至少有一個表單中的消息告訴他們等待。使用Office VBA的進度條

但是,我似乎無法將該窗體保留在所有其他Office窗口之上。

我對實際進度條的代碼沒有問題,只是在代碼打開和關閉窗口時將該死的東西放在最上面。我試圖隱藏應用程序,但這似乎阻止了一些代碼運行。

無論我是否設置了模態或非模態,窗體都會在主窗口後面顯示,偶爾會顯示在頂窗上而不會重繪。

我可能剛剛錯過了「stayontop」屬性或什麼?

感謝

回答

1

我不認爲有任何內置的方式,使在VBA頂部的形式入住,但一個問題是,你調用DoEvents當你在表單上更新什麼?我的經驗是,除非您在循環中敲入Next語句之前調用DoEvents,否則表單不會重新繪製。

如果這不是你的問題,你可以使用Windows API調用來把一個窗口的頂部,雖然我不知道它使用此代碼停留在頂部:

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long 

Const SWP_NOMOVE = 2 
Const SWP_NOSIZE As Long = 1 
Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE 
Const HWND_TOPMOST = -1 
Const HWND_NOTOPMOST = -2 

Private Declare Function SetWindowPos Lib "user32" _ 
     (ByVal hwnd As Long, _ 
     ByVal hWndInsertAfter As Long, _ 
     ByVal x As Long, _ 
     ByVal y As Long, _ 
     ByVal cx As Long, _ 
     ByVal cy As Long, _ 
     ByVal wFlags As Long) As Long 

Private Function SetTopMostWindow(hwnd As Long, Topmost As Boolean) As Long 

    If Topmost = True Then 'Make the window topmost 
     SetTopMostWindow = SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS) 
    Else 
     SetTopMostWindow = SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS) 
     SetTopMostWindow = False 
    End If 
End Function 

Private Function GetFormHwnd() As Long 
    GetFormHwnd = FindWindow(CLng(0), Me.Caption) 
End Function 

Public Sub SetFormAsTopMostWindow() 
    Call SetTopMostWindow(GetFormHwnd(), True) 
End Sub 

我把這個一個表單的代碼模塊,它在移動其他應用程序時似乎可以工作;它保持在頂部。

+0

謝謝,將有一個發揮。 – user51498 2009-02-02 20:38:46