2016-05-23 81 views
0

當前我正在編寫一個excel宏。該宏顯示一個用戶窗體。 在用戶窗體中,用戶可以選擇一些東西。在用戶選擇了一些我調用Userform.Hide來隱藏用戶窗體並閱讀表單中的選擇之後。讀取選擇後,我稱之爲卸載用戶窗體。現在代碼與選擇交互。我想在循環中完成此操作,但是當代碼嘗試第二次顯示用戶窗體時。我收到了一個表單已經顯示的異常。我無法理解它,因爲我叫Unload Userform。當我在調試模式下執行它時,它應該如此工作。在ClassModule我稱之爲一個循環VBA用戶表單反覆顯示相同的用戶表單

Sub Costum(Spalte As Integer, Zeile As Integer, SpalteBeginn As Integer, Cards As Cards, CardsOpponent As Cards) 
     CardSelector.CardSelector_Activate Cards 
     Dim c As card 
     Dim number As Integer 
     number = CardSelector.SelectedNumber 
     Set c = Cards.CardDictionary.Items(CardSelector.SelectedNumber - 1) 
     SetCardAsPlaced c, Zeile, Spalte, SpalteBeginn 
     Unload CardSelector 
    End Sub 

有人可以幫助我在這裏

用戶窗體代碼

Private Sub Image1_Click() 
     SelectCard 1 
End Sub 

Private Sub Image2_Click() 
     SelectCard 2 
End Sub 


Private Sub SelectCard(number As Integer) 
    SelectedNumber = number 
    Me.Hide 
End Sub 


Public Sub CardSelector_Activate(Cards As Cards) 
    Dim c As card 
    For Each Key In Cards.CardDictionary.Keys 
     Set c = Cards.CardDictionary.Items(Key - 1) 

     If c.value = 1 And c.played Then 
     Image1.Enabled = False 
     End If 

     If c.value = 2 And c.played Then 
     Image2.Enabled = False 
     End If 
    Next Key 
    number = SelectedNumber 
    CardSelector.Show 
End Sub 

碼?

+0

我們需要查看您的代碼,以便我們知道發生了什麼。 –

+0

我已將它添加到您編寫的問題 – Lukas

+0

_「我調用Unload Userform」_,這意味着您要卸載的用戶窗體實際上是以「Userform」命名的? – user3598756

回答

0

我不確定我是否完全理解您的問題,但這是我如何使用VBA調用窗體。這是假設你有一個取消OK按鈕:

形式:

Option Explicit 

Private m_ResultCode As VbMsgBoxResult 

Private Sub btnCancel_Click() 
    Call CloseWithResult(vbCancel) 
End Sub 

Private Sub btnOK_Click() 
    ' Store form control values to member variables here. Then ... 

    Call CloseWithResult(vbOK) 
End Sub 

Private Sub CloseWithResult(Value As VbMsgBoxResult) 
    m_ResultCode = Value 
    Me.Hide 
End Sub 

Public Function ShowMe(Optional bNewLayerOptions As Boolean = True) As VbMsgBoxResult 
    ' Set Default to Cancel 
    m_ResultCode = vbCancel 
    ' Execution will pause here until the form is Closed or Unloaded 
    Call Me.Show(vbModal) 
    ' Return Result 
    ShowMe = m_ResultCode 
End Function 

然後調用它(請注意,frmLayers是我自己的VBA表單對象 - 你會用你的):

Dim dlgLayers As New frmLayers 

If (dlgLayers.ShowMe(False) = vbOK) Then 
    ' Proceeed 
End If 

這是否幫助你解決你的問題?如果我誤解了,我很抱歉,如果需要,我會刪除我的答案。如等事件處理程序被框架調用。所以,例如,有一個激活事件和一個初始化事件。如果您正確設置代碼,通常不必直接調用這些代碼。見https://support.microsoft.com/en-us/kb/138819

+0

是'frmLayers'類?並且是你說的代碼是_「實際上在'frmLayers'類代碼窗格中」的形式?如果答案都是「是」,那麼'Me.Hide'將不起作用,因爲既沒有'Show()'方法,也沒有'Me.Show'方法,因爲類中沒有'Hide()'方法。你的代碼是用VB代替VBA嗎? – user3598756

+0

@ user3598756 frmLayers只是我自己的表單類。原始海報會將其更改爲他的表單實例。對我而言,上面的代碼適用於我編寫的所有表單。 VBA。有一個'Show'方法,它被'ShowMe'調用。 –

+0

@ user3598756有一個'Hide'方法。它由'CloseWithResult'調用。 –