我正在通过代码创建一个用户表单,其中每行包含标签,文本框和组合框(请参见下图)。行数是可变的(组合框的数目也是可变的)。我还创建了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”值为空 我发现大多数“解决方案”都是通过在移动到工作表之前将值赋给公共变量来完成一次。但是,就我而言,输入的数量正在变化,因此我必须将其包含在循环中。我不能为每个组合框专用一个变量(或者可以吗?...还是不能)。
我希望你能理解我。感谢您的支持!
答案 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,因为每次分配行都花费太多时间。但是我发现,如果您这样做的话,您只需复制/粘贴,然后将代码倒写即可。
感谢那些尝试提供帮助的人。