Excel VBA 質問スレッド №1568 (解決済)

ループ処理中のApplication.OnKeyについて

投稿者 : とぅー     投稿日時 : 2023/09/16(Sat) 08:12:23     OS : Windows 11     EXCEL : Office 365
はじめまして。
ループの最中にApplication.OnKeyで指定したプログラムを起動させ、ループ処理の条件を変えるようなプログラムを作成したのですがうまくいきません。
Application.OnKeyの仕様がわかっていないせいかもしれませんが、なぜ動かないのか教えていただけますか。

Public flag As Boolean
Public i As Integer

' Ctrl+Alt+eキー入力を検出するためのイベントを追加
Private Sub Workbook_Open()
    Application.OnKey "^%e", "ToggleFlag"
End Sub

' flagの値を切り替えるサブルーチン
Public Sub ToggleFlag()
    flag = Not flag
    Debug.Print "flag: " & flag
End Sub

Public Sub hoge()
    Do While flag = False
        Debug.Print i
        i = i + 1
        DoEvents
    Loop
    Debug.Print "ループ終わり"
    MsgBox "終了!"
End Sub

スポンサーリンク
[返信 1] Re : ループ処理中のApplication.OnKeyについて
投稿者 : higeru     投稿日時 : 2023/09/16(Sat) 11:31:35
今確認できる環境にないのでずが、以下のページ(だいぶ下の方)に、動かないから調査中の旨の注意書きがありますね。

https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.onkey

[返信 2] Re : ループ処理中のApplication.OnKeyについて
投稿者 : tek     投稿日時 : 2023/09/16(Sat) 15:32:05
あまり記事を見つけることが出来ませんが、Doevents と Application.Onkey の併用は出来ない仕様のようです。
https://www.reddit.com/r/vba/comments/13ad5ci/combining_doevents_with_applicationonkey/?rdt=58150

私も実行させましたが、
Doevents中にOnkeyでのToggleFlagは実行されません。

もう少し待って良い回答が付かないようなら、マイクロソフトコミュニティに問い合わせてみたらいかがでしょうか。
excel2016

[返信 3] Re : ループ処理中のApplication.OnKeyについて
投稿者 : ピロリ     投稿日時 : 2023/09/16(Sat) 16:01:25
私もこの辺りは詳しくないですが、下のような走り切りの処理にしないと上手く行かないのかも知れませんね・・・
期待する回答でなくて御免なさい。

Public Sub hoge2()
    If flag = False Then
        Debug.Print i
        i = i + 1
        Application.OnTime EarliestTime:=Now + TimeValue("00:00:01"), _
                           Procedure:="hoge2"   '1秒後に自分自身の起動を宣言
    Else
        Debug.Print "ループ終わり"
        MsgBox "終了!"
    End If
End Sub

[返信 4] Re : ループ処理中のApplication.OnKeyについて
投稿者 : ごんぼほり     投稿日時 : 2023/09/17(Sun) 02:47:41
代替案ですが、このようにして Ctrl + Breakキーで止めたらどうでしょう

 Public Sub hoge()
  Dim i As Long
  Application.EnableCancelKey = xlErrorHandler
  On Error GoTo Interrupt_Exit
     Do While True
        Debug.Print i
        i = i + 1
        DoEvents
     Loop
     Exit Sub
  
 Interrupt_Exit:
    Debug.Print "ループ終わり"
    Application.EnableCancelKey = xlInterrupt
    MsgBox "終了!"
 End Sub

[返信 5] Re : ループ処理中のApplication.OnKeyについて
投稿者 : とぅー     投稿日時 : 2023/09/18(Mon) 08:12:41
なるほど。やはりだめなのですね。
わざわざ教えていただき助かりました。
ありがとうございました。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2023-10-01 23:27:10 )
タイトルとURLをコピーしました