2017-05-01 1 views
0

私は、多数のフレームを持つユーザーフォームを持っています。各フレームにはテキストボックスがいくつかあります。 Tbxの中には、Tbxが空白の場合にEnterでオートフィルを引き起こすイベントプロシージャがあります。彼らはすべて働いている。しかし、自動入力されたコンテンツを削除した場合、別のコントロールに移動し、最初のコントロールを再度クリックすると、イベントは発生しません。何をクリックしても問題はありません。同じフレーム内の別のコントロールをクリックしてから、テストしているコントロールをクリックするまで何も起こりません。そのシーケンスでのみ、イベントは再び発生します。UserformのEnterイベントが起動しない

同じフレーム内の別のコントロールをクリック、削除、クリックし、最初のコントロールで再度クリックすると、毎回自動入力が行われます。それはちょうど私が削除すると、別のフレームでコントロールをクリックし、期待されるイベントが発生しないことを返します。

私は、フレームとコントロール間のイベントの順序が複雑であることを知っています。私は、テストされたコントロールのExitイベントは、別のフレームのコントロールをクリックすると発生しないと考えています。実際にはExitイベントは、同じフレーム内の別のコントロールをクリックしたときにのみ発生し、その間に物理的にクリックされた他のフレームとは無関係に、Exitイベントが先行していないために発生しません。

しかし、このロジックは奇妙ですが、私は別のフレームに別の自動充填Tbxを持っていると考えて、Tbxから来てテストしています。したがって、おそらく2番目のフレームのEnterイベントが発生し、コントロールのEnterイベントが自動入力されるようになりました。テスト中のTbxのExitイベントが発生していない場合、これらのEnterイベントはどのようにして発生しますか?まあ、Wordについてのすべてが論理的なわけではありません。

しかし、おそらく、この経験があり、最初のコントロールまたはそのフレームのExitイベントを強制する方法、またはこの特定の目的に適した他のイベントを教える人がいます。

ありがとうございます。

答えて

1

2つのテキストボックスコントロールを含む2つのフレームでユーザーフォームを作成し、次のコードを使用してテスト/デバッグします。

Private Sub Frame1_Enter() 
    MsgMe "frm1 enter" 
End Sub 

Private Sub Frame1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    MsgMe "frm1 exit" 
End Sub 

    Private Sub TextBox1_Enter() 
     MsgMe "tb1 enter" 
    End Sub 

    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
     MsgMe "tb1 exit" 
    End Sub 


    Private Sub TextBox2_Enter() 
     MsgMe "tb2 enter" 
    End Sub 

    Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
     MsgMe "tb2 exit" 
    End Sub 

Private Sub Frame2_Enter() 
    MsgMe "frm2 enter" 
End Sub 
Private Sub Frame2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    MsgMe "frm2 exit" 
End Sub 

    Private Sub TextBox3_Enter() 
     MsgMe "tb3 enter" 
    End Sub 

    Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
     MsgMe "tb3 exit" 
    End Sub 
    Private Sub TextBox4_Enter() 
     MsgMe "tb4 enter" 
    End Sub 

    Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
     MsgMe "tb4 exit" 
    End Sub 

Sub MsgMe(str$) 
    Debug.Print str 
End Sub 

あなたの疑惑は正しいようです。

私は、テストされたコントロールのExitイベントは、別のフレームでコントロールをクリックすると発生しないと考えています。実際には、Exitイベントは同じフレーム内の別のコントロールをクリックすると発生します。

    :Exitイベントは、それに先行していないため、イベントを入力することを、単に、私はこれが理由であると信じて

かかわらず、その、私は物理的にその間に上のクリックした他のフレームを発生しません。

  • ユーザーフォームを表示し、これがをトリガーすることを確認します。イベントおよびTextBox1_Enterイベント。
  • TextBox3をクリックし、これを遵守はFrame1_Exit、その後、Frame2_Enter、最後にTextBox3_EnterイベントではなくTextBox1_Exitイベントをトリガします。
  • Frame1、TextBox1の任意のコントロールに戻ると、Frame1_Enterイベントが発生しています。 TextBox1_Exitイベントは発生していません。これは、このコントロールを終了していないためです。ステップ2でフレームを終了しても、このコントロールにはまだフォーカスがあり、今戻っています。
  • 、違っを少し行います

    1. は、ユーザーフォームを表示し、これはFrame1_EnterイベントTextBox1_Enterイベントをトリガー観察します。
    2. TextBox3をクリックし、これを遵守はFrame1_Exit、その後、Frame2_Enter、最後にTextBox3_EnterイベントではなくTextBox1_Exitイベントをトリガします。
    3. TextBox2(Frame1)をクリックすると、次のイベントシーケンスが表示されます。Form1_Enter1TextBox1_Exit、最後にTextBox2_Enterです。

    あなたのテキストボックスにMouseDownイベントハンドラを追加する場合は、コントロールがまだExit編を持っていますが、あなたはそれ/親フレームにフォーカスを返しているというシナリオをキャプチャできるようになります。

    Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
        MsgMe "tb1 mousedown" 
    End Sub 
    
    +0

    ご協力いただきありがとうございます。私は2つの理由からあなたの解決策に反対しました。まず、MouseUpイベントは、正しく起動するEnterイベントの代替イベントです。 Exitイベントをスキップしても何の効果もなかったことを示すことができませんでした。第2に、ユーザーがフォームをナビゲートするためにキーボードを使用することを決定した場合、MouseUpイベントは発生しません。 – Variatus

    +1

    @Variatusあなたはそれを扱う別の方法を見つけたように見える心配はありません!通常、問題にはいくつかの異なる解決策があります。キーボード対マウスの良い点も! –

    1

    不本意なTextBoxの終了イベントは、他のイベントによって呼び出される同様のプロシージャに置き換えることができます。最も適切なフレームは、フレームの任意のコントロールがアクティブになったときに起動され、次のようなプロシージャを呼び出すことができる、フレームのEnterイベントです。

    Dim PrevFrm As MSForms.Frame 
    
    Private Sub SetPrevControl() 
        ' 02 May 2017 
    
        If Not PrevFrm Is Nothing Then 
         If Not PrevFrm.ActiveControl Is Nothing Then 
          ' call the replacement Exit procedure here 
          MsgMe "Trigger Exit for " & PrevFrm.ActiveControl.Name 
         End If 
        End If 
        Set PrevFrm = ActiveControl 
    End Sub 
    
    関連する問題