2017-01-11 21 views
8

Pochodzę z pięknego świata Obj C, opartego na języku programowania C, i zakochałem się w szukaniu dziwnych sposobów na zaoszczędzenie przestrzeni. Jednak ja przejrzałem tyle dokumentacji jak mogę i nie mogę znaleźć nic soczyste na VBA, który skróci tę składnię:Czy VBA ma trójskładnikowego operatora?

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

W Obj C i naturalnie C, jestem bardzo obeznany z w ten sposób:

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

jest to bardzo podobne do tego, co większość innych langagues użyciu, niektóre mogą używać operatorów logicznych ekstra jak != lub == ale pozostawia mnie optymistyczne. Być może nie zajrzałam we właściwe miejsca, jeśli tak jest, PROSZĘ daj mi znać gdzie otrzymasz swoją dokumentację.

TLDR, czy możemy skrócić If/Then/Else do jednego wiersza kodu w VBA? Jest to wyjątkowo przydatne, gdy "Do Somethings" to nic innego jak ustawienie pojedynczego parametru dla innej zmiennej lub włączenie/wyłączenie przycisku.

+0

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

+1

VBA nie ma prawdziwego operatora trójskładnikowego. Istnieje funkcja 'IIf' * *, ale dodajesz narzut związany z wywołaniem funkcji, co daje *** zarówno zmniejszoną czytelność, jak i wydajność. – Comintern

+0

Nie jest również zwarty. –

Odpowiedz

9
Sub test() 

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

End Sub 
+0

Więc musisz najpierw ustawić zmienną na funkcję? To niezręczne. Miałem nadzieję, że będzie to doświadczenie "gotowe do użycia". Dziękuję za szybką odpowiedź. Będę musiał zajrzeć do tego w oparciu o opinie w komentarzach powyżej. – soulshined

+1

@soulshined Nie musisz ustawiać zmiennej na funkcję; 'IIF' jest wbudowany w VBA. Działa w dużej mierze podobnie do operatora trójskładnikowego w C, jednak jak inni zauważyli, nie ma zwarcia i jest to wywołanie funkcji. Tutaj używa twojego przykładu: 'IIF (boolVar," Yup, tis true "," No, tis false ")'. – Blackhawk

+0

Tak, zdałem sobie sprawę, że po testowaniu @Backhawk za późno, aby edytować komentarz: / – soulshined

11

najbliżej funkcja jest Iif()

IIf(expr, truepart, falsepart) 

ale:

  • nie można mieć swoje oddziały prostu działa kod, podczas gdy trzeba przypisać jej wartość powrotną do jakiejś zmiennej

  • nie powoduje zwarcia

    zawsze ocenia obie gałęzie, tak że należy jeden z nich zawiedzie, nawet jeśli nie są „prawdziwe” jeden, oświadczenie rzucał błąd i tak

Więc najbardziej przypominający jest stwierdzenie:

If boolVar Then sub1 Else sub2 

gdzie:

  • boolVar jest AB oolean typ zmiennej

  • sub1 i sub2 są dwie różne kanapki/funkcje na miano

0

Jako alternatywę można utworzyć następującą funkcję publiczną w module:

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

tej pory pracuje dla mnie.