VBA禁用在文本框更改事件中触发的复选框单击事件

时间:2016-12-22 05:41:54

标签: excel vba checkbox

我想做这样的事情。不知道Excel VBA是否可行。在用户表单上,我有一个复选框和一个文本框。

当我选中该复选框时,复选框的标题将被插入文本框中,当我取消选中该复选框时,复选框的标题将从同一文本框中删除。

当我在文本框中写入复选框的标题时,在文本框更改事件内,将更新复选框状态。同时,会触发复选框点击事件,并且标题文本将加倍。如何停止复选单击事件两次?

复选框的点击事件代码:

Private Sub cbSelect_Click()
    With TextBox1
        .Value = IIf(cbSelect.Value, _
        .Value & cbSelect.Caption, _
        Replace(.Value, cbSelect.Caption, vbNullString))
    End With
End Sub

文字框的更改事件代码:

Private Sub TextBox1_Change()
    If InStr(TextBox1.Value, cbSelect.Caption) Then
        cbSelect.Value = 1
    Else
        cbSelect.Value = 0
    End If
End Sub

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

当我测试您的代码时,复选框状态没有改变,我认为这是由于使用二进制值(1 / 0)而不是布尔值(True / { {1}})

我将False代码更改为以下内容,并在删除部分复选框后立即

Textbox1_Change

答案 1 :(得分:0)

我在Public TextBoxFlag As Boolean模块级别添加了User_Form,这个“标志”正在修改并在两个Control的事件中进行检查。

代码进入TextBox1_Change事件后,该标志会获得True值,当代码到达cbSelect_Click事件时,如果代码到达TextBoxFlag = True,则不会运行代码False,仅当它是TextBox1_Change时(不是来自CheckBox1事件,而是来自Option Explicit Public TextBoxFlag As Boolean Private Sub cbSelect_Click() ' check if event came from the value being modified in the TextBox1_Change event If TextBoxFlag = False Then With TextBox1 .Value = IIf(cbSelect.Value, _ .Value & cbSelect.Caption, _ Replace(.Value, cbSelect.Caption, vbNullString)) End With End If End Sub Private Sub TextBox1_Change() ' raise the flag >> came from TextBox change event TextBoxFlag = True If InStr(TextBox1.Value, cbSelect.Caption) > 0 Then cbSelect.Value = True Else cbSelect.Value = False End If ' reset the flag TextBoxFlag = False End Sub 事件)。

<强>代码

tabbarController

答案 2 :(得分:0)

你的代码实际上对我有用而没有你所描述的问题只是替换:

InStr(Me.TextBox1.Value, Me.cbSelect.Caption)

with:

InStr(Me.TextBox1.Value, Me.cbSelect.Caption) > 0

BTW这里有一些可能有用的编码建议:

  • 我总是使用Me关键字并引用Userform控件。

    这也有Intellisense帮助您找到UserForm控件名称

  • 您的cbSelect.Value设置代码可以缩短为一行

由于以上所有原因:

Private Sub TextBox1_Change()
    Me.cbSelect= InStr(Me.TextBox1.Value, Me.cbSelect.Caption) > 0
End Sub

Private Sub cbSelect_Click()
    With Me.TextBox1
        .Value = IIf(Me.cbSelect, _
                    .Value & Me.cbSelect.Caption, _
                    Replace(.Value, Me.cbSelect.Caption, vbNullString))
    End With
End Sub