2011-07-10 984 views
10

Estoy usando vba con Excel 2007 y estoy escribiendo código para un módulo de clase.¿Cómo funcionan los parámetros opcionales en Let/Get Properties?

1) ¿Está el siguiente código posible? ...
Básicamente tengo dos enumeraciones, llamarlos eDATASET y eDATATSUBSET. Un valor particular de eDATASET debe desencadenar una asignación del parámetro opcionalmente pasado en una propiedad Let. Algo como esto:

Public Property Let foo(Optional ByVal lngSubSet as eDATASUBSET, _ 
         ByVal lngSuperSet as eDATASET) 
    Select Case lngSuperSet 
     Case eDATASET.abc, eDATASET.def 
      mlngBar = lngSuperSet 
     Case eDATASET.xyz 
      '// if lngSubSet not passed, trigger error code... 
      mlngBar = lngSubSet 
    End Select 
End Property 

2) ¿Cómo puedo incluso pasar un parámetro opcional para una propiedad se puede escribir cuando se llama al objeto ...
Aparte de lo aparentemente imposible la colocación de los parámetros Optional (en comparación con la opción parámetros en funciones y subs), tengo problemas para encontrar documentación sobre esta función. La ayuda de vba dice esto:

Opcional. Indica que un argumento no es obligatorio. Si se utiliza, todos los argumentos posteriores en arglist también deben ser opcionales y declararse utilizando la palabra clave Optional. Tenga en cuenta que no es posible que el lado derecho de una expresión de Property Let sea Opcional.

y lo siguiente desde vbusers.com. Tampoco explican mucho en la forma de uso. Así que ¿Cómo puedo pasar el parámetro opcional cuando se llama al objeto a partir de un módulo de código ... oObj.foo = ???

3) ¿Hay una mejor manera de hacer esto? ...
que tienen un conocimiento básico de programación orientada a objetos (al menos en cómo se implementa en vba). ¿Hay una forma mejor de aceptar condicionalmente un parámetro en un objeto?

+0

posible duplicado de [Let property of VBA class modules - ¿es posible tener múltiples argumentos?] (Http: // stackoverflow.com/questions/13823367/let-property-of-vba-class-modules-is-it-possible-to-have-multiple-arguments) –

Respuesta

10

1) Sí su código es posible.

2) Se trata de cómo se pasa un argumento:

Suponiendo myObject es un objeto de su clase:

myObject.foo(lngSubSet) = lngSuperSet 

La colocación de los argumentos en el arglist sí que parece raro, pero eso es VBA para ti. Supongamos que tiene 4 argumentos, dos de los cuales son opcionales, más el lado derecho. Debe colocarlas como esto:

Public Property Let foo(arg1, arg2, Optional arg3, Optional arg4, _ 
         RHS) 

y utilizarlos como esto (asumiendo que usted está optando de arg4):

myObject.foo(arg1,arg2,arg3) = RHS 

3) ¿Hay una mejor manera de hacer esto? Siempre lo hay, dependiendo de a quién le preguntes. Puede tener su argumento lngSubSet como una propiedad separada por completo. Así es como tiendo a hacerlo. Pero en su caso, su forma de hacer las cosas puede funcionar bien para usted. No sé, es en gran parte una cuestión de gusto y depende de su aplicación específica.

+0

en caso de que se haya preguntado acerca de ++ ++ [aquí] (http: // stackoverflow.com/questions/13823367/let-property-of-vba-class-modules-is-it-possible-to-have-multiple-arguments/26488170#26488170) y [aquí] (http: //chat.stackexchange .com/rooms/14929/vba) –

+1

¡Ja! Sí, de hecho me preguntaba qué demonios estaba pasando. –

Cuestiones relacionadas