教えて!gooにおける不適切な投稿への対応について

こんにちは エクセルのマクロのループのコードを教えて下さい。


Sub ○○()
 ~
End sub

Sub ▽▽()
 ~
End sub

のようにボタンクリックのマクロが8つあります。

やりたい事は、ボタンを押したらこの8つのマクロ処理を〇〇秒おきにずっと繰り返すマクロのコードを教えて下さい。

ボタンを押したら○○を実行、30秒後に▽▽を実行、8つ終わったらまた〇〇を実行、のような物です。

詳しい方、よろしくお願い致します。

質問者からの補足コメント

  • どう思う?

    ちょっと困ったことが起きました。

    停止させるときはESCで停止させようと思っていたのですが、ESC⇒デバッグ終了画面で止まらないので、WEBで以下の様なコードを見つけて使ってみましたが、止まりません。

    Sub Sample()
    If MsgBox("中断しますか?", vbYesNo) = vbYes Then
    End
    End If
    MsgBox ("完了しました。")
    End Sub

    お手数ですが停止させる方法を教えて頂けませんでしょうか。

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

      補足日時:2021/01/13 08:34
gooドクター

A 回答 (2件)

No1です



>ESCで停止させようと思っていたのですが~
ESCで停止できるのは、「実行中のマクロ」です。
No1のサンプル程度だと、実行時間はとても短いので、ほとんどの時間はマクロは動作していません。(なので、No1でお断りしたように止められません)


>お手数ですが停止させる方法を教えて頂けませんでしょうか。
フラグ的なものを使って、それがセットされていたら実行しない(=ontimeの設定を行わない)といったようなロジックにしておくのが簡単です。
この方法だけだと、停止させようとしてもすぐに完全停止はせず、すでにセットされているontimeの処理が実行されたところで、停止することになります。

フラグをセットしたら、即、実行を止めたいような場合には、上記に加えて、実際の実行側(=サンプルで言えばAAA、BBB、CCC)でもフラグを確認して、処理を行うかどうか判断するようにしておけば、即時停止のような振る舞いにできるでしょう。

具体的には、シートモジュールにプライベート変数を設定しておいて、それを外から制御してあげれば良いと考えらます。
サンプルのマクロ側では、そのフラグを参照して
 If flag Then ~~
のような処理にしておけば宜しいかと。


フラグを解除するのはEscキーなどでも良いですが、エクセルの場合キーイベントが存在しないので、キーダウン等を取得するにはAPIを利用することになります。
https://liclog.net/getasynckeystate-function-vba …
(↑)のような面倒なことをせずとも、フラグを解除するマクロを別に作成しておいて、そちらを実行する方が遥かに簡単です。


もっと簡単な方法で行うなら、シート内の固定セルの値で代用するといった方法が考えられます。
例えば、「A1セルに何か値があれば停止する」といったルールにしておくなら、上記のマクロの修正部分を
 If Cells(1, 1).Value = "" Then ~~
のようにしておくことで、A1セルがフラグ代わりになり、セル値は直接操作できる関係から、フラグ用の変数も値設定用のマクロも不要になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

マクロ、全然解らないのでちんぷんかんぷんでした(汗

ありがとうございました。

お礼日時:2021/01/13 15:28

こんばんは



>マクロ処理を〇〇秒おきにずっと繰り返すマクロのコードを教えて下さい。
正確な時間にならない可能性はありますが、OnTimeメソッドで実行をセットしておけば宜しいでしょう。
https://docs.microsoft.com/ja-jp/office/vba/api/ …

以下は、対象とするマクロを3つにした簡単な例です。(何個でも同様です)
※ carouselを実行すると、AAA、BBB、CCCが繰り返し実行されます。
※ サンプルのままでは終了しませんので、停止する仕組みを組み込んでください。
※ マクロの処理にインターバル以上の時間がかかるような場合は、うまく処理されない可能性があります。(そのようなケースはテストしていません)

Sub AAA()
 Debug.Print "AAA " & Time
End Sub

Sub BBB()
 Debug.Print "BBB " & Time
End Sub

Sub CCC()
 Debug.Print "CCC " & Time
End Sub

Sub carousel()
 Dim prNames, dt, n, i
 prNames = Split("AAA,BBB,CCC", ",")
 dt = TimeValue("00:00:30")
 n = UBound(prNames) + 1

 For i = LBound(prNames) To UBound(prNames)
  Application.OnTime Now + dt * i, prNames(i)
 Next i
 DoEvents
 Application.OnTime Now + dt * n, "carousel"
End Sub
    • good
    • 0
この回答へのお礼

助かりました

いつも詳しく回答を頂き、ありがとうございます。
お陰様でばっちり出来ました!

お礼日時:2021/01/13 08:26

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

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

gooドクター

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

人気Q&Aランキング