1

長い処理を実行するボタンコントロールがいくつかあります。最初の実行がアクティブなときに、ユーザーがボタンを押して別の実行を開始することを心配する必要がありますか?

クリックイベントを使用してボタンを無効にし、処理ルーチンを呼び出してから、ボタンを有効にできることがわかりました。しかし、処理ルーチンが失敗した場合、これには危険が伴うようです。

クリックルーチンにエラーを追加して失敗をキャッチすることはできますが、処理ルーチンのエラー呼び出しでそれらをキャンセルすることはできますか?

4

4 に答える 4

2

経験から、複数の並列実行が発生する可能性があることを想定し、それらを回避するように計画する方が安全であることがわかりました。マークされた行の有無にかかわらず、ボタンを繰り返しクリックしてこれを試してください。

Sub CommandButton1_Click()

    Static InProgress As Boolean

    If InProgress Then Exit Sub  'try commenting out...

    InProgress = True

    Debug.Print "starting...."
    DoProcessing
    Debug.Print "....Done"

    InProgress = False

End Sub


Sub DoProcessing()
    Dim x As Long, v

    For x = 1 To 1000
        ActiveSheet.Cells(x, 1).Copy ActiveSheet.Cells(x, 2)
        DoEvents
    Next x

End Sub

この特定の動作は呼び出しによって引き起こされDoEventsます-これがないと、enderland が指摘したように、並列実行が表示されないはずです。

于 2012-08-16T22:06:10.810 に答える
1

I decided to disable the button in its click handler, then re-enable it after calling the processing routine.

Private Sub CommandButton2_Click()
    Dim s As Integer
    s = CommandButton2.Enabled
    If s Then
        On Error GoTo Fail
        CommandButton2.Enabled = False
        GetData
Fail:
        CommandButton2.Enabled = True
    End If
End Sub

I also find this more pleasing than removing the default embedded formula =EMBED("Forms.CommandButton.1","") and attaching a macro.

于 2012-08-16T23:12:37.477 に答える
0

最初の実行がアクティブなときに、ユーザーがボタンを押して別の実行を開始することを心配する必要がありますか?

いいえ-処理中に。を呼び出すコードが存在する可能性がない限りDoEvents

ワークシートのボタンに次のコードを割り当てて(十分なランタイムを取得するには、イテレータをより高く調整する必要がある場合があります)、追加のボタンをクリックするか、Excelで他のことを実行してみてください。

Sub test()
    For i = 1 To 100
        For j = 1 To 100
            Range("A1").Select
        Next j

    Next i
End Sub

.select追加のボーナスは、Excelでの作業で操作が遅くなる原因を説明するのに役立つことです...

クリックイベントを使用してボタンを無効にし、処理ルーチンを呼び出してから、ボタンを有効にできることがわかりました。しかし、処理ルーチンが失敗した場合、これには危険が伴うようです。

あなたが唯一のユーザーでない限り、意味のある操作のためにボタンを単に再度有効にすることに関係なく、ある種のエラー処理を含めることはおそらく良い考えです。

クリックルーチンにエラーを追加して失敗をキャッチすることはできますが、処理ルーチンのエラー呼び出しでそれらをキャンセルすることはできますか?

エラーやさまざまな場所を適切に説明する必要があります。これに対する答えは、「実装によって異なります」です。

于 2012-08-16T21:42:37.377 に答える
0

フォームまたはシートのボタン ([フォーム] メニューのボタン) で、エンダーランドとは逆の結果が得られます。ボタンが押されるたびに増加する静的変数を設定し、コードの実行中にそれを押すと、実行されて再び増加します。これを処理するには、グローバル変数を設定する必要があります。

Sub CommandButton1_Click()
Static Incrementer As Long
Dim i As Long

Incrementer = Incrementer + 1
For i = 1 To 1000
Debug.Print Incrementer
Next i
End Sub
于 2012-08-16T22:07:47.603 に答える