MW211 EXIT

devlog
ExcelVBA/ActiveXコントロール無限ループ
2018年08月17日
以下だと無限ループしてしまう。
┌──────────────────────────────────────┐
│Private Sub TextBox_Change()                                                │
│    Me.TextBox.Value = Rnd()                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘

以下は、Excelシート向けのイベント抑止なので効かない。
┌──────────────────────────────────────┐
│Private Sub TextBox_Change()                                                │
│    Application.EnableEvents = False                                        │
│    Me.TextBox.Value = Rnd()                                                │
│    Application.EnableEvents = True                                         │
│End Sub                                                                     │
└──────────────────────────────────────┘

回避方法としては地道にフラグ制御しかないようだ。
┌──────────────────────────────────────┐
│Private mIs無限ループ回避 As Boolean  ' 初期値はFalseになる                 │
│Private Sub TextBox_Change()                                                │
│    If mIs無限ループ回避 Then                                               │
│        mIs無限ループ回避 = False     ' 次回に向けて再初期化                │
│    Else                                                                    │
│        mIs無限ループ回避 = True      ' 代入処理より前に置くこと            │
│        Me.TextBox.Value = Rnd()                                            │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
なお、「mIs無限ループ回避 = True」の位置は、
「Me.TextBox.Value = Rnd()」の前になければ効かないので注意。
分類:ExcelVBA