5

モーダルフォームのようにコードの実行を一時停止しながら、モードレスで動作するユーザーフォームを作成する方法はありますか?

ユーザーフォームを表示したいのですが、それでも親プログラムとの対話を許可します。モーダル フォームは、親プログラムとの対話をブロックします。モードレス フォームでも機能しますが、フォームがアップしている間はコードの実行を一時停止したいと考えています。

フォームが表示されているかどうかをチェックする無限ループを作成することで、この問題を回避しましたが、これは少しハッキーに思えます。

Public Sub GetFormInfoAndDoStuff    
  ufForm.show vbModeless

  Do while ufForm.Visible
    DoEvents
  Loop

  ' Do other stuff dependent on form 
End Sub

ユーザーフォームが完了した後に実行する必要がある .show の後のコードが存在することを明確にするために編集されました

4

3 に答える 3

6

フォームを表示し、vbModeless特定の要求があった場合にのみコードを実行できるようにする必要があります。つまり、CommandButtonまたは他のコントロールからです。

次に、「X」ボタンまたはイベントを呼び出す別のコントロールを介して、フォームが明確に閉じられるまで、フォームを表示/表示したままにしますUserForm_Terminate

これを実現するには、実行可能コードの一部を別のサブルーチンやモジュールに移動し、たとえばCommandButton_Clickイベントからこのサブルーチンを呼び出す必要がある場合があります。

次のような行を含むサブルーチンがすでにどこかにあります。

Sub ShowTheForm()

    UserForm1.Show vbModeless
End Sub

したがって、フォームは適切に表示され、親アプリケーションへのユーザー入力が可能になります。

上記のモジュールに他のコードを入れる必要はありません。他のコードを他のモジュール/サブに配置し、コマンド ボタンなどのユーザー コントロールから呼び出します。

例:

すべての実行可能コードを取得し、次のように別のサブルーチン (組織の好みに合う場合は別のモジュール) に配置します。

Sub MyMacro(msg$)
    MsgBox msg
End Sub

ユーザー フォームで、コマンド ボタンを追加し、次のコードを割り当てます。

Sub CommandButton1_Click()
    MyMacro "hello"
End Sub

これで、ユーザーが「X」ボタンをクリックするまでフォームが表示されます。コードは、コマンド ボタンから呼び出されたときにのみ実行されます。

明確化のために編集

このメソッドを使用して実行を「一時停止」する必要はありません。フォームがモードレスで表示されると実行が終了し、フォームは存続します。オブジェクトには、コードのさらなる実行をトリガーするために使用できるいくつかのイベントがあります。

于 2013-05-31T15:16:26.947 に答える