首页 > 解决方案 > VBA Excel - 从模块中的程序中收集用户表单中的数据

问题描述

我正在通过代码创建一个用户表单,其中每行包含标签、文本框和组合框(见下图)。行数是可变的(组合框的数量也是如此)。我还创建了 3 个按钮:确定、取消、添加。“取消”卸载表单,“添加”打开另一个用户表单以更新组合框的源,“确定”将用户在组合框中选择的信息放入工作表中的单元格。所有按钮调用另一个 Sub 执行:

With Userface.codemodule
        .insertlines 1, "end sub"
        .insertlines 1, "call Cansub"
        .insertlines 1, "Private Sub Canbt_Click()"
End With

'Validate  and register
With Userface.codemodule
        .insertlines 1, "end sub"
        .insertlines 1, "Call Oksub"
        .insertlines 1, ""
        .insertlines 1, "Public Sub Okbt_Click()"
End With

'add another category and/or reason
With Userface.codemodule
        .insertlines 1, "end sub"
        .insertlines 1, "call Addsub"
        .insertlines 1, "Private Sub Addbt_Click()"
End With

Application.VBE.MainWindow.Visible = True
VBA.UserForms.Add(Userface.Name).Show

一切正常,但“确定”按钮。我不想用 withuserface.codemodule.insertlines 1,""来写整个事情。这就是我打电话给潜艇的原因。

这是按钮调用的 Public OKsub():

Dim Addentr As Range
Dim Line As Long
Dim Cbtxt As String

Line = 0
Line = Range(Range("J1").End(xlDown).Offset(1, 0), Range("A1").End(xlDown)).Rows.Count
Set Addentr = ActiveWorkbook.Sheets("Combined").Range(Range("J1").End(xlDown).Offset(1, 0), Range("A1").End(xlDown))

For i = 0 To Line - 1
    Cbtxt = UserForm1.Controls("Cbo_A" & i).Value
    MsgBox "Combobox CBo_A" & i & " = " & Cbtxt

    If IsEmpty(Cbtxt) = False Then
        Addentr.Cells(i + 1, 10).Value = Cbtxt
    End If

    Cbtxt = UserForm1.Controls("Cbo_B" & i).Text

    If IsEmpty(Cbtxt) = False Then
        Addentr.Cells(i + 1, 11).Value = Cbtxt
    End If

Next i

MsgBox "Entries fulfilled"

代码运行没有错误,但是“Cbtxt”值是空的,因为 msgbox 在这里显示 屏幕截图用户界面 我发现的大多数“解决方案”都提到了这样做一次,方法是在移动到工作表之前将值提供给公共变量。但是,就我而言,输入的数量正在发生变化,因此我必须将其包含在一个循环中。我不能为每个组合框指定一个变量(或者我可以吗?...或不可以)。

我希望你们能理解我。感谢您的支持!

标签: excelvbacomboboxuserform

解决方案


对......我尝试了很多东西,但似乎除了以下内容之外没有别的东西。我将代码写入用户表单代码模块

With Userface.CodeModule
        .insertlines 1, "end sub"
        .insertlines 1, ""
        .insertlines 1, "call Cansub"
        .insertlines 1, "MsgBox ""Entries fulfilled"""
        .insertlines 1, "    Next i"
        .insertlines 1, "        End If"
        .insertlines 1, "            Addentr.Cells(i + 1, 11).Value = Cbtxt"
        .insertlines 1, "        If IsEmpty(Cbtxt) = False Then"
        .insertlines 1, "        Cbtxt = me.Controls(""Cbo_B"" & i).Value"

        .insertlines 1, "        End If"
        .insertlines 1, "           Addentr.Cells(i + 1, 10).Value = Cbtxt"
        .insertlines 1, "        If IsEmpty(Cbtxt) = False Then"
        .insertlines 1, "        Cbtxt = me.Controls(""Cbo_A"" & i).Value"

        .insertlines 1, "   For i = 0 To Line - 1"
        .insertlines 1, "Line = Range(Range(""J1"").End(xlDown).Offset(1, 0), Range(""A1"").End(xlDown)).Rows.Count"
        .insertlines 1, "Set Addentr = ActiveWorkbook.Sheets(""Combined"").Range(Range(""J1"").End(xlDown).Offset(1, 0), Range(""A1"").End(xlDown))"
        .insertlines 1, "Line = 0"
        .insertlines 1, "Dim Addentr As Range"
        .insertlines 1, "Dim Line As Long"
        .insertlines 1, "Dim Cbtxt As String"
        .insertlines 1, "Public Sub Okbt_Click()"
End With

`

注意:您必须从下到上阅读程序。我讨厌使用 .insertlines 因为每次分配行都需要太多时间。但我发现,如果你这样做,你只需复制/粘贴,它就会把代码倒过来写。

感谢那些试图提供帮助的人。


推荐阅读