2016-05-23 43 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'调用。 –