次の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
で停止するのはなぜですか?
私はこれを理解したと思います。
Me.Show
の後、UserForm_Activateイベントが発生します。 UserForm_Activateプロシージャにコードがない場合、VBAはMe.Hide
を待機しているため、何も起こりません。
したがって、イベントの順序は次のとおりです。Me.Show
> UserForm_Activate
> Me.Hide
実行するコードはすべてUserForm_Activateプロシージャに含まれている必要があり、beforeMe.Hide
である必要があります。
構造は非常に厳しいですが、私はその構造を有利に使用できるかもしれません。
フォームがvbModal
で表示されると、コードは実行を一時停止し、ユーザーがフォームを操作するのを待ちます。たとえば、ボタンをクリックしたり、ドロップダウンを使用したりします。
フォームプロパティを更新する場合
ShowModal = False
コードからvbModal
を削除します。これにより、フォームが表示されたときにコードの実行を続行できます。
次のエラーが発生した理由の答えを探していました。
実行時エラー「5」:無効なプロシージャ呼び出しまたは引数
このコード行を実行する場合:
UserForm1.Show True
この行は機能しますが:
UserForm1.Show False
もちろん。 TrueはvbModalと同じではありません!したがって、簡単な答えは、正しい列挙を使用することです。
UserForm1.Show vbModal
UserForm1.Show vbModeless