3

フォームのリストボックスから RowSource を取得し、Excel、Worksheet、および Query Table オブジェクトを作成し、情報を Excel にクエリしてから、すべてをフォーマットするフォームにボタンがあります。問題は、ユーザーがマウス ボタンをすばやく押すと、同じ回数だけこのボタンをアクティブにすることです。

間にコードをスリープさせようとしましたが、これにより、ボタンを押すたびに、スリープしている間だけ持続し、クエリにかかる時間が長くなります。私が使用したもの:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

また、フォーカスを別のコントロールに設定してボタンを無効にしようとしましたが、サブの最後に配置してもAccessはボタンを実行するため、一定時間後に再度有効にする方法がよくわかりませんボタンを押すたびに .

助言がありますか?

4

2 に答える 2

5

一定時間待機する代わりに、最初にクリックしたときにコマンド ボタンを無効にします。次に、長時間実行される操作を実行し、その後コマンド ボタンを再度有効にします。

コマンド ボタンの名前がcmdToExcelであると仮定すると...

Private Sub cmdToExcel_Click()
    Me.txtNote.SetFocus
    Me.cmdToExcel.Enabled = False
    ' replace next line
    MsgBox "call long running code here"
    Me.cmdToExcel.Enabled = True
    Me.cmdToExcel.SetFocus
End Sub

コマンド ボタンを無効にする前に、別のコントロールに移動する必要があることに注意してくださいSetFocus。Access では、コマンド ボタンがまだフォーカスされている間は無効にできないためです。

SetFocus最後にコマンド ボタンに戻りたくないかもしれません--- 私はそれについて大げさな推測をしました。:-)

長時間実行されているプロセスが終了する前に、コード フロー制御がクリック イベント プロシージャに戻るようです。そのため、コマンド ボタンは時期尚早に再び有効になります。

その場合、Sleep長時間実行されるコードを呼び出した後に、API 宣言を使用して一時停止を挿入できます。

Private Sub cmdToExcel_Click()
    Me.txtNote.SetFocus
    Me.cmdToExcel.Enabled = False
    ' replace next line
    MsgBox "call long running code here"
    Sleep 5000 ' 5 seconds
    Me.cmdToExcel.Enabled = True
    Me.cmdToExcel.SetFocus
End Sub

そもそもそれがあなたが求めていたものだと今気づきました。太っててごめんなさい。

于 2013-07-25T18:45:46.063 に答える