2017-02-28 6 views
3

ユーザーフォームをコーディングするのに最後の数週間を費やしました。私の質問は、LoadとUnloadのfrm1(Userform名はfrm1)と、どこにMe.ShowとMe.Hideを配置すればよいのかを簡単に質問します。問題は、ユーザーフォーム内の(x)ボタンが機能しないことです。ユーザーフォーム(VBA)を適切に読み込んでアンロードする方法

Private Sub cmdb1_Click() 
    Load frm1 
    Unload frm1 
End Sub 

私のユーザーフォームが初期化される。この方法は、私は、コード

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

を実行することができます。今、私のロードとアンロードは、私は、シート1の上に書いたのActive-Xコマンドボタンのコード内で発見された 私のUserformが表示されます。今、私はコードを私はサブを非表示に使用

Private Sub cmdbClose_Click() 
    Me.Hide 
End Sub 

を持って、私のユーザーフォームのコマンドボタンがあり、その上にcmdb1_Click()内の最後の行が実行され、ユーザーフォームがアンロードされます。この作品。私は私のユーザーフォームで(X)ボタンを押したとき

は、しかし、次のエラーがデバッガがエラー言うRun-time error '91'

がcmdb1_Click内にある表示されます()。私はUserForm_QueryClose()という名前のサブを追加しようとしましたが、エラーは持続します。私が推測しなければならないのは、エラーはcmdb1_Click()によってLoadとUnloadを処理する方法によって引き起こされたと言えます。

EDIT:

これは、将来の読者のためです。私の問題は解決され、コードは次のとおりです。 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 

は、私はまた、あなたがフォームのInitializeイベントからShowメソッドを呼び出さないことをお勧めします。ユーザーフォームはExcelの別のオブジェクトと考えて、メインコード本体から管理してください。

また、CallumDAが提案したようにcmdbClos​​e_Clickイベントでアンロードしません(現在の問題を解決するには問題ありません)。多くの場合、メインコード本体からフォーム上の値を参照できるようにする必要があります。アンロードすると、それらは使用できなくなります。

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 

ます。また、イベントをキャッチすることができます:

Private Sub cmdbClose_Click() 
    Me.Hide 
End Sub 

だから、(あなたのActiveXボタンで)あなたのメインのコード本体はこのようになります。あなたが最初の場所でそれを持っていたように代わり、それを維持ユーザーがフォーム上の「X」をクリックしてフォームがアンロードされるのを防ぎます。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 
    Cancel = True 
    Me.Hide 
End Sub 
関連する問題