2011-03-17 135 views
6

我希望做类似如下:VBA函数参数列表中选择

Public Function myFunc(vArg1 as string, vArg2 as string, vArg3 as ["A","B","C"]) 


    End Function 

当用户得到一个下拉列表vArg3当他们打电话吧。这将是类似如下:

  Public Sub Main() 
       Call StrComp("A", "B", vbTextCompare) 
      End Sub 

哪里vbTextCompare可以从一个预先定义的列表或参数的函数来选择。

谢谢

回答

11

这就是所谓的枚举。下面是一个简单的例子:

Public Enum DayOfWeek 
    Monday = 1 
    Tuesday = 2 
    Wednesday = 3 
    Thursday = 4 
    Friday = 5 
    Saturday = 6 
    Sunday = 7 
End Enum 

Public Function GetDrinkSpecial(day As DayOfWeek) As String 

    Select Case day 
     Case DayOfWeek.Monday 
      GetDrinkSpecial = "$1 Tap Domestics" 
     Case DayOfWeek.Tuesday 
      GetDrinkSpecial = "2 for 1 Rail Mixers" 
     Case DayOfWeek.Wednesday 
      GetDrinkSpecial = "$2 You-Call-Its" 
     Case DayOfWeek.Thursday 
      GetDrinkSpecial = "$1 Bush Bottles" 
     Case DayOfWeek.Friday 
      GetDrinkSpecial = "$3 Greenies" 
     Case DayOfWeek.Saturday 
      GetDrinkSpecial = "No Specials, Doh!" 
     Case DayOfWeek.Sunday 
      GetDrinkSpecial = "No Specials, Doh!" 
     Case Else 
      GetDrinkSpecial = "No Specials, Doh!" 
    End Select 
End Function 

Public Sub TestIt() 

    MsgBox GetDrinkSpecial(Monday) 
    MsgBox GetDrinkSpecial(Tuesday) 
    MsgBox GetDrinkSpecial(Wednesday) 
    MsgBox GetDrinkSpecial(Thursday) 
    MsgBox GetDrinkSpecial(Friday) 
    MsgBox GetDrinkSpecial(Saturday) 
    MsgBox GetDrinkSpecial(Sunday) 
End Sub 

这将让你在寻找调用VBA编辑器中功能时所需的“下拉”效应。但是,如果您要在Excel单元格公式中调用“GetDrinkSpecial”,则无法访问枚举,并且需要专门将枚举的长整型值传递给枚举。

+1

你打败了我。在这里看到更多的信息:http://www.cpearson.com/excel/Enums.aspx – mwolfe02 2011-03-17 14:29:14

+1

我还应该指出,“枚举”只是一个整数的标签。仍然有可能通过枚举函数参数传递57这样的“非法值”,因此为什么Fink在这里包含Case Else。 – 2011-03-17 14:31:36

+1

值得一提的是,根据Pearson的网站,Enum是_long_整数:http://www.cpearson.com/excel/Enums.aspx。 – 2011-03-17 17:20:02

2

不完全是你问的方式。

首先,你必须定义一个“公共枚举”一个模块中可能的选项(可以是相同的模块,只要它不是一个类模块)

Public Enum myFuncEnum 
    OPTION_A 
    OPTION_B 
    OPTION_C 
End Enum 

然后,在功能定义你应该有:

Public Function myFunc(vArg1 as string, vArg2 as string, vArg3 as myFuncEnum) 

End Function 

请记住,你必须用OPTION_A,OPTION_B和OPTION_C比较,而不是 “A”, “B” 和 “C” vArg3。顺便说一下,OPTION_A,OPTION_B等可能会被重新命名以更有意义,但它们在整个项目中应该是唯一的。