プロが教えるわが家の防犯対策術!

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

ボタンを押せなくする方法、またはボタンを押した後、画面だけ更新できる方法で、
何かよい方法は無いでしょうか?

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/10 17:49

補足:模擬的無効化。



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
    • good
    • 0

>  'ボタンを無効にしようとしましたがここでエラー


>  Me.cmd売上伝票変更.Enabled = False

フォーカスを他に移してからやってみてください。

例)
  Me.txt売上伝票番号.SetFocus
  Me.cmd売上伝票変更.Enabled = False
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/10 17:49

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/10 17:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A