2016-05-23 16 views
0

現在、私はExcelマクロをプログラミング中です。マクロはUserformを表示します。 ユーザーフォームで、ユーザーは何かを選択できます。ユーザーが何かを選択した後、私はUserform.Hideを呼び出してUserformを非表示にし、フォームから選択を読み込みます。選択が読み込まれた後、私はUnload Userformを呼び出します。今度はコードが選択と対話します。私はループでこれをやりたいのですが、コードがユーザーフォームを2回目に表示しようとするときです。 Formがすでに表示されているという例外があります。私はそれを理解することができません。私はデバッグモードでそれを行うとき、それはすべきだといつも動作します。私は、誰かが私をここに助けることができるループVBA Userforms同じユーザーフォームを何度も何度も表示する

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 

でこれを呼び出すClassModuleで

ユーザーフォームのコード

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

に「_私はUserFormをアンロードします」という質問に追加しました。つまり、アンロードするuserformは実際には「Userform」の名前になっていますか? – user3598756

答えて

0

問題を十分に理解しているかどうかはわかりませんが、これはVBAを使用してフォームを呼び出す方法です。フォームで

: - あなたが使用することになり

その後
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のフォームオブジェクトであることに注意してください、それを呼び出すためにこれはとOK [キャンセル]ボタンを使用すると、を持っていると仮定していますあなた):

Dim dlgLayers As New frmLayers 

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

これは問題の解決に役立ちますか?私が誤解した場合はごめんなさい。必要に応じて回答を削除します。

xxxxx_Activateなどのようなものは、フレームワークによって呼び出されるイベントハンドラです。たとえば、activateのイベントとinitializeのイベントがあります。コードを正しく設定していれば、通常は自分で直接呼び出す必要はありません。 https://support.microsoft.com/en-us/kb/138819を参照してください。

+0

は 'frmLayers'クラスですか?実際には '' frmLayers'クラスのコードペインにあります。答えが "はい"の場合、クラスに 'Hide()'メソッドがないので、 'Me.Hide'は動作しません。' Show() 'メソッドもないので、' Me.Show'もクラスにはありません。あなたのコードはVBAの代わりにVBですか? – user3598756

+0

@ user3598756 frmLayersは自分のフォームクラスです。元のポスターはそのフォームのインスタンスに変更されます。私の場合、上記のコードは私が書いている私のすべてのフォームで動作します。 VBA。 'Show'メソッドがあり、' ShowMe'によって呼び出されます。 –

+0

@ user3598756 'Hide'メソッドがあります。それは 'CloseWithResult'によって呼び出されます。 –

関連する問題