長い処理を実行するボタンコントロールがいくつかあります。最初の実行がアクティブなときに、ユーザーがボタンを押して別の実行を開始することを心配する必要がありますか?
クリックイベントを使用してボタンを無効にし、処理ルーチンを呼び出してから、ボタンを有効にできることがわかりました。しかし、処理ルーチンが失敗した場合、これには危険が伴うようです。
クリックルーチンにエラーを追加して失敗をキャッチすることはできますが、処理ルーチンのエラー呼び出しでそれらをキャンセルすることはできますか?
経験から、複数の並列実行が発生する可能性があることを想定し、それらを回避するように計画する方が安全であることがわかりました。マークされた行の有無にかかわらず、ボタンを繰り返しクリックしてこれを試してください。
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 が指摘したように、並列実行が表示されないはずです。
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.
最初の実行がアクティブなときに、ユーザーがボタンを押して別の実行を開始することを心配する必要がありますか?
いいえ-処理中に。を呼び出すコードが存在する可能性がない限り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での作業で操作が遅くなる原因を説明するのに役立つことです...
クリックイベントを使用してボタンを無効にし、処理ルーチンを呼び出してから、ボタンを有効にできることがわかりました。しかし、処理ルーチンが失敗した場合、これには危険が伴うようです。
あなたが唯一のユーザーでない限り、意味のある操作のためにボタンを単に再度有効にすることに関係なく、ある種のエラー処理を含めることはおそらく良い考えです。
クリックルーチンにエラーを追加して失敗をキャッチすることはできますが、処理ルーチンのエラー呼び出しでそれらをキャンセルすることはできますか?
エラーやさまざまな場所を適切に説明する必要があります。これに対する答えは、「実装によって異なります」です。
フォームまたはシートのボタン ([フォーム] メニューのボタン) で、エンダーランドとは逆の結果が得られます。ボタンが押されるたびに増加する静的変数を設定し、コードの実行中にそれを押すと、実行されて再び増加します。これを処理するには、グローバル変数を設定する必要があります。
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