- ベストアンサー
Accessフォームのボタンの二度押し禁止
Access2000において、長い処理をさせる時、 ボタンを押した後に再びボタンを押してしまい処理が走ってしまうのを防ぐため、 以下のようなコードを考えましたが、エラーが発生します。 (以下のコードは簡略化しています) Private Sub cmd売上伝票変更_Click() strMsg = MsgBox("更新します。よろしいですか?", vbYesNo) If strMsg = vbNo Then MsgBox "中止しました。", vbOKOnly Exit Sub End If 'ボタンを無効にしようとしましたがここでエラー Me.cmd売上伝票変更.Enabled = False Do Until 条件 ~ここに処理が入る~ 'ステータスバーに進捗状況表示 Application.SysCmd acSysCmdSetStatus, lngCount & "件 / " & lngTotal & "件 完了" DoEvents Loop End Sub 進捗状況をステータスバーに表示させるために、DoEventsを入れていますが、 これがモトで再びボタンが押せてしまいます。 入れない場合、どこかクリックするだけで画面がフリーズしたようになってしまいます。 ボタンを押せなくする方法、またはボタンを押した後、画面だけ更新できる方法で、 何かよい方法は無いでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
1.同じフォームに「cmd売上伝票変更ダミー」と言う名前のコマンドボタンを置く。 2.そのコマンドボタンのプロパティを 使用可能:いいえ 左位置:0cm 上位置:0cm 幅:0cm 高さ:0cm にする 3.コードを以下のように修正する Private Sub cmd売上伝票変更_Click() strMsg = MsgBox("更新します。よろしいですか?", vbYesNo) If strMsg = vbNo Then MsgBox "中止しました。", vbOKOnly Exit Sub End If Me.cmd売上伝票変更ダミー.Enabled = True Me.cmd売上伝票変更ダミー.SetFocus Me.cmd売上伝票変更.Enabled = False Do Until 条件 ~ここに処理が入る~ 'ステータスバーに進捗状況表示 Application.SysCmd acSysCmdSetStatus, lngCount & "件 / " & lngTotal & "件 完了" DoEvents Loop Me.cmd売上伝票変更.Enabled = True Me.cmd売上伝票変更.SetFocus Me.cmd売上伝票変更ダミー.Enabled = False End Sub ボタンを無効に出来ない理由は「ボタンにフォーカスがあるから」なので、フォーカスを他の物に動かしてからなら、ボタンを無効にする事が出来る。 上記では、ダミーのボタンを用意したが、もし、フォーム上に、他に「フォーカスを受け取れる、テキストボックスか何か」があるなら、上記1、2の手順は省き、以下のコード修正のみで大丈夫です。 Private Sub cmd売上伝票変更_Click() strMsg = MsgBox("更新します。よろしいですか?", vbYesNo) If strMsg = vbNo Then MsgBox "中止しました。", vbOKOnly Exit Sub End If Me.Text対象年月.SetFocus '同じフォーム上にある適当なテキストボックス Me.cmd売上伝票変更.Enabled = False Do Until 条件 ~ここに処理が入る~ 'ステータスバーに進捗状況表示 Application.SysCmd acSysCmdSetStatus, lngCount & "件 / " & lngTotal & "件 完了" DoEvents Loop Me.cmd売上伝票変更.Enabled = True Me.cmd売上伝票変更.SetFocus End Sub
その他の回答 (3)
補足:模擬的無効化。 Private Sub コマンド6_Click() Static isClick As Boolean If Not isClick Then isClick = True Me.コマンド6.ForeColor = RGB(128, 128, 128) Pause 10 Me.コマンド6.ForeColor = RGB(0, 0, 0) isClick = False End If End Sub で、一応、無効化されたのを視認できます。 Public Sub Pause(ByVal PauseTime As Single) Dim Finish As Single Finish = Timer + PauseTime Do DoEvents Loop Until Timer > Finish End Sub
- 30246kiku
- ベストアンサー率73% (370/504)
> 'ボタンを無効にしようとしましたがここでエラー > Me.cmd売上伝票変更.Enabled = False フォーカスを他に移してからやってみてください。 例) Me.txt売上伝票番号.SetFocus Me.cmd売上伝票変更.Enabled = False
お礼
ご回答ありがとうございました! 今回は同じフォームにグループボックスがあったので、 それにフォーカスを一時的に移動させることにしました。
Private Sub XXXX_Click() Static isClick As Boolean Dim StopNow As Boolean If Not isClick Then isClick = True StopNow = CBool(MsgBox("更新します。よろしいですか?", vbYesNo) = vbNo) If StopNow Then MsgBox "中止しました。", vbOKOnly Else Do Until 条件 ・・・・・ DoEvents Loop End If isClick = False End If End Sub
お礼
ちょっと力業になりますね・・・。 今回は違う方法を採用させていただきましたが、 ご回答ありがとうございました!
お礼
ソースコードつきでご丁寧にありがとうございました! 今回は同じフォームにグループボックスがあったので、 それにフォーカスを一時的に移動させることにしました。