我的VBA项目中有一个枚举类:
Enum ruleEnum
admins
manager
users
supervisor
End Enum
现在,我想获取此类的所有枚举值并将其插入到ComboBox中。我希望它能够动态运行,因为将来我可能会制定新的规则。谁让枚举类中的所有规则循环或收集
答案 0 :(得分:2)
本文Pearson Software Consulting:Enum Variable Type会让您使用下划线定义隐藏的Enumeration值,以便在这样的循环中使用:
Enum ruleEnum [_First] = 0 admins = 0 manager = 1 Users = 2 supervisor = 3 [_Last] = 3 End Enum
但是我认为我们可以做得更好。与其在枚举开始时分配循环的第一个值,不如在枚举末尾分配它。这样,我们可以定义循环的开始[_First]
等于第一个枚举值常量,循环的结束[_Last]
等于我们最后一个枚举常量的值想循环过来。
Enum ruleEnum admins manager Users supervisor [_First] = admins [_Last] = supervisor End Enum
或者,您可以编写函数以返回枚举值的数组。
Enum ruleEnum
admins
manager
Users
supervisor
[_First] = admins
[_Last] = supervisor
End Enum
Function getRuleEnumArray()
getRuleEnumArray = Array(admins, manager, Users, supervisor)
End Function
Sub Tests()
Dim n As Long
For n = ruleEnum.[_First] To ruleEnum.[_Last]
Debug.Print getRuleEnumArray(n), "Test: For n = [_First] To [_Last]"
Next
For n = LBound(getRuleEnumArray) To UBound(getRuleEnumArray)
Debug.Print getRuleEnumArray(n), "Test: For n = LBound To UBound"
Next
Dim item As Variant
For Each item In getRuleEnumArray
Debug.Print item, "Test: For Each"
Next item
End Sub
注意:您可以通过右键单击“对象浏览器”并选择“显示隐藏的成员”来查看枚举的隐藏成员。
答案 1 :(得分:0)
您也可以执行类似的操作(或使用上述方法填充字典,突出显示字典的用途,而不是人口总数)
Public dicEnums As Scripting.Dictionary
Public Sub set_enums()
Set dicEnums = New Scripting.Dictionary
dicEnums.Add "Admin", 1
dicEnums.Add "Sales", 2
dicEnums.Add "HR", 3
dicEnums.Add "Production", 4
End Sub
然后可以像这样访问
? dicEnums("Admin")
1
? join(dicEnums.Items(),"_")
1_2_3_4
? join(dicEnums.Keys(),"_")
Admin_Sales_HR_Production
或将组合的.keys()
设置为.list
Private Sub UserForm_Click()
If dicEnums Is Nothing Then
set_enums
Else
If dicEnums.Count = 0 Then
set_enums
End If
End If
Me.ComboBox1.List = dicEnums.Keys()
End Sub