VBA如何获取所有枚举

时间:2018-12-04 08:32:04

标签: vba enums

我的VBA项目中有一个枚举类:

Enum ruleEnum
    admins
    manager
    users
    supervisor
End Enum

现在,我想获取此类的所有枚举值并将其插入到ComboBox中。我希望它能够动态运行,因为将来我可能会制定新的规则。谁让枚举类中的所有规则循环或收集

2 个答案:

答案 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

结果

enter image description here

注意:您可以通过右键单击“对象浏览器”并选择“显示隐藏的成员”来查看枚举的隐藏成员。

enter image description here

enter image description here

答案 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