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

如何高效将Excel用户表单数据批量填充至表格?

高效批量导入Excel用户表单数据到Sheet1的VBA解决方案

我目前需要在Excel中维护产品数据库,经理虽已计划更换为专业数据库,但现阶段仍需继续使用Excel。为避免手动逐个单元格填写产品信息,我想找更快捷的方式。现有一个带多标签的用户表单,需填写约350项不同数据(不同产品需填写的项数不同),原本打算用以下VBA代码逐个将表单数据赋值到Sheet1的新行:

Private Sub OK_Click()

    'variable to store the count of rows.
    Dim irow As Long
    Dim iRowCode As Long

    'get the count cells that are filled
    irow = WorksheetFunction.CountA(Worksheets("Bron calculatie").Range("D:D"))

    'get to the next blank cell in column G
    Worksheets("Sheet1").Cells(irow + 1, 7).Value = ADD_ITEM.ART.Value
    Worksheets("Sheet1").Cells(irow + 1, 8).Value = ADD_ITEM.BREED.Value
    Worksheets("Sheet1").Cells(irow + 1, 9).Value = ADD_ITEM.DIEP.Value
    Worksheets("Sheet1").Cells(irow + 1, 10).Value = ADD_ITEM.ZITH.Value
    Worksheets("Sheet1").Cells(irow + 1, 11).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, 12).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, 13).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value
    Worksheets("Sheet1").Cells(irow + 1, ).Value = ADD_ITEM..Value


    MsgBox Chr(10) & "Artikel is toegevoegd" & Chr(10)
    
    Unload Me
    End

End Sub

但由于需赋值的项数多达350个,这种逐个赋值的方式效率极低,请问是否有更快捷简便的方法实现该需求?


方案一:控件-列映射数组批量赋值

通过定义存储控件名称和对应目标列号的数组,循环遍历数组完成批量赋值,无需重复编写350行赋值代码:

Private Sub OK_Click()
    Dim ws As Worksheet
    Dim irow As Long
    Dim ctrlMap As Variant
    Dim i As Integer
    Dim targetCtrl As Control
    
    ' 指定目标工作表
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    ' 获取下一个空行(沿用原逻辑,基于"Bron calculatie"的D列计数)
    irow = WorksheetFunction.CountA(ThisWorkbook.Worksheets("Bron calculatie").Range("D:D")) + 1
    
    ' 定义控件名与目标列的映射数组,按格式添加所有350项
    ctrlMap = Array( _
        Array("ART", 7), _
        Array("BREED", 8), _
        Array("DIEP", 9), _
        Array("ZITH", 10), _
        ' 继续添加剩余控件:Array("控件名称", 列号),
        Array("ExampleCtrl", 11) _
    )
    
    ' 循环遍历映射数组完成赋值
    For i = LBound(ctrlMap) To UBound(ctrlMap)
        On Error Resume Next ' 忽略不存在的控件报错
        Set targetCtrl = Me.Controls(ctrlMap(i)(0))
        On Error GoTo 0
        
        If Not targetCtrl Is Nothing Then
            ws.Cells(irow, ctrlMap(i)(1)).Value = targetCtrl.Value
        End If
    Next i
    
    MsgBox Chr(10) & "Artikel is toegevoegd" & Chr(10)
    Unload Me
End Sub

方案二:按多标签页遍历控件(自动匹配表头)

如果表单使用MultiPage控件做分标签,且控件名称与Sheet1的表头名称完全一致,可以直接遍历所有标签页的控件,自动匹配目标列,无需手动维护映射数组:

Private Sub OK_Click()
    Dim ws As Worksheet
    Dim irow As Long
    Dim mp As MultiPage
    Dim page As Page
    Dim ctrl As Control
    Dim targetCol As Range
    
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    irow = WorksheetFunction.CountA(ThisWorkbook.Worksheets("Bron calculatie").Range("D:D")) + 1
    ' 假设你的多标签控件名为MultiPage1,根据实际修改
    Set mp = Me.MultiPage1
    
    ' 遍历每个标签页下的所有控件
    For Each page In mp.Pages
        For Each ctrl In page.Controls
            ' 在Sheet1的第一行查找与控件名匹配的表头
            Set targetCol = ws.Rows(1).Find(ctrl.Name, LookIn:=xlValues, LookAt:=xlWhole)
            If Not targetCol Is Nothing Then
                ws.Cells(irow, targetCol.Column).Value = ctrl.Value
            End If
        Next ctrl
    Next page
    
    MsgBox Chr(10) & "Artikel is toegevoegd" & Chr(10)
    Unload Me
End Sub

方案对比

  • 方案一:适合控件与列的对应关系固定的场景,代码严谨,不易出错,需要手动维护映射数组。
  • 方案二:灵活性更高,新增控件时只要命名和表头一致就自动生效,无需修改代码,但要求控件名与表头严格匹配。

内容的提问来源于stack exchange,提问作者DannyDutchie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:54:56