web-dev-qa-db-ja.com

ユーザーフォームをモーダルストップコード実行として表示するのはなぜですか?

次のVBAコードはMe.Showで停止します。私のテストから、コードがユーザーフォーム内にある場合でも、Me.Showはすべてのコード実行を停止するようです。

この部分はユーザーフォームの外にあります

Public Sub TestProgress()  
    Dim objProgress As New UserForm1
    objProgress.ShowProgress
    Unload objProgress
End Sub

この部分はユーザーフォーム内にあります

Private Sub ShowProgress()
    Me.Show vbModal
    Dim intSecond As Integer
    For intSecond = 1 To 5
        Application.Wait Now + TimeValue("0:00:01")
        Me.ProgressBar1.Value = intSecond / 5 * 100
    Next intSecond
    Me.Hide
End Sub

ユーザーフォームが表示された後、コードはMe.Showで停止します。エラーはありません。コードの実行を中止するだけです。 VBAのモーダルUserForm内でコードを実行する唯一の方法は、次のようにUserForm_Activateプロシージャにコードを含めることです。

この部分はユーザーフォームの外にあります

Public Sub TestProgress()  
    Dim objProgress As New UserForm1
    Load objProgress
    Unload objProgress
End Sub

この部分はユーザーフォーム内にあります

Private Sub UserForm_Initialize()
    Me.Show vbModal
End Sub

Private Sub UserForm_Activate()
    Dim intSecond As Integer
    For intSecond = 1 To 5
        Application.Wait Now + TimeValue("0:00:01")
        Me.ProgressBar1.Value = intSecond / 5 * 100
    Next intSecond
    Me.Hide
End Sub

もちろん、UserForm_Activate内にMe.Showを配置することはできません。これは、そのプロシージャがUserFormShowイベントの後にのみ起動するためです。

UserForm.ShowModalのドキュメントには、「ユーザーフォームがモーダルの場合、ユーザーはアプリケーションの他の部分を使用する前に、情報を提供するか、ユーザーフォームを閉じる必要があります。ユーザーフォームが非表示になるかアンロードされるまで、後続のコードは実行されません。 。 "

プロセスの実行中にユーザーがアプリケーションを操作できないように、モーダルUseFormを進行状況バーとして使用しようとしています。ただし、すべてのコードをUserForm_Activateプロシージャ内に含める必要がある場合、これを実現するのは困難です。

ここで何かが足りませんか?すべてのコード実行がMe.Showで停止するのはなぜですか?

7
Kuyenda

私はこれを理解したと思います。

Me.Showの後、UserForm_Activateイベントが発生します。 UserForm_Activateプロシージャにコードがない場合、VBAはMe.Hideを待機しているため、何も起こりません。

したがって、イベントの順序は次のとおりです。Me.Show> UserForm_Activate> Me.Hide

実行するコードはすべてUserForm_Activateプロシージャに含まれている必要があり、beforeMe.Hideである必要があります。

構造は非常に厳しいですが、私はその構造を有利に使用できるかもしれません。

2
Kuyenda

フォームがvbModalで表示されると、コードは実行を一時停止し、ユーザーがフォームを操作するのを待ちます。たとえば、ボタンをクリックしたり、ドロップダウンを使用したりします。

フォームプロパティを更新する場合

ShowModal = False

コードからvbModalを削除します。これにより、フォームが表示されたときにコードの実行を続行できます。

11
Robert Mearns

次のエラーが発生した理由の答えを探していました。

実行時エラー「5」:無効なプロシージャ呼び出しまたは引数

このコード行を実行する場合:

UserForm1.Show True

この行は機能しますが:

UserForm1.Show False

もちろん。 TruevbModalと同じではありません!したがって、簡単な答えは、正しい列挙を使用することです。

UserForm1.Show vbModal
UserForm1.Show vbModeless
7
Jamie Garroch