2017-01-11 3 views
8

Я родом из прекрасного мира Obj C, который основан на языке программирования C, и я влюбился в поиск причудливых способов сэкономить место. Тем не менее, я просмотрел столько документов, сколько я могу и не могу найти что-нибудь сочный на VBA, которая будет укорачивать этот синтаксис:Имеет ли VBA тройной оператор?

If boolVar = True Then 
    'Do something 
Else 
    'Do nothing 
End If 

В Obj C, и, естественно, C, я очень знаком с как это сделать:

boolVar ? "Nope, tis false" : "Yup, tis true" 

Это очень похоже на то, что использовать большинство других langagues, некоторые из них могут использовать дополнительные логические операторы, такие как != или ==, но это оставляет меня оптимистичным. Возможно, я не посмотрел в нужные места, если это так. ПОЖАЛУЙСТА, дайте мне знать, где вы получите свою документацию.

TLDR, можем ли мы сократить If/Then/Else до одной строки кода в VBA? Это очень удобно, когда «Do Somethings» - это не что иное, как установка одиночного параметра другой переменной или включение/отключение кнопки.

+0

[IIf()] (https://msdn.microsoft.com/en-us/library/office/gg264412 (v = office.15) .aspx) –

+1

У VBA нет истинного тернарного оператора. Есть функция 'IIf' * *, но вы добавляете накладные расходы на вызов функции, давая вам *** и *** уменьшенную читаемость и производительность. – Comintern

+0

Его также не закорочен. –

ответ

9
Sub test() 

    Dim x As Long 
    Dim y As Long 
    y = 1 
    x = IIf(y = 1, 1, 2) 

End Sub 
+0

Значит, вам нужно сначала установить переменную в функцию? Это неудобно. Я надеялся, что это будет «из коробки». Спасибо за быстрый ответ. Мне нужно будет больше взглянуть на него, основываясь на отзывах в комментариях выше. – soulshined

+1

@soulshined Вам не нужно устанавливать переменную в функцию; 'IIF' встроен в VBA. Он работает в основном аналогично тернарному оператору в C, однако, как утверждают другие, он не замыкается и это вызов функции. Здесь он использует ваш пример: 'IIF (boolVar,« Yup, tis true »,« Nope, tis false »)'. – Blackhawk

+0

Да, я понял, что после тестирования @Blackhawk слишком поздно редактировать комментарий: / – soulshined

11

ближайшая функция Iif()

IIf(expr, truepart, falsepart) 

но:

  • вы не можете иметь филиалы просто работающие код, в то время как вы должны присвоить возвращаемое значение некоторой переменной

  • не имеет короткого замыкания

    всегда оценивает обе ветви, так что если один из них не получится, даже если не «реальным» один, то оператор будет выдавать ошибку в любом случае

Таким образом, наиболее напоминающую заявление является:

If boolVar Then sub1 Else sub2 

где:

  • boolVar является аб oolean тип переменной

  • sub1 и sub2 две различные подводные лодки/функции, чтобы назвать

0

В качестве альтернативы вы можете создать следующую публичную функцию в модуле:

Public Function iff(expr, trueR, falseR) As Variant 
    If expr Then iff = trueR Else iff = falseR 
End Function 

До сих пор работает на меня.

Смежные вопросы