VBA:非硬编码将Userform2列表框值传递到触发它的文本框
VBA用户窗体多文本框传值与触发事件问题解决
问题1:多文本框下动态传递选中员工到触发文本框
核心思路是在UserForm2中存储触发它的文本框对象,避免硬编码指定控件:
- 在UserForm2的代码模块顶部添加模块级变量,用于保存目标文本框:
Private targetTextBox As MSForms.TextBox
- 修改UserForm1中每个文本框的触发事件(比如Enter或MouseDown),把当前文本框传递给UserForm2:
Private Sub TextBox1_Enter() Set UserForm2.targetTextBox = Me.ActiveControl UserForm2.Show End Sub ' 其他文本框直接复制上述逻辑,比如TextBox2 Private Sub TextBox2_Enter() Set UserForm2.targetTextBox = Me.ActiveControl UserForm2.Show End Sub
- 改写UserForm2的确定按钮代码,将选中值赋值给动态记录的目标文本框:
Private Sub cmdOK_Click() ' 建议用Click事件,更符合用户点击确定的操作习惯 Dim myVar As String Dim x As Integer myVar = "" With lstWorker For x = 0 To .ListCount - 1 If .Selected(x) Then myVar = IIf(myVar = "", .List(x), myVar & ", " & .List(x)) End If Next x End With ' 判断目标文本框是否有效,再赋值 If Not targetTextBox Is Nothing Then targetTextBox.Value = myVar End If Me.Hide Set targetTextBox = Nothing ' 释放对象变量 End Sub
问题2:文本框触发事件的选择
TextBox_Enter事件本身是有效的,它在文本框获得焦点时触发(包括点击文本框、用Tab键切换进入)。你之前的Click事件无效,大概率是因为文本框已经处于激活状态,再次点击不会触发Click事件。- 如果需要点击文本框就弹出UserForm2,更可靠的是使用
MouseDown事件,无论文本框是否已有焦点,点击都会触发:
Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Set UserForm2.targetTextBox = Me.ActiveControl UserForm2.Show End Sub
- 额外检查:确保文本框的
Enabled属性为True、Locked属性为False,如果控件被禁用或锁定,事件会无法触发。
内容的提问来源于stack exchange,提问作者Light
相关产品推荐
相关产品推荐

