excel - 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 在这里显示 我发现的大多数“解决方案”都提到了这样做一次,方法是在移动到工作表之前将值提供给公共变量。但是,就我而言,输入的数量正在发生变化,因此我必须将其包含在一个循环中。我不能为每个组合框指定一个变量(或者我可以吗?...或不可以)。
我希望你们能理解我。感谢您的支持!
解决方案
对......我尝试了很多东西,但似乎除了以下内容之外没有别的东西。我将代码写入用户表单代码模块
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 因为每次分配行都需要太多时间。但我发现,如果你这样做,你只需复制/粘贴,它就会把代码倒过来写。
感谢那些试图提供帮助的人。
推荐阅读
- html - 关于在 IE10-11 上“拖动”背景图片有什么建议吗?
- android - 使用 MvvmCross 在 Xamarin 中编写的 Android 应用程序中即时更改语言
- python - 使用网络摄像头 OpenCV 将多条线连接到屏幕中心
- selenium - 使用 Data Provider 的 TestNG 并行测试
- ruby - 如何通过 Ruby 控制器使用 Multipart/form-data?
- r - 如何创建带有特殊字符的字符串
- swift - 在 WebView 中触发按钮
- c - 用于返回结构的 C 宏
- python - 为什么 datetime.datetime.fromtimestamp 引发 OSError: [Errno 22] Invalid argument
- xaml - 将 Xamarin 表单选项卡式页面连接到 XAML