函数使用intellisense接受多个枚举

时间:2017-08-15 15:23:55

标签: vba excel-vba enums intellisense user-defined-functions

我在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建议可能的值?

1 个答案:

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