2009-11-23 26 views
7

以下VBA代碼停止在Me.Show。在我的測試中,看起來Me.Show停止了所有的代碼執行,即使代碼位於UserForm中。爲什麼顯示用戶窗體爲模態停止代碼執行?

這部分是用戶窗體外:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    objProgress.ShowProgress 
    Unload objProgress 
End Sub 

這部分是用戶窗體內:

Private Sub ShowProgress() 
    Me.Show vbModal 
    Dim intSecond As Integer 
    For intSecond = 1 To 5 
     Application.Wait Now + TimeValue("0:00:01") 
     Me.ProgressBar1.Value = intSecond/5 * 100 
    Next intSecond 
    Me.Hide 
End Sub 

代碼停止在Me.Show,則顯示用戶窗體之後。沒有錯誤,它只是停止執行代碼。看來,以執行VBA模式UserForm內部代碼的唯一方法就是把它列入了UserForm_Activate過程是這樣的:

這部分是用戶窗體外:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    Load objProgress 
    Unload objProgress 
End Sub 

這部分是用戶窗體內:

Private Sub UserForm_Initialize() 
    Me.Show vbModal 
End Sub 

Private Sub UserForm_Activate() 
    Dim intSecond As Integer 
    For intSecond = 1 To 5 
     Application.Wait Now + TimeValue("0:00:01") 
     Me.ProgressBar1.Value = intSecond/5 * 100 
    Next intSecond 
    Me.Hide 
End Sub 

當然,我不能把Me.Show內UserForm_Activate因爲該過程只UserFo後大火rm顯示事件。

UserForm.ShowModal文檔說「當用戶窗體是模態的時,用戶必須提供信息或使用應用程序的任何其他部分之前關閉窗體。直到用戶窗體被隱藏或卸載不執行任何後續的代碼。

我正在嘗試使用模態UseForm作爲進度條,以防止用戶在進程運行時與應用程序進行交互。但是,如果我的所有代碼必須位於UserForm_Activate過程中,這將很難完成。

我在這裏錯過了什麼嗎?爲什麼所有代碼​​執行停止在Me.Show

回答

2

我想我明白了這一點。

Me.Show之後,UserForm_Activate事件觸發。如果在UserForm_Activate過程中沒有代碼,則不會發生任何事情,因爲VBA正在等待Me.Hide

所以事件的順序爲:Me.Show>UserForm_Activate>Me.Hide

,我想運行必須UserForm_Activate程序,而且必須Me.Hide之前的任何代碼。

該結構非常嚴格,但我可能能夠使用該結構對我有利。

+3

所有你真的需要,如果你想仍然能夠在窗體達與紙張互動做的是使用電話的用戶窗體時,此代碼: 'userform.show vbModeless'。 – Casey 2013-12-06 22:48:07

10

當表單顯示爲vbModal時,代碼將暫停執行並等待用戶與表單交互。例如點擊一個按鈕或使用下拉菜單。

如果您更新表單屬性

ShowModal = False 

,並從代碼中刪除vbModal。這將允許在顯示錶單時繼續執行代碼。

+0

是的,vbModeless用戶窗體很容易,但我需要鎖定用戶與應用程序的交互,直到過程完成。這只是解決如何在vbModal UserForm中構造代碼的問題。太糟糕了,文檔不僅僅是說「如果你使用vbModal,確保你想要在UserForm_Activate和_before_ Me.Hide中執行任何代碼。謝謝! – Kuyenda 2009-11-23 18:17:48

+0

這對我不起作用。調用'sub'繼續運行,但絕對不會渲染任何組件,甚至不是一個簡單的標籤。 – cbaldan 2017-12-05 20:19:18

-3

我真的不知道什麼進入你的頭腦,因爲有各種各樣的你所問的代碼,但我希望這可以幫助

私人小組cmdSwitch_Click() UserForm1.Hide UserForm2 .Show

末次

-2

我想我想通了 嘗試做這個簡單的步驟, 在你形成對銀行部分右鍵,然後單擊屬性 改變「的ShowModal」爲False 或VBA代碼,當你使用下面的代碼顯示用戶窗體:

UserForm1.Show假

5

我正在尋找一個答案,爲什麼我收到以下錯誤:

Run time error '5': Invalid procedure call or argument

時運行此行代碼:

UserForm1.Show True 

即使這條線的工作原理:

UserForm1.Show False 

當然。 是不一樣的vbModal!所以,簡單的答案是使用正確的枚舉:

UserForm1.Show vbModal 
UserForm1.Show vbModeless