Как работают дополнительные параметры в свойствах Let/Get?

Я использую vba с Excel 2007 и пишу код для модуля класса.

1) Возможно ли следующий код?...
По сути, у меня есть две перечисления, назовите их eDATASET и eDATATSUBSET. Особое значение из eDATASET должно инициировать назначение из необязательно прошедшего параметра в свойстве Let. Что-то вроде этого:

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) Как мне передать необязательный параметр для свойства записи при вызове объекта...
Помимо по-видимому обратного размещения параметров Optional (по сравнению с необязательными параметрами в функциях и подсистемах), у меня возникли проблемы с поиском документации по этой функции. Справка vba говорит следующее:

Дополнительно. Указывает, что аргумент не требуется. Если используется, все последующие аргументы в arglist также должны быть необязательными и объявляться с использованием ключевого слова Optional. Обратите внимание, что правая сторона свойства не допускается. Позвольте выражению быть необязательным.

и следующее из vbusers.com. Ничего не объясняют в способе использования. Итак, как мне передать необязательный параметр при вызове объекта из модуля кода... oObj.foo = ???

3) Есть ли лучший способ сделать это?...
У меня есть основное понимание oop (по крайней мере, в том, как оно реализовано в vba). Есть ли лучший способ условно принять параметр в объект?

Ответ 1

1) Да ваш код возможен.

2) Вот как вы передаете аргумент:

Предполагая, что myObject является объектом вашего класса:

myObject.foo(lngSubSet) = lngSuperSet 

Размещение аргументов в arglist действительно выглядит странно, но это VBA для вас. Скажем, у вас есть 4 аргумента, два из которых являются необязательными, плюс ваша правая сторона. Вы бы разместили их так:

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

и использовать их как это (при условии, что вы отказываетесь от arg4):

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

3) Есть ли лучший способ сделать это? Всегда есть, в зависимости от того, кого вы спрашиваете. Вы можете иметь свой аргумент lngSubSet как отдельное свойство полностью. Вот как я это делаю. Но в вашем случае ваш способ сделать что-то может сработать для вас. Я не знаю, это во многом вопрос вкуса и зависит от вашего конкретного приложения.