91027
あるシート内で、ボタンのクリックによって開始する関数があります。  
その関数は、別のボタンのクリックによって停止しない限り無限に終了しない関数です。

上記のシートを複数用意して、複数の無限ループをシートごとに動かしたいです。  
シートをコピーすれば関数(VBE)もコピーされるのでそれも1つの手ですが、変更があった時に同じ変更を全てに適用しなければならなくなるので、関数をモジュールに移動して、どのシートのボタンを押しても同じ関数が呼び出されるようにしました。  
短時間で終わる処理であれば共通の関数を全シートから呼び出す方法で良いのですが、今回の関数は無限ループがあるため、うまく動きません。  
(シートAから呼び出されて無限ループ実行中にシートBから呼び出されると、無限ループを最初からやり直す事となりシートAで実行していた処理が停止される)

無限ループを持つ関数の実装を一箇所のみとして、独立して実行する方法がありましたら教えてください。

無限ループを含む関数の概略を以下に記します。

```

    Private Sub btn_Click()
        '(前略)
    
        Do
            '(中略)
    
            Do
                '(中略)
                If FlgStop = True Then              '停止ボタンが押されたら
                    Exit Do                         '終了する
                End If
    
                DoEvents                            '他の処理を実行する
            Loop While (1周待ち)        '送信間隔に達するまで継続する
    
            If FlgStop = True Then      '停止ボタンが押されたら
                Exit Do                 '終了する
            End If
        Loop While True
    
        '(後略)
    
    End Sub
    
```
CC BY-SA 4.0
2022-09-06T08:47:11.080
90959
2022-09-10T07:06:07.740
2022-09-07T06:47:16.513
3060
54279
question
vba
Excel VBAで、ループを持つ関数を再入可能にする方法 (実装は一箇所のみで、独立して実行する方法)
ループを制御している `FlgStop` について説明がありませんが、現状は `Boolean` かと思います。

> シートAから呼び出されて無限ループ実行中にシートBから呼び出されると、無限ループを最初からやり直す事となりシートAで実行していた処理が停止される

という記述から「シートごとに処理を独立させたい」と読み取りました。であれば、ループを制御している `FlgStop` を
[`Dictionary`オブジェクト](https://docs.microsoft.com/ja-
jp/office/vba/language/reference/user-interface-help/dictionary-object)
にして、シート名をキーにフラグ状態を管理されればいいのではないでしょうか。  
ただし、この方法はループ開始後にシート名を変更すると追跡できなくなるという問題があります。
CC BY-SA 4.0
2022-09-10T07:06:07.740
91027
2022-09-10T07:06:07.740
4236
90959
answer