一个问题是:如何为组合框列表加载或赋值,然后在我的工作表中调用它并从中获取所选值?我有一个模块,我想调用我的userform1,其中包含组合框它。但是当我调试程序时,它只是一个组合框的显示。我认为它没有做任何事情...感谢您的时间..这是用户表单的代码:
Private Sub UserForm_Initialize()
With ComboBox1
.AddItem "weibull"
.AddItem "log-normal"
.AddItem "gambel"
.Style = fmStyleDropDownList
End With
End Sub
这就是我在sub中要求显示组合框的方法:
UserForm1.Show
If ComboBox1.ListIndex = -1 Then
MsgBox "There is no item currently selected.", _
vbInformation, _
"Combo Box Demo"
Exit Sub
End If
MsgBox "You have selected " & ComboBox1.List(ComboBox1.ListIndex) & "." & vbNewLine _
& "It has " & ComboBox1.ItemData(ComboBox1.ListIndex) ", _
vbInformation, _
"Combo Box Demo"
第二部分是我在网上找到的,但它使程序至少显示组合框!
答案 0 :(得分:1)
我认为Siddharth的回答非常清楚,特别是因为它是从手机发布的!但是,我收到了OP的电子邮件,说他不明白答案。我提供了以下背景,这显然足以让他了解Siddharth的答案并解决他的问题。我在这里张贴它是为了任何其他需要更多表格背景的访客,而不是Siddharth提供的。
如果您选择VBA帮助并输入“userform show”,您将获得Show命令的说明。
如果您的用户表单名为“UserForm1”,则可以使用语句:
陈述1和2是等同的。
选择VbModal或vbModeless会完全改变用户表单的控制方式。
如果表单显示为无模式,则用户可以看到它但无法访问它。如果我有一个需要很长时间的宏,我将使用无模式表单来显示进度。如果我正在处理大型工作表的行,我可能会有一个包含以下内容的表单:
我正在研究行 nnnn 的 mmmm
每个框都是一个标签。我将包含“mmmm”的标签的值设置为启动宏时的行数。我将包含“nnnn”的标签的值设置为循环每次重复开始时的行号。用户看到:
I am working on row 1 of 5123
then I am working on row 2 of 5123
then I am working on row 3 of 5123
and so on.
如果宏需要五分钟来处理每一行,这会告诉用户发生了一些事情。如果没有表单,用户可能会认为宏已失败。使用表格,用户知道宏很忙,他们有时间喝一杯新鲜咖啡。
另一方面,如果表单显示为模态,则宏会停止,直到用户执行关闭或卸载表单的操作,其语句如下:
Unload Me
此声明的定位取决于您的表单。我通常有一个提交按钮,在结束此声明之前保存信息。
执行Unload Me语句后,宏将在Show语句后的语句处重新启动。当宏重新启动时,表单已经消失。这就是表单必须在全局变量中保存宏需要的原因。
答案 1 :(得分:0)
您正在尝试在用户窗体已关闭时访问控件。我说是关闭的,因为你没有使用vbmodeless
来显示表格。因此,之后下一行可以运行的唯一方法是关闭表单。这是我的建议。
在模块中声明公共变量,该模块将在useform关闭时保存相关值,然后再使用它。例如
将此代码粘贴到用户表单
中Option Explicit
Private Sub UserForm_Initialize()
With ComboBox1
.AddItem "weibull"
.AddItem "log-normal"
.AddItem "gambel"
.Style = fmStyleDropDownList
End With
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If ComboBox1.ListIndex <> -1 Then
SelectItem = ComboBox1.List(ComboBox1.ListIndex)
pos = ComboBox1.ListIndex + 1
End If
End Sub
将其粘贴到模块中
Option Explicit
Public SelectItem As String, pos As Long
Sub Sample()
'
'~~> Rest of your code
'
SelectItem = "": pos = 0
UserForm1.Show
If pos = 0 Then
MsgBox "There is no item currently selected.", _
vbInformation, "Combo Box Demo"
Exit Sub
End If
MsgBox "You have selected " & SelectItem & "." & vbNewLine & _
"It is at position " & pos, vbInformation, "Combo Box Demo"
'
'~~> Rest of your code
'
End Sub
另外
Combobox没有.Itemdata
属性。它在VB6中可用,但在VBA中不可用。使用Combobox的.Itemdata
属性,我想你想要获得这个位置?