VBA Excel-从模块

时间:2018-06-20 23:23:53

标签: string excel-vba combobox module userform

我正在通过代码创建一个用户表单,其中每行包含标签,文本框和组合框(请参见下图)。行数是可变的(组合框的数目也是可变的)。我还创建了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

一切正常,但单击“确定”按钮。 我不想与userface.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"

代码运行无错误,但msgbox显示为“ Cbtxt”值为空 Screenshot userface 我发现大多数“解决方案”都是通过在移动到工作表之前将值赋给公共变量来完成一次。但是,就我而言,输入的数量正在变化,因此我必须将其包含在循环中。我不能为每个组合框专用一个变量(或者可以吗?...还是不能)。

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

1 个答案:

答案 0 :(得分:0)

正确的...我尝试了很多事情,但似乎没有什么比以下方法有用。我把代码写到了用户表单代码模块中

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,因为每次分配行都花费太多时间。但是我发现,如果您这样做的话,您只需复制/粘贴,然后将代码倒写即可。

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