O
IIf()
função e a função IIf()
afirmação são animais fundamentalmente diferentes. Infelizmente, eles são quase impossíveis de distinguir. E, no entanto, é importante ser capaz de fazê-lo. Por quê?
Porque esta função IIf() é um erro de tempo de execução esperando para acontecer:
IIf(Attempts = 0, 0, Successes / Attempts)
Enquanto esta instrução IIf() retornará com segurança um valor mesmo se
Attempts = 0
:IIf(Attempts = 0, 0, Successes / Attempts)
Então, você consegue identificar a diferença entre os dois?
Diferenciando-os
Se você não consegue identificar a diferença entre as duas amostras acima, é porque não há diferença.
O
IIf()
função parece idêntico ao IIf()
declaração. A diferença está em como – ou mais precisamente, onde– eles são avaliados.
- A função IIf é membro da biblioteca padrão VBA.Interaction.
- A declaração do IIf é avaliado pelo serviço de expressão do mecanismo de banco de dados Jet/ACE (acees.dll).
Eu escrevi sobre as diferenças entre código e expressões aqui:
Expressões vs. CódigoQuando código não é código? Quando é uma expressão. Qual é a diferença e quem realmente se importa? Vamos explorar.


A diferença fundamental entre a função IIf() e a instrução IIf()
Três palavras:avaliação de curto-circuito.
- A declaração do IIf tem.
- A função IIf não.
O que é avaliação de curto-circuito?
Na avaliação de curto-circuito, o código avalia apenas as expressões necessárias para determinar o resultado.
A instrução IIf e a função IIf recebem três argumentos:
- expr: uma condição booleana
- truepart: o resultado a ser retornado se expr é Verdadeiro
- parte falsa: o resultado a ser retornado se expr é falso
Com a instrução IIf, apenas dois desses argumentos são avaliados:o expr e–dependendo do resultado da expr– ou a truepart OU a parte falsa .
Com a função IIf, todos os três argumentos DEVEM ser avaliados antes mesmo de serem passados para a função.
Por que é importante
Vamos voltar ao código de exemplo original:
IIf(Attempts = 0, 0, Successes / Attempts)
O que acontece se o valor de Tentativas é zero?
IIf declaração
- A exp avalia como Verdadeiro.
- A truepart avalia para
0
. - A instrução retorna
0
.
IIf função
- A expr avalia como Verdadeiro.
- A truepart avalia para
0
. - A parte falsa avalia como #ERROR#:Divisão por zero
A função version retorna um erro porque foi forçado a avaliar tanto a truepart e a falsepart expressões.
Onde está IIf Tratada como uma declaração?
SE é avaliado como uma declaração nos seguintes locais:
- Consultas
- Propriedades de formulário/relatório/controle (por exemplo, um TextBox ControlSource)
- A função Access Application.Eval()
Para obter mais detalhes, incluindo como testar definitivamente se IIf está sendo tratado como uma instrução ou função – leia meu artigo sobre as diferenças entre expressões e código:Expressões vs. Código .
Referências externas
Função IIf (Visual Basic for Applications)Tópico de referência do Office VBAMicrosoft Docso365devx