2017-02-28 41 views
3

我花了最後幾個星期編碼用戶窗體。我的問題很簡單,我應該在哪裏放置加載和卸載frm1(用戶名稱爲frm1),我應該在哪裏放置Me.Show和Me.Hide。問題是,用戶窗體內的(x)按鈕不起作用。 現在我的加載和卸載是Active-X命令按鈕的代碼我已經寫在Sheet1中發現:如何正確加載和卸載用戶窗體(VBA)

Private Sub cmdb1_Click() 
    Load frm1 
    Unload frm1 
End Sub 

這樣,我的用戶窗體被初始化,我可以運行代碼

Private Sub Userform_Initialize() 
    'Some other code that Works... 
    frm1.Show 
End Sub 

顯示我的Userform。現在,我有我的用戶窗體具有代碼

Private Sub cmdbClose_Click() 
    Me.Hide 
End Sub 

,我用它來隱藏子,在其內cmdb1_Click最後一行()被執行並且用戶窗體被卸載命令按鈕。這工作。

然而,當我按在我的用戶窗體(X)按鈕,出現如下錯誤出現Run-time error '91'

調試說錯誤在於內cmdb1_Click()。我已經嘗試添加一個名爲UserForm_QueryClose()的子,但錯誤仍然存​​在。如果我不得不猜測,我會說錯誤是由我處理加載和卸載的方式造成的,因此通過cmdb1_Click()。

編輯:

這是未來的讀者。我的問題解決了,代碼如下。 ShowUserform和cmdbClos​​e_Click包含CallumDA建議的代碼。我的命令按鈕現在有:

Private Sub cmdb1_Click() 
    Load frm1 
    Call ShowUserform 
End Sub 

回答

4

將這個標準模塊中,並將其鏈接到按鈕,用來顯示用戶窗體

Sub ShowUserform 
    frm1.Show 
End Sub 

然後在用戶窗體

Private Sub cmdbClose_Click() 
    Unload Me 
End Sub 
+0

這工作,謝謝! – SAFD

5

我建議您創建一個用戶表單實例:

Dim MyDialog As frm1 

Set MyDialog = New frm1 'This fires Userform_Initialize 

此後可以輕鬆地檢查表單是否正在試圖卸載之前加載:

If Not MyDialog Is Nothing Then 
    Unload MyDialog 
End If 

我也建議你不要從窗體的初始化事件顯示方法。把你的用戶表單看作Excel中的另一個對象,並從你的主代碼體中進行管理。

另外,我不會像CallumDA所建議的那樣,在cmdbClos​​e_Click事件中卸載它(儘管這對解決當前問題很有效)。通常情況下,您需要能夠從您的主代碼體中引用表單中的值,並且如果卸載它,它們將不可用。相反,保持它就像你在第一個地方有它:

Private Sub cmdbClose_Click() 
    Me.Hide 
End Sub 

所以,你的主代碼體(在您的ActiveX按鈕)將是這個樣子:

Dim MyDialog as frm1 

Set MyDialog = New frm1  'This fires Userform_Initialize 
'Place any code you want to execute between the Initialize and Activate events of the form here 
MyDialog.Show   'This fires Userform_Activate 
'When the close button is clicked, execution will resume on the next line: 
SomeVariable = MyDialog.SomeControl.Value 
'etc. 

If Not MyDialog Is Nothing Then 
    Unload MyDialog 
End If 

您還可以趕上事件火災是在用戶單擊窗體上的「X」,並防止形式從被卸載:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 
    Cancel = True 
    Me.Hide 
End Sub