我想做这样的事情。不知道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
有什么想法吗?
答案 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