2011-03-17 13 views
6

Estoy buscando para hacer algo como lo siguiente:VBA lista de argumentos de funciones seleccionar

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


    End Function 

Cuando el usuario obtiene una lista desplegable para vArg3 cuando lo llaman. Esto sería similar a la siguiente:

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

Dónde vbTextCompare se puede elegir de una lista o argumentos pre-definida para la función.

Gracias

Respuesta

11

Esto es lo que se conoce como una enumeración. Aquí está un ejemplo rápido:

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 

esta forma se consigue el efecto deseado 'desplegable' que busca cuando se llama a la función dentro del editor de VBA. Sin embargo, si llamara a 'GetDrinkSpecial' desde una fórmula de celda de Excel, no tendrá acceso a la enumeración, y tendría que pasarle específicamente el valor largo de la enumeración.

+1

Me ganaste. Consulte aquí para obtener más información: http://www.cpearson.com/excel/Enums.aspx – mwolfe02

+1

También debo señalar que una "enumeración" es solo una etiqueta para un número entero. Todavía es posible pasar a través de "valores ilegales" como 57 a través de un parámetro de función enumerado, de ahí que Fink tenga el Case Else incluido aquí. –

+1

Merece la pena recordar que un Enum es un _long_ entero, según el sitio web de Pearson: http://www.cpearson.com/excel/Enums.aspx. –

2

No exactamente de la forma en que lo solicitó.

En primer lugar, se debe definir una "Public Enum" para las opciones posibles en un módulo (que puede ser el mismo módulo, siempre que no es un módulo de clase)

Public Enum myFuncEnum 
    OPTION_A 
    OPTION_B 
    OPTION_C 
End Enum 

Luego, en la Función definición que debe tener:

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

End Function 

Recuerde que usted debe comparar con vArg3 OPTION_A, OPTION_B y OPTION_C, en lugar de "A", "B" y "C". Por cierto, OPTION_A, OPTION_B, etc. pueden renombrarse para que tengan más sentido, pero deben ser únicos a lo largo del proyecto.

Cuestiones relacionadas