You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:54:05