• Nenhum resultado encontrado

USANDO O PESQUISADOR DE OBJETO (OBJECT BROWSER)

Antes de fazermos uso do IsNumeric, lhe mostremos como achá-lo usando o Pesquisador de Objetos. O Pesquisador de Objetos é útil para procurar por comandos. Para fazer isto, vá para o módulo Visual Basic e selecione Exibir, Pesquisador de Objetos (ou F2 ou clicando no botão-ícone ). Você verá o Pesquisador de Objetos exibido da seguinte maneira:

Selecione VBA na caixa de listagem de cima esquerda e Information na caixa de listagem de baixo lista direita. Uma descrição curta do item destacado aparecerá no

o método ou propriedade selecionada será mostrada. Freqüentemente a ajuda fornecerá vários exemplos usando o método ou propriedade selecionada.

Destaque a palavra IsNumeric na caixa Membros de ‘Information’ e clique sobre o botão ponto de interrogação para mostrar a informação de ajuda.

f u n d o d e s t e p a i n e l .

caixa

Na Membros de ‘Information’ , na janela acim a , você verá as diferentes

j e t o Information da i b l i o teca

propriedades e métodos que podem ser usa dos para esta c l asse de o b

b VBA. Se você clicar sobre um a pr

s q u e r d o s uperior do painel acim a, a Ajuda do Visual Basic sobre opriedade e daí clicar no ponto de i n t e r r o g a ç ã o n o c a n t o e

Lição #06 – Escrevendo Macros no Visual Basic Editor do Excel 86

Como você pode ver da informação de ajuda (Comentário), ela retorna True se a célula for numérica e False se não for. Também, a informação de ajuda fornece a sintaxe a ser usada.

Você pode deixar o Pesquisador de Objetos ativo e simplesmente selecionar Janela no menu do editor VB e selecionar a janela que você gostaria de ativar. Você pode também fechar o Pesquisador de Objetos clicando no botão fechar no canto direito superior da janela.

USANDOIsNumericNA MACRO

O que se segue é macro DividirPor100 modificada para incluir o teste IsNumeric. Note que o uso de identações para agrupar declarações relacionadas. Também, linhas em branco são usadas para melhorar a facilidade de leitura da macro, e comentários foram colocados no final de cada declaração If.

Sub DividirPor100()

' Esta macro divide por 100

If IsNumeric(ActiveCell.Value) Then

'Faça isto desde que a célula seja numérica

If Left(ActiveCell.Formula, 1) = "=" Then

'Faça isto desde que a célula contenha uma equação ActiveCell.Formula = _

"=(" & Mid(ActiveCell.Formula, 2) & ")/100" Else

'Faça isto desde que a célula contenha um número

ActiveCell.Formula = _

"=" & ActiveCell.Formula & "/100" End If 'Fim do teste Se Left

End If 'Fim do teste IsNumericEnd Sub

Note que nós testamos a propriedade de Valor da célula ativa com a função

IsNumeric. Se nós tivéssemos testado a propriedade de Fórmula da célula ativa, células que contêm fórmulas teriam retornado Falso desde que fórmulas são entradas de texto. Quando o teste de IsNumeric for True, são executadas as declarações imediatamente seguintes. Estas são as instruções que dividem números ou fórmulas por 100. Se o teste é Falso isto indica que a célula não contém uma entrada numérica. Nestes casos, a macro pula o bloco de declarações para a declaração End IF que é o fim do teste If de IsNumeric. Como a próxima declaração depois deste End IF é End Sub, a macro pára.

Também note que nós pusemos declarações de comentário em cada uma das linhas de declaração End If. Sempre que você tem muitas declarações If numa macro é melhor documentar as declarações End If com um comentário que lhe conte com qual declaração

If elas estão associadas. Como ilustrado anteriormente, isto é muito fácil fazer. Por favor, note que isso é só porque você rotula End If com uma declaração de comentário que diz que é o fim de uma particular declaração Se, isto não funciona assim. Declarações de comentário são apenas aquelas de comentários. Quando você escrever macro mais complexa, você poderá achar que não tem mais que atarraxar às suas declarações If os comentários.

Quando nós testamos nossa macro em uma célula que contém texto, como a palavra " Fórmula " na nossa planilha de teste, ela funciona exatamente como nós queremos- ela não faz nada. Isto é porque IsNumeric(ActiveCell.Value) retorna o valor Falso quando uma célula contém texto. Isto faz nossa macro pular as declarações que modificam a célula. Quando nós testarmos em células que contêm um número ou uma fórmula, ela também funciona perfeitamente, modificando estas células a serem

Lição #06 – Escrevendo Macros no Visual Basic Editor do Excel 88

divididas por 100. Mas quando nós testamos o macro em uma célula em branco obtemos umas outras das caixas de erro infames do Visual Basic:

Por que isto aconteceu? O teste IsNumeric(ActiveCell.Value) em uma célula em branco deve ter retornado Verdadeiro (True), não Falso (False). Você pode usar as técnicas de depurar ilustradas anteriormente para confirmar isto. O IsNumeric retorna

True numa célula em branco porque uma célula em branco em Microsoft Excel é tratada como sendo igual a zero. E desde que zero é um número, o teste IsNumeric retorna True. Para provar isto, vá para a planilha de teste e entre com a fórmula seguinte na célula B12:"=B5*B10". A célula B5 contém um número, e célula B10 é uma célula em branco. O resultado é zero, que é consistente com o tratar uma célula em branco como um zero.

Assim, nós também precisamos de um teste para ver se uma célula está em branco ou não. Vá para o módulo Visual Basic, selecione Exibir, e daí Pesquisador de Objetos. A opção << todas as bibliotecas >> deverá ser selecionada, e Information selecionada no painel Classes. Olhe as várias propriedades. Você achará uma propriedade chamada

IsEmpty. Selecione-a e dê um clique no ponto de interrogação para descobrir mais sobre ela. Você achará que o teste IsEmpty retorna True se a célula está vazia.

Considerando que nós queremos somente rodar as declarações que modificam os conteúdos de células quando a célula não estiver vazia, nós precisamos "sacudir" a resposta que nós queremos. O Microsoft Excel não faz isto para nós. Por exemplo, o teste

Not retorna True se o teste é falso, e Falso se o teste é verdadeiro. A declaração seguinte na tabela ilustra isto:

IsEmpty(ActiveCell) Not(IsEmpty(ActiveCell)) Célula Contém Retorna Retorna

Entrada Qualquer False True Nenhuma Entrada

True False

O uso dos parênteses com a função Not é opcional. Baseado nisto modificamos a macro para ler:

Sub DividirPor100()

' Esta macro divide por 100

If Not IsEmpty(ActiveCell) then 'Faça isto se a célula não estiver vazia

If IsNumeric(ActiveCell.Value) Then 'Faça isto desde que a célula seja numérica

If Left(ActiveCell.Formula, 1) = "=" Then

'Faça isto desde que a célula contenha uma equação

ActiveCell.Formula = _

"=(" & Mid(ActiveCell.Formula, 2) & ")/100"

Else

'Faça isto desde que a célula contenha um número ActiveCell.Formula = _

"=" & ActiveCell.Formula & "/100" End If 'Fim do teste If Left

End If 'Fim do teste IsNumeric

End If 'Fim do teste Not IsEmptyEnd Sub

Quando testarmos as modificações acima ela funciona para todos os casos!