2

かなり簡単な質問であることを願っています。

VBAでユーザーフォームを作成しようとしています。ユーザーはフォームに特定の情報を入力し、フォームを閉じます。ユーザーがフォームを閉じた後、入力したデータをユーザー フォームに保持したいと思います。技術的にはクラスモジュールとして扱っているか、少なくともそれが私が理解している方法です。私が使用しているコードは次のとおりです。

ユーザーフォームを表示するメインサブで:

Sub NonACATMemo()

Dim UserInput As MemoReasons
Set UserInput = New MemoReasons
UserInput.Show

...そして、ユーザーフォーム自体でそれを閉じます...

Private Sub UserForm_Terminate()
MemoReasons.Hide
End Sub

また、フォームのコマンド ボタンからこのサブルーチンを呼び出します。私が直面している問題は、このメソッドを使用すると、「実行時エラー '402': 最初に最上位のモーダル フォームを閉じるか非表示にする必要があります」というエラーが表示されることです。unload me を使用すると、フォームからデータを取得しようとするとデータがクリアされ、「サーバーが利用できません」というエラーまたはその影響が発生します。

では、ユーザー フォームを非表示にして内部のデータを保持するというアイデアはありますか?

最後のメモ: これはプロジェクト内の唯一のユーザー フォームです。ここでは、Public Property Get メソッドを使用してデータを取得しようとしている方法の例を示します。

Debug.Print UserInput.EmailFlag
Debug.Print UserInput.ContraFirm
Debug.Print UserInput.MemoReason

ええと、誰かが何か提案があれば、私はすべて聞いています。

4

2 に答える 2

5

私は前にこのアプローチを見たことがありません。通常、次の方法でフォームをインスタンス化します。

MemoReasons.Show

実際、_Terminate()イベントはフォームに保持されているデータを一掃しています。したがって、解決策は、ボタンクリックからイベントを呼び出さないことです。_Terminate()代わりに、単にフォームを非表示にします。例:

Sub ShowMemoReasons()
'In a normal code module, this calls the form
' could be run from the macros menu or attached to
' a shape/button/etc on the worksheet.

MemoReasons.Show

End Sub

これらをMemoReasonsコード モジュールに入れます。

Private Sub CommandButton1_Click()  '<-- Rename to handle your button's click event

    MemoReasons.Hide  '## Hides the form but does not release it from memory

End Sub
Private Sub UserForm_Terminate()
'Any events pertaining to the termination of the form object
' otherwise, all form control data will be wiped out when
' this object releases from memory

End Sub

これらを行った後、ボタンを使用してフォームを表示にする場合は、 を呼び出すことができ、ShowMemoReasons()以前にフォームに入力されたデータを保持しながら、フォームを再表示する必要があります。

赤い「X」ボタンを使用するか、他のイベントがイベントをトリガーするTerminateと、フォーム データが失われます。検証を行い、QueryClose必要に応じてイベントでこれを防ぐ方法があります。

アップデート

ユーザー フォームのインスタンスは必要ないと思います(複数のフォームを同時にDim表示する可能性がある場合は例外です)。それ以外の場合、パブリック変数として宣言することは冗長で混乱を招きます。UserInput

ちなみに、これがエラーが発生する理由です: Must close or hide topmost modal form first。このように実装する必要がある場合は、代わりに をMemoReasons.hide使用する必要がありますMe.Hide

フォームのインスタンスを 1 つだけ表示している限り、は public オブジェクトであるMemoReasons.propertyため、やなど と同じようにいつでも参照できます。MemoReasonsThisWorkbookActiveWorksheet

代わりに、任意のサブルーチンでこのオブジェクト ( はオブジェクト) を参照できるようにする必要がありますMemoReasons。たとえば、前のサブルーチンから呼び出されない別のサブルーチンを作成します。sub を実行してフォームを表示し、データを入力してから、フォームを非表示にします。フォームを非表示にして、このサブルーチンを実行すると、フォームからの結果データが表示されます。

Sub Test2()
    Debug.Print MemoReasons.EmailFlag
End Sub
于 2013-09-19T14:57:58.593 に答える