Я знаю, что в большинстве других языков вы можете написать выражение if (ptr == NULL || ptr->foo()) {something bad happened}
, чтобы проверить как действительность переменной, так и тест, который вы хотите выполнить. VBA не позволяет вам сделать это. Поэтому я ломаю голову над тем, чтобы найти способ написать следующий код без 1) использования перехвата ошибок в качестве средства условного ветвления и 2) не дублирования кода.
Type Vector
vData() as Variant
vSize as Long
End Type
Sub add(v as Vector, elem as Variant)
Dim oldSize as Long
if v.vSize = 0 Or UBound(v.vData) >= v.vSize then
oldSize = v.vSize
ReDim Preserve v.vData(0 to (oldSize * 2 + 1))
v.vData(oldSize) = elem
v.vSize = v.vSize + 1
else
v.vData(v.vSize) = elem
v.vSize = v.vSize + 1
end if
End Sub
Теперь этот код обработает sh на линии UBound независимо от того, равен ли vSize 0 или нет (если vData никогда не был Dim'd). Единственный другой способ, который я вижу, это сделать дополнительный оператор elseif для проверки UBound, но это дублирует код удваивания размера вектора.
В случае, если вы думаете, что это дубликат: VBA Short-Circuit `And` Альтернативы . Это говорит об альтернативах операторам AND (не или). Вложенные if (или операторы AND) не дублируют код, как OR.