【问题标题】:VBA: Non exclusive ENUM or Ignore Type 13 error?VBA:非独占 ENUM 或忽略类型 13 错误?
【发布时间】:2016-01-23 02:33:04
【问题描述】:

我希望在调用函数 func1 时显示可能值的列表。我找到了一种通过 ENUM 在 VBA 中实现此目的的方法,但这在工作表中不起作用。所以我创建了一个函数 e ,它将某些字符串转换为正确的枚举值。不幸的是,我找不到使用字符串或枚举值调用此函数 func1 而不会出错或失去功能的方法。到目前为止,这是我所得到的:

Enum eLanguages
    evEnglish = 2
    evItalian = 3
    'and so on
End Enum

Function e(vString)
Select Case vString
    Case "english", "eng", "en", "e"
        e = evEnglish
    Case "italian", "italien", "it", "i"
        e = evItalian
    Case Else
        e = vString '(= will keep the value if it's already a number)
End Select
End Function

选项 1:在 VBA 中键入时显示可能值的列表,但不适用于字符串输入

Function func1(var As eLanguages)
func1 = e(var)
End Function

Sub test1()
MsgBox func1(evEnglish)     'Will result in 2 (through the enum and the e function)
MsgBox func1("e")           'Type 13 error
End Sub

选项 2:给出正确的结果,但我没有得到 VBA 中可能值的列表

Function func2(var)
func2 = e(var)
End Function

Sub test2()
MsgBox func2(evEnglish)     'Will result in 2 (through the enum and the e function)
MsgBox func2("e")           'Will result in 2 (through the e function)
End Sub

注意:像这样调用两个函数中的任何一个都会得到正确的结果,但显然我并不热衷于每次调用函数时都必须编写 e(): MsgBox func1(e("e"))

那么您对如何忽略 Type 13 错误或如何在 ENUM 声明中包含“允许的任何字符串”选项有任何建议吗?

提前致谢。

【问题讨论】:

  • 什么是eLanguages?你需要解释你在做什么。似乎缺少拼图。
  • 对不起,eLanguages 是枚举。
  • 好的 -- e 是什么?由于您的问题是关于当您以某种方式调用 e 时会发生什么,因此几乎不可能在不知道 e 究竟是什么的情况下回答。
  • 我编辑了原帖。如果将字符串而不是枚举值传递给函数,则“E”只是分配枚举值之一。重点是为用户提供多种选择语言的选项,而无需查找代码以获得确切的措辞。
  • 如果这是你想要的,为什么不让e 返回一个字符串?枚举的元素只是整数的别名(VBA 程序员使用的别名,而不是使用 Excel 应用程序的人),所以返回 evEnglish 返回 2。

标签: vba enums intellisense


【解决方案1】:

@CinyMeister 的想法很有趣。一个细微的变化 - 使 both 参数可选并使用if - then - else,与IsMissing 函数一起将两个参数合并为一个:Function func3(Optional x As eLanguages, Optional y As String ) 变暗变体 If IsMissing(x) Then

        var = y
    Else
        var = x
    End If
    func3 = e(var)
End Function

Sub test()
   MsgBox func3(evEnglish)
   MsgBox func3(, "it")
End Sub

即使有大量参数,这种事情也会起作用——当您在 VBA 编辑器中调用该函数时,您可以通过反复按逗号键来切换选项。枚举给出的参数将唤起智能感知下拉菜单。其他参数有望具有描述性名称。

【讨论】:

    【解决方案2】:

    我刚刚有了另一个想法,但我认为它也不会作为一个超级优雅的解决方案。

    我可以有 2 个函数,一个用于 Excel,一个用于 VBA。像这样:

    Function funcV(var As eLanguages)
    funcV = SOMETHING
    End Function
    
    Function funcE(var)
    funcE= funcV(e(var)) '(which is "SOMETHING")
    End Function
    

    问题是我是否会记得我的许多函数中的哪一个具有姊妹函数。没有办法将 Type 13 错误捕获为“on error”事件并自动重定向,是吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2019-08-28
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多