0

添付の VBA 手順は、進行状況バーのユーザーフォーム用です。キャンセル ボタンが断続的に応答しないことを除いて、すべてが期待どおりに機能します。

断続的に言うのは、95% の確率で、手順が停止する前にキャンセル ボタンを何度もクリックしなければならないからです。ボタン クリック イベントがアニメーション化されているのがわかりますが、手順は中断されていません。ボタン ダウン イベントが発生する前に、何かがキャンセル ボタンからフォーカスを奪っているように見えます。

エスケープ ボタンとウィンドウを閉じるボタンは、1 回のクリックで期待どおりに応答します。

キャンセル ボタンが正しく反応するようにするにはどうすればよいですか? ありがとう!

更新:キャンセルボタンをクリックして押したままにすると、ボタンが「下」のままではなく、元に戻ることに気付きました。そのため、明らかに何かがボタンの状態をアップにリセットしているため、手順がダウン状態をキャッチしてクリックイベントを発生させていません。

userform モジュール (UserForm1 という名前) のコードは次のとおりです。

Private mbooUserCancel As Boolean

Public Property Get UserCancel() As Boolean
    UserCancel = mbooUserCancel
End Property

Private Property Let UserCancel(ByVal booUserCancel As Boolean)
    mbooUserCancel = booUserCancel
End Property

Public Sub UpdateProgress(CountTotal As Long, CountProgress As Long)
    On Error GoTo Error_Handler
    ProgressBar1.Value = CountProgress / CountTotal * 100
    DoEvents
Error_Handler:
    If Err.Number = 18 Then CommandButton1_Click
End Sub

Private Sub CommandButton1_Click()
    Hide
    UserCancel = True
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    CommandButton1_Click
End Sub

Private Sub UserForm_Activate()
    With Application
        .Interactive = False
        .EnableCancelKey = xlErrorHandler
    End With
End Sub

Private Sub UserForm_Terminate()
    Application.Interactive = True
End Sub

UserForm1 を呼び出すモジュール (Module1 という名前) のコードは次のとおりです。

Sub TestProgress()

    On Error GoTo Error_Handler

    Dim objUserForm As New UserForm1
    Dim lngCounter As Long
    Dim lngSubCounter As Long

    With objUserForm
        .Show vbModeless
        DoEvents
        For lngCounter = 1 To 5
            If .UserCancel Then GoTo Exit_Sub
            For lngSubCounter = 1 To 100000000
            Next lngSubCounter
            .UpdateProgress 5, lngCounter
        Next lngCounter
        Application.Wait Now + TimeValue("0:00:02")
        .Hide
    End With

Exit_Sub:

    If objUserForm.UserCancel Then
        MsgBox "User Cancelled from UserForm1"
    End If
    Exit Sub

Error_Handler:

    If Err.Number = 18 Then
        Unload objUserForm
        MsgBox "User Cancelled from Module1"
    End If

End Sub
4

3 に答える 3

1

人々がまだ答えを必要としているなら、私はよく調べてそれをクラックしました!

キャンセルボタンをクリックする場合、コードは次のようになります。

Private Sub CommandButton1_Click()

Unload Me

'this bit ends all macros

End

End Sub
于 2012-02-08T12:14:24.257 に答える
1

毎回最初のクリックでうまくいきます。コンテナー アプリ内で実行されている可能性のあるアドインやその他のコードをアンロードしてみて、問題が解決するかどうかを確認してください。

于 2010-01-30T17:07:59.530 に答える
0

答えは、プログレスバーにモーダルユーザーフォームを使用して、呼び出し元のプロシージャで処理することによってボタンクリックイベントが不明瞭になることなく発生できるようにすることです。

于 2010-02-20T18:06:58.177 に答える