• ベストアンサー

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を入れていますが、 これがモトで再びボタンが押せてしまいます。 入れない場合、どこかクリックするだけで画面がフリーズしたようになってしまいます。 ボタンを押せなくする方法、またはボタンを押した後、画面だけ更新できる方法で、 何かよい方法は無いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

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

generalmar
質問者

お礼

ソースコードつきでご丁寧にありがとうございました! 今回は同じフォームにグループボックスがあったので、 それにフォーカスを一時的に移動させることにしました。

その他の回答 (3)

noname#140971
noname#140971
回答No.4

補足:模擬的無効化。 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)
回答No.2

>  'ボタンを無効にしようとしましたがここでエラー >  Me.cmd売上伝票変更.Enabled = False フォーカスを他に移してからやってみてください。 例)   Me.txt売上伝票番号.SetFocus   Me.cmd売上伝票変更.Enabled = False

generalmar
質問者

お礼

ご回答ありがとうございました! 今回は同じフォームにグループボックスがあったので、 それにフォーカスを一時的に移動させることにしました。

noname#140971
noname#140971
回答No.1

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

generalmar
質問者

お礼

ちょっと力業になりますね・・・。 今回は違う方法を採用させていただきましたが、 ご回答ありがとうございました!

関連するQ&A