我在VBA中声明了一个枚举
Enum myEnum
valA = 3
valB = 17
valC = 20
End Enum
我想要一个接受此枚举指定的值的任意组合的函数,并在输入时使用Intellisense。即,它提示我可以输入的值。
现在,如果我可以选择我的Enum中的值为2的幂,那么我可能会像Chip Pearson在his section on Composite Values中所建议的那样做,即
Function myFunction(val As myEnum)
'...
End Function
用法
Debug.Print myFunction(valA + valB) 'with intellisense
然而,我的枚举不遵循这种模式,因此我无法想出辨别valA + valB
是否输入,或valC
。因此,我想知道:
有没有办法将数组/未确定数量的变量传递给函数,同时仍然使用Intellisense建议可能的值?
答案 0 :(得分:2)
不,没有。标记枚举完全使用2的幂。
p <- ggplot(data = tips %>%
group_by(time, sex, day) %>%
summarize(total_bill = mean(total_bill)),
aes(x = time, y = total_bill)) +
geom_bar(stat = "identity") +
facet_wrap(sex ~ day, scales = "free_x") +
theme(axis.text.x = element_text(angle = 90))
ggplotly(p)
这样做的原因是,在给定复合值的情况下,它们允许您使用按位逻辑来确定哪些位“打开”,例如Public Enum Foo
V1 = 2 ^ 0
V2 = 2 ^ 1
V3 = 2 ^ 2
V4 = 2 ^ 3
V5 = 2 ^ 4
'...
End Enum
,它只能是5
:
4 + 1
与already mentioned一样,另一种方法可能是使用Power 2^5 2^4 2^3 2^2 2^1 2^0
Value 32 16 8 4 2 1
Bit 0 0 0 1 0 1
参数,但这只能是ParamArray
,并且只能传递Variant
,不仅意味着你失去了智能感知,你也失去了传递参数值ByRef
的语义安全性(好吧,你的代码隐含传递它ByVal
)。
因此,要么想出一种方法来“映射”单个“魔术底层值”枚举成员标记枚举成员(权限为2),或者您放弃智能感知。
ByRef
然后你可以在拉出映射值后将它们组合起来:
Private Function GetFlag(ByVal value As MyEnum) As MyFlagEnum
Static converter As Scripting.Dictionary
If converter Is Nothing Then
Set converter = New Scripting.Dictionary
With converter
.Add MyEnum.valA, MyFlagEnum.ValueA
.Add MyEnum.valB, MyFlagEnum.ValueB
.Add MyEnum.valC, MyFlagEnum.ValueC
.Add MyEnum.valD, MyFlagEnum.ValueD
.Add MyEnum.valE, MyFlagEnum.ValueE
End With
End If
GetFlag = converter(value)
End Function
Debug.Print MyFunction(GetFlag(valA) + GetFlag(valB)) ' intellisense everywhere!
取MyFunction
值。
如果基础值具有特定含义并且它们被刻在石头上并且MyFlagEnum
需要使用它们,则需要另一个函数来将单个FlagEnum值“展开”为单独的“MyEnum”值:
MyFunction
然后再次使用该功能与单个未合并值。因此,Private Function GetFromFlag(ByVal value As MyFlagEnum) As MyEnum
Static converter As Scripting.Dictionary
If converter Is Nothing Then
Set converter = New Scripting.Dictionary
With converter
.Add MyFlagEnum.ValueA, MyFlagEnum.valA
.Add MyFlagEnum.ValueB, MyFlagEnum.valB
.Add MyFlagEnum.ValueC, MyFlagEnum.valC
.Add MyFlagEnum.ValueD, MyFlagEnum.valD
.Add MyFlagEnum.ValueE, MyFlagEnum.valE
End With
End If
GetFromFlag = converter(value)
End Function
需要做的第一件事就是确定单个标志是“on”,然后MyFunction
每个标志以获取单个非标记枚举值。
这应该是有用的:
GetFromFlag