VBA运行时生成Userform动态文本框 如何获取输入值写入工作表
问题原因
- 变量作用域问题:
num是在Userform_Initialize过程中声明的局部变量,仅在该过程内有效,提交按钮的点击事件中无法读取到这个值,循环没有执行基础。 - 动态控件引用方式错误:动态生成的控件不能直接通过拼接字符串加
.Value的方式调用,需要通过用户窗体的Controls集合按控件名称索引获取。 - 代码笔误:
Workseets拼写错误,正确应为Worksheets。
修复方案
第一步:调整变量作用域
在Userform代码模块的最顶部、所有过程之外声明模块级变量num,确保窗体所有过程都可以读取该值:
' 放在Userform代码模块最顶端 Dim num As Long
原Userform_Initialize代码不需要改动,只需要把过程内的Dim num as Long声明删除即可,避免重复声明。
第二步:修改提交按钮点击代码
通过Controls集合引用动态生成的文本框:
Private Sub SubmitButton_Click() Dim ws As Worksheet Dim i As Long Set ws = Worksheets("Test") ' 修正拼写错误 For i = 1 To num ' 按名称索引获取动态生成的文本框 ws.Range("A" & i).Value = Me.Controls("inputBx" & i).Value Next i End Sub
如果需要弹窗查看单个文本框的值,使用以下写法即可:
MsgBox Me.Controls("inputBx1").Value
可选优化方案
如果不想维护模块级变量,也可以直接遍历控件集合筛选目标文本框,兼容性更强:
Private Sub SubmitButton_Click() Dim ws As Worksheet Dim ctl As Control Dim i As Long Set ws = Worksheets("Test") i = 1 For Each ctl In Me.Controls ' 筛选符合命名规则的文本框 If TypeName(ctl) = "TextBox" And ctl.Name Like "inputBx*" Then ws.Range("A" & i).Value = ctl.Value i = i + 1 End If Next ctl End Sub
内容的提问来源于stack exchange,提问作者rsg
相关产品推荐
相关产品推荐

