Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
フレーム内のテキストボックスのイベントについて
投稿日時: 20/05/23 17:37:41
投稿者: manatsu

UserForm に2つのTextBox を配置し、TextBox1 に数字を入力すると、TextBox2 に +1 の値が、TextBox2に 数字を入れると TextBox1 に +10 の値が自動で入るようにしました。
一応思い通りに動作するのですが、Frame に配置するとうまくいきません。TextBox の Event に影響がでるのでしょうか。対処方法がわかりません。
どなたか、よろしくお願いします。
 
Private Sub TextBox1_Change()
 
    If Me.ActiveControl.Name = "TextBox1" Then
        If TextBox1 = "" Then
            TextBox2 = ""
            Exit Sub
        End If
        TextBox2 = TextBox1.Value + 1
    End If
 
End Sub
 
Private Sub TextBox2_Change()
 
    If Me.ActiveControl.Name = "TextBox2" Then
        If TextBox2 = "" Then
            TextBox1 = ""
            Exit Sub
        End If
        TextBox1 = TextBox2.Value + 10
    End If
 
End Sub

投稿日時: 20/05/23 18:05:57
投稿者: manatsu

Frame に配置すると、TextBox にではなく、Frame に Event が発生することがわかりました。
でも、その先がわかりません。よろしくお願いします。

回答
投稿日時: 20/05/23 19:01:54
投稿者: MMYS

以下のように変更すれば動作します。
 

Private Sub TextBox1_Change()
 
    If Me.Frame1.ActiveControl.Name = "TextBox1" Then
        If TextBox1 = "" Then
            TextBox2 = ""
            Exit Sub
        End If
        TextBox2 = TextBox1.Value + 1
    End If
 
End Sub
 
Private Sub TextBox2_Change()
 
    If Me.Frame1.ActiveControl.Name = "TextBox2" Then
        If TextBox2 = "" Then
            TextBox1 = ""
            Exit Sub
        End If
        TextBox1 = TextBox2.Value + 10
    End If
 
End Sub

しかしながら、上記コードはおすすめしません。
おそらく意図しないイベント発生のためだと思いますが、
イベント抑制はフラグで制御がセロリーです。
 

    Dim eventFlog As Boolean

Private Sub TextBox1_Change()
    If Not eventFlog Then Exit Sub
 
    eventFlog = False
    If TextBox1 = "" Then
        TextBox2 = ""
        Exit Sub
    End If
    TextBox2 = TextBox1.Value + 1
    eventFlog = True
End Sub
 
Private Sub TextBox2_Change()
    If Not eventFlog Then Exit Sub
        
    eventFlog = False
    If TextBox2 = "" Then
        TextBox1 = ""
        Exit Sub
    End If
    TextBox1 = TextBox2.Value + 10
    eventFlog = True

End Sub

Private Sub UserForm_Initialize()
    eventFlog = True
End Sub

 
なお原因は、上位オブジェクトは何か、どのコントロールの配置下なのかです。
以前に似た質問がありますのて、下記を参考にしてください。
https://www.moug.net/faq/viewtopic.php?t=79102
 
 
 

回答
投稿日時: 20/05/23 22:38:02
投稿者: WinArrow
投稿者のウェブサイトに移動

テキストボックスのChengeイベントは、
1文字入力の都度イベントが発生するが
それでも良いのですか?

投稿日時: 20/05/24 11:02:21
投稿者: manatsu

MMYSさん
回答ありがとうございます。
「上位オブジェクトは何か、どのコントロールの配置下なのか」に注意するということですね。
紹介していただいたリンク先は私自身の質問で、お恥ずかしい限りです。
「イベント抑制はフラグがセオリー」、勉強になりました。
今後ともよろしくお願い致します。
 
WinArrowさん
コメントありがとうございます。
「1文字入力の都度イベントが発生」というのは意図したところです。
質問のコードでは +1 +10 と単純化しましたが、インクリメンタル・サーチみたいな感じで、数字を入力するごとに瞬時に対応するという動作をさせたかったのです。
MMYSさんに教えていただいて解決致しました。今後ともよろしを願いします。