Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11710 / 13646 ツリー ←次へ | 前へ→

【14581】砂時計中のクリック こにしき 04/6/2(水) 13:36 質問[未読]
【14583】Re:砂時計中のクリック Asaki 04/6/2(水) 14:10 回答[未読]
【14585】Re:砂時計中のクリック こにしき 04/6/2(水) 14:39 質問[未読]
【14587】Re:砂時計中のクリック Asaki 04/6/2(水) 14:56 回答[未読]
【14588】Re:砂時計中のクリック こにしき 04/6/2(水) 15:10 質問[未読]
【14589】Re:砂時計中のクリック Asaki 04/6/2(水) 15:18 回答[未読]
【14591】Re:砂時計中のクリック こにしき 04/6/2(水) 15:44 質問[未読]
【14592】Re:砂時計中のクリック Asaki 04/6/2(水) 15:49 回答[未読]
【14593】Re:砂時計中のクリック こにしき 04/6/2(水) 16:18 質問[未読]
【14602】Re:砂時計中のクリック ichinose 04/6/2(水) 20:34 発言[未読]
【14619】Re:砂時計中のクリック こにしき 04/6/3(木) 9:48 お礼[未読]
【14590】Re:砂時計中のクリック Asaki 04/6/2(水) 15:26 回答[未読]

【14581】砂時計中のクリック
質問  こにしき  - 04/6/2(水) 13:36 -

引用なし
パスワード
   マクロを実行中、マウスポインタが砂時計になっているのですが、
その最中にボタンの上でクリックすると、マクロ終了後
そのボタンのマクロが動いてしまいます。

砂時計中にクリックされたという情報を無視(無効)にしたいのですが、
どなたかご教授いただけますでしょうか?

よろしくお願い致します。

【14583】Re:砂時計中のクリック
回答  Asaki  - 04/6/2(水) 14:10 -

引用なし
パスワード
   こんにちは。

とりあえず、
Sub test()
  If Application.Cursor = xlWait Then
    MsgBox "砂時計状態"
  Else
    MsgBox "砂時計ではありません"
  End If
End Sub

セルのコピー中などの処理で、時間がかかっている場合に勝手に変化するものに対しても
反応するかわかりません。

こういったケースは、ボタンのクリックイベントの先頭で、
自身のボタンのEnabled プロパティをFalseに設定、
最後でTrueに戻す、
などすることが多いようです。

【14585】Re:砂時計中のクリック
質問  こにしき  - 04/6/2(水) 14:39 -

引用なし
パスワード
   ▼Asaki さん:
回答をありがとうございます。
>ボタンのクリックイベントの先頭で、
>自身のボタンのEnabled プロパティをFalseに設定、
>最後でTrueに戻すなどすることが多いようです。
 クリックのイベントが Enabled = True を待っているみたいなんです。

 (作業)処理したいボタンをクリック。
 ( PGM)ボタン_Clickイベント開始 (砂時計)
      ボタン.Enabled = False
      計算処理中・・
 (作業)Enabled = False になっているボタンをクリック。
 ( PGM)計算処理終了
     ボタン.Enabled = True
     ボタン_Clickイベント終了 (砂時計解除)
(何故?)ボタン_Clickイベント開始

普通に考えれば Enabled = False 中はクリック無視されますよね?
何故でしょう・・。

【14587】Re:砂時計中のクリック
回答  Asaki  - 04/6/2(水) 14:56 -

引用なし
パスワード
   試してみました。

>クリックのイベントが Enabled = True を待っているみたいなんです。
どうもそのようです。

こちらで見つけた回避策と思しき方法は
Enabled を変更しない前提でも
1) ボタンのプロパティ:TakeFocusOnClick を False にしておく
2) ボタン押下時直後に DoEvents を入れる
3) Application.Interactive を制御する

なんか、こんな感じです。

【14588】Re:砂時計中のクリック
質問  こにしき  - 04/6/2(水) 15:10 -

引用なし
パスワード
   回避策を試してみました

Private Sub cmdボタン_Click()
  Application.Interactive = False
  cmdボタン.TakeFocusOnClick = False
  cmdボタン.Enabled = False
  DoEvents 
   
   (計算処理)

  cmdボタン.Enabled = True
  cmdボタン.TakeFocusOnClick = True
  Application.Interactive = True
End Sub

それでもクリックイベントが待たれている様です。
使い方が間違っているのでしょうか?

【14589】Re:砂時計中のクリック
回答  Asaki  - 04/6/2(水) 15:18 -

引用なし
パスワード
   全部やらなくても、どれかひとつでよいです。

1) ボタンのプロパティ:TakeFocusOnClick を False にしておく
→ あらかじめ、デザイン時に設定しておく

2) ボタン押下時直後に DoEvents を入れる
→ 直後です。

ちなみに、実は、コントロールツールボックスのコマンドボタンとして解答つけてましたが、
それでOKですか?

【14590】Re:砂時計中のクリック
回答  Asaki  - 04/6/2(水) 15:26 -

引用なし
パスワード
   フォームのボタンの場合でも、
Interactive は効いてるようでした。

【14591】Re:砂時計中のクリック
質問  こにしき  - 04/6/2(水) 15:44 -

引用なし
パスワード
   使っているのは、コントロールツールボックスのコマンドボタンです。

ひとつひとつ試してみましたが、どれも同じで
やはりクリックを認識してしまいます。

ちなみに1クリックで約10秒ぐらいかかる処理をしています。
この10秒中に再度クリックした場合に起こる現象です。
2度、3度クリックするとその数だけ実行されます。
(2度クリック:計3回実行されます)

【14592】Re:砂時計中のクリック
回答  Asaki  - 04/6/2(水) 15:49 -

引用なし
パスワード
   こちらで試しているのは、
クリックイベントで、2秒程度、Waitさせるというものです。
で、コマンドボタンをダブルクリックしてます。

途中の、計算処理が関係してるのでしょうか。

【14593】Re:砂時計中のクリック
質問  こにしき  - 04/6/2(水) 16:18 -

引用なし
パスワード
   >途中の、計算処理が関係してるのでしょうか。
 可能性は十分あります・・。
 
(マウスポインタの砂時計は勝手になっていたので
 Application.Cursor は使用していません)
Private Sub cmdボタン_Click()
  cmdボタン.Enabled = False
  (セルに状況を表示するために保護解除)
  ActiveWorkbook.Worksheets("MENU").Unprotect
  Call 計算処理
  ActiveWorkbook.Worksheets("MENU").Protect
  cmdボタン.Enabled = True
End Sub

Private Sub 計算処理()
  Application.EnableEvents = False
  Application.DisplayAlerts = False
  Application.ScreenUpdating = False
 
  (各セルに計算結果をセット)

  (EnableEvents、DisplayAlertsのTrueセットはありませんでした・・)
  Application.ScreenUpdating = True
End Sub

どれかが悪さしているのですかね?? 

【14602】Re:砂時計中のクリック
発言  ichinose  - 04/6/2(水) 20:34 -

引用なし
パスワード
   ▼こにしき さん、Asakiさん
こんばんは。

>Private Sub cmdボタン_Click()
>  cmdボタン.Enabled = False
>  (セルに状況を表示するために保護解除)
>  ActiveWorkbook.Worksheets("MENU").Unprotect
>  Call 計算処理
>  ActiveWorkbook.Worksheets("MENU").Protect
   doevents
>  cmdボタン.Enabled = True
>End Sub

と.Enabled = Trueの直前に「Doevents」とした場合
どうでしょうか?

私の方で簡単なテストでは2度の実行を防いでくれましたが・・・。

確認してみて下さい。

【14619】Re:砂時計中のクリック
お礼  こにしき  - 04/6/3(木) 9:48 -

引用なし
パスワード
   ▼ichinose さん
おはようございます。

あの位置のDoEventsで大丈夫そうです。
ありがとうございました。

11710 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free