Dicas do OsmarJr

Diferenças entre Empty, False, Missing, Null, Nothing, vbNullString, Zero e SCZ?


O VBA tem diversas formas de falar sobre algo que não está lá!!!

 

By JasonM: http://www.ushimitsudoki.com/

Empty (Vazio)
É tanto uma palavra-chave quanto um valor especial que pode ser contido por um Variant. Ela indica um Variant não inicializado. Não é o mesmo que Null. Empty é raro quando comparado com os outros conceitos discutidos neste artigo e provavelmente não será muito encontrado “na vida real”. O VBA tem a função IsEmpty para dizer se a variável está vazia.

False (Falso)
False é uma palavra-chave para valores Booleanos. Em um contexto numérico é interpretado como valor 0. em um contexto de string é interpretado como a string “False”.

Este não é um bom estilo, mas...

Public Function FalseTest()
Dim strX As String
Dim intX As Integer

    strX = Left$(False, 1)
    intX = 100 * False

    Debug.Print "strX: " & strX
    Debug.Print "intX: " & intX

    If (False = 0) Then
       Debug.Print "False igual a 0"
    End If

    If (False = "False") Then
       Debug.Print "False igual a 'False'"
    End If
End Function


?FalseTest
strX: F
intX: 0
False igual a zero
False igual a 'False'


Provavelmente False não deva ser utilizado desta forma. Use com os valores Booleanos para evitar confusão.

Missing (Ausente)
Na verdade é errado se falar em Missing, já que não é nem uma palavra-chave nem um valor. O VBA tem uma função IsMissing que devolve True se um argumento Variant opcional não for passado para um procedimento. IsMissing não funciona com tipos de dados simples, apenas com Variants.

Null
Null, como Empty, é tanto uma palavra-chave quanto um valor especial que pode ser contido por um Variant. Indica que a variável não contém dados válidos. Normalmente causa problemas ao ler um campo sem dados de uma tabela. Null não é igual a nada, nem a si mesmo!. O VBA tem a função IsNull para dizer se uma variável contém Nulo e a função Nz para devolver um valor esperado (como zero ou “”) se uma variável contiver Nulo. Talvez a melhor forma de pensar sobre Nulo é imaginá-lo como “Desconhecido”.

Nothing (Nada)
Nothing é uma palavra chave usada para quebrar a referência entre uma variável de objeto e o próprio objeto. Quando nenhuma variável referencia um objeto os recursos de memória e sistema são liberados.
Ainda que o Access/VBA teoricamente tratem esta “quebra de referência” automaticamente quando uma variável sai do escopo, é considerado uma boa prática o programador fazer isto explicitamente, usando Set objMeuObjeto = Nothing.

vbNullString
vbNullString é uma constante tratada de forma especial pelo VBA. O uso primário de vbNullString é permitir a passagem de um ponteiro nulo para uma DLL. Rotinas em C/C++ (muitas DLLs são escritas em C/C++) muitas vezes requerem um ponteiro nulo mas o VBA não. A constante vbNullString resolve o problema.
Um uso secundário (e talvez mais comum) é usá-la como sinônimo para uma string de comprimento zero. Ou seja, onde você usaria “” no seu código, pode usar vbNullString em substituição. Em nível mais baixo, vbNullString não é a mesma coisa que “”, mas o VBA é esperto o bastante para saber como ela está sendo usada e interpretá-la para você. Na verdade isso é tão bem feito que é mais eficiente usar vbNullString do que “”.

zero (0)
Zero é 1-1. Está aqui apenas para lembrá-lo que nenhuma destas coisas é exatamente o mesmo que zero e vice-versa.

SCZ
SCZ é uma abreviatura para string de comprimento zero, que alguns preferem chamar de string vazia. SCZs são muito encontradas em código como “” (ainda que, como dito acima, vbNullString seja uma escolha melhor).
A fonte de erros mais comum é a confusão entre SCZ e Null, normalmente ao ler um campo e esperando receber uma string e o campo não contém dados, devolvendo Null. Isto levanta o erro, bem familiar: “Uso inválido de Null”.
Por padrão, deixar um campo vazio em uma tabela, o valor armazenado será Null. Este comportamento pode ser alterado mudando-se a propriedade Permitir comprimento zero do campo.

E, finalmente, uma pequena função de teste. Primeiro tente descobrir quais serão os resultados e, depois, execute-a e veja se estava certo:


Public Function Test(Optional x As Variant)
Dim y As Variant
Dim z As Variant

    z = Null
    Debug.Print "  " & vbTab & "Empty" & vbTab & "Null" & vbTab & "Missing"
    Debug.Print "x:" & vbTab & IsEmpty(x) & vbTab & IsNull(x) & vbTab & IsMissing(x)
    Debug.Print "y:" & vbTab & IsEmpty(y) & vbTab & IsNull(y) & vbTab & IsMissing(y)
    Debug.Print "z:" & vbTab & IsEmpty(z) & vbTab & IsNull(z) & vbTab & IsMissing(z)

'Erro de tipos incompatíveis
'If (x = y) Then
'     Debug.Print "x = y"
'End If

'Erro de tipos incompatíveis 'If (x = z) Then
'     Debug.Print "x = z"
'End If


    If (y = z) Then
       Debug.Print "y = z"
    End If

'Esta é uma pegadinha
    If (z = Null) Then
       Debug.Print "z = Null"
    End If

    If (Null = Null) Then
       Debug.Print "Null = Null"
    End If

    If (Null = vbNullString) Then
       Debug.Print "Null = vbNullString"
    End If

    If (Null = 0) Then
       Debug.Print "Null = 0"
    End If

'Outra pegadinha
    If Not(Null) Then
       Debug.Print "Not Null"
    End If
End Function

 

Home

Contato | Copyright©Osmar José Correia Júnior | 24-Nov-2005 18:23
Hosted by www.Geocities.ws

1