Evitando conflitos de nomenclatura

Ocorre um conflito de nomenclatura quando você tenta criar ou utilizar um identificador que já tenha sido definido. Em alguns casos, os conflitos de nomenclatura geram erros como "Nome ambíguo encontrado " ou "Declaração duplicada no escopo atual". Os conflitos de nomenclatura que passarem despercebidos podem resultar em erros no código que geram resultados errôneos, principalmente se você não declarar explicitamente todas as variáveis antes de utilizá-las inicialmente.

A maioria dos conflitos de nomenclatura pode ser evitada pela compreensão das características de escopo dos identificadores de dados, objetos e procedimentos. O Visual Basic possui três níveis de escopo: nível de procedimento, nível de módulo privado e nível de módulo público.

Pode ocorrer um conflito de nomenclatura quando um identificador:

•	É visível em mais de um nível de escopo.

•	Possui dois significados diferentes no mesmo nível.

Por exemplo, os procedimentos em módulos separados podem ter o mesmo nome. Portanto, um procedimento chamado MySub pode ser definido em módulos chamados Mod1 e Mod2. Não ocorre nenhum conflito se cada procedimento for chamado somente de outros procedimentos em seu próprio módulo. Entretanto, pode ocorrer um erro se MySub for chamado de um terceiro módulo, sem nenhuma qualificação que faça distinção entre os dois procedimentos MySub.

Para resolver a maioria dos conflitos de nomenclatura, basta preceder cada identificador por um qualificador que consiste no nome do módulo e, se for preciso, um nome do projeto. Por exemplo:

YourProject.YourModule.YourSub MyProject.MyModule.MyVar

O código acima chama o procedimento Sub SeuSub e passa MyVar como um argumento. Você pode utilizar qualquer combinação de qualificadores para diferenciar identificadores idênticos.

O Visual Basic faz a correspondência entre cada referência a um identificador com a declaração "mais próxima" de um identificador correspondente. Por exemplo, se MyID for declarado Public em dois módulos de um projeto (Mod1 e Mod2), você pode, dentro de Mod2, especificar o identificador MyID declarado neste módulo sem qualificação, mas deve qualificá-lo como Mod2.MyID para especificá-lo em Mod1. Isto também é verdadeiro caso Mod2 esteja em um projeto diferente, mas que seja um projeto referenciado diretamente. Entretanto, caso Mod2 esteja em um projeto referenciado indiretamente, ou seja, um projeto referenciado pelo projeto a que você faz referência diretamente, as referências à variável do Mod2 chamada MyID devem ser sempre qualificadas com o nome do projeto. Se você fizer referência a MyID a partir de um terceiro módulo referenciado diretamente, a correspondência se dará com a primeira declaração encontrada, pesquisando-se:

•	Projetos de referência direta, na ordem em que aparecerem na caixa de diálogo Referências do menu Ferramentas.

•	Os módulos de cada projeto. Observe que não há nenhuma ordem inerente aos módulos no projeto.

O nome dos objetos de aplicativos host (por exemplo R1C1 no Microsoft Excel) não podem ser reutilizados em níveis de escopo diferentes.

Dica    Há alguns erros comuns causados por conflitos de nomenclatura, como nomes ambíguos, declarações repetidas, identificadores não-declarados e procedimentos que não foram encontrados. Começando cada módulo com uma instrução Option Explicit para forçar declarações explícitas de variáveis antes do seu uso, você pode evitar conflitos de nomenclatura e erros relacionados aos identificadores.


Chamando procedimentos com o mesmo nome

É possível chamar um procedimento localizado em qualquer módulo no mesmo projeto como módulo ativo da mesma forma como você chamaria um procedimento no módulo ativo. Entretanto, se dois ou mais módulos contiverem um procedimento com o mesmo nome, você deve especificar um nome de módulo na instrução de chamada, como mostra o exemplo a seguir:

Sub Main()

Module1.MyProcedure

End Sub

Caso você atribua o mesmo nome a dois procedimentos diferentes em dois projetos diferentes, deve especificar um nome de projeto ao chamar o procedimento. Por exemplo, o procedimento a seguir chama o procedimento Main no módulo MyModule no projeto MyProject.vbp.

Sub Main()

[MyProject.vbp].[MyModule].Main

End Sub

Observação   Aplicativos diferentes têm nomes diferentes para um projeto. Por exemplo, no Microsoft Access, um projeto é chamado de um banco de dados (.mdb); no Microsoft Excel, ele é chamado de uma pasta de trabalho (.xls)

Dicas para chamada de procedimentos

•	Caso você renomeie um módulo ou projeto, certifique-se de alterar o nome do módulo ou do projeto onde quer que ele apareça em instruções de chamada; caso contrário, o Visual Basic não será capaz de localizar o procedimento chamado. Você pode utilizar o comando Substituir no menu Editar para localizar e substituir texto em um módulo.

•	Para evitar conflitos de nomenclatura entre projetos referenciados, atribua nomes exclusivos aos procedimentos para que você possa chamar um procedimento sem especificar um projeto ou um módulo.


Chamando procedimentos Property

A tabela a seguir lista a sintaxe de chamada dos procedimentos de propriedade:

Procedimento de propriedade	Sintaxe
Property Let	[object.]propname(arguments)] = argument
Property Get	varname = [object.]propname(arguments)]
Property Set	Set [object.]propname[.(arguments)] = varname
Quando você chama um procedimento Property Let ou Property Set, aparece sempre um argumento no lado direito do sinal de igualdade (=).

Quando você declara um procedimento Property Let ou Property Set com múltiplos argumentos, o Visual Basic passa o argumento no lado direito da chamada para o último argumento na declaração Property Let ou Property Set. Por exemplo, o diagrama a seguir mostra como os argumentos na chamada de procedimento Property se relacionam aos argumentos na declaração Property Let:

Na prática, a única finalidade para os procedimentos de propriedade com múltiplos argumentos é criar matrizes de propriedades.


Chamando procedimentos Sub e Function

Para chamar um procedimento Sub de outro procedimento, digite o nome do procedimento e inclua valores para quaisquer argumentos obrigatórios. A instrução Call não é obrigatória, mas, caso seja utilizada, quaisquer argumentos devem ser colocados entre parênteses.

Você pode utilizar um procedimento Sub para organizar outros procedimentos, facilitando a compreensão e a depuração dos mesmos. No exemplo a seguir, o procedimento Sub Main chama o procedimento Sub MultiBeep, passando o valor 56 para o seu argumento. Depois que o MultiBeep for executado, o controle retornará para o procedimento Main, que por sua vez chamará o procedimento Sub Message. Message exibe uma caixa de mensagem; quando o usuário clicar em OK, o controle retornará para Main, que encerrará a execução.

Sub Main()

MultiBeep 56

Message

End Sub

Sub MultiBeep(numbeeps)

For counter = 1 To numbeeps

Beep

Next counter

End Sub

Sub Message()

MsgBox "Pausa para o café!"

End Sub

Chamando procedimentos Sub com mais de um argumento

O exemplo a seguir mostra duas formas de se chamar um procedimento Sub com mais de um argumento. Na segunda vez em que HouseCalc for chamado, será necessário colocar os argumentos entre parênteses porque a instrução Call é utilizada.

Sub Main()

HouseCalc 99.800, 43.100

Call HouseCalc (38.0950, 49.500)

End Sub

Sub HouseCalc (price As Single, wage As Single)

If 2,5 * wage <= 0,8 * preço Then

MsgBox "Você não tem dinheiro para comprar esta casa."

Else

MsgBox "Você tem dinheiro para comprar esta casa."

End If

End Sub

Utilizando parênteses ao chamar procedimentos Function

Para utilizar o valor de retorno de uma função, atribua a função a uma variável e coloque os argumentos entre parênteses, como mostra o exemplo a seguir.

Answer3 = MsgBox("Você está satisfeito com o seu salário?", 4, "Pergunta 3")

Caso você não esteja interessado no valor de retorno de uma função, poderá chamar uma função da mesma forma como chama um procedimento Sub. Omita os parênteses, liste os argumentos e não atribua a função a nenhuma variável, como mostra o exemplo a seguir.

MsgBox "Tarefa concluída!", 0, "Caixa de tarefa "

Cuidado   Caso você inclua parênteses no exemplo acima, a instrução provocará um erro de sintaxe.

Passando argumentos nomeados

Uma instrução em um procedimento Sub ou Function pode passar valores para os procedimentos chamados usando argumentos nomeados. Você pode listar argumentos nomeados em qualquer ordem. Um argumento nomeado consiste no nome do argumento, seguido por dois-pontos e um sinal de igualdade (:=), e o valor atribuído ao argumento.

O exemplo a seguir chama a função MsgBox utilizando argumentos nomeados sem valor de retorno.

MsgBox Title:="Caixa de tarefa ", Prompt:="Tarefa concluída!"

O exemplo a seguir chama a função MsgBox usando argumentos nomeados. O valor de retorno é atribuído à variável resposta3.

answer3 = MsgBox(Title:="Pergunta 3", _

Prompt:="Você está satisfeito com o seu salário?", Buttons:=4)


Criando variáveis de objeto

Você pode tratar uma variável de objeto exatamente como o objeto ao qual ela se refere. Você pode definir ou retornar as propriedades do objeto ou utilizar um dos seus métodos.

Para criar uma variável de objeto:

1.	Declare a variável de objeto.

2.	Atribua a variável de objeto a um objeto.

Declarando uma variável de objeto

Utilize a instrução Dim ou uma das outras instruções de declaração (Public, Private ou Static) para declarar uma variável de objeto. Uma variável que se refira a um objeto deve ser uma Variant, um Object ou um tipo específico de objeto. Por exemplo, as declarações a seguir são válidas:

' Declara MyObject como o tipo de dados Variant.

Dim MyObject

' Declara MyObject como o tipo de dados Object.

Dim MyObject As Object

' Declara MyObject como o tipo de dados Font.

Dim MyObject As Font

Observação   Se você utilizar uma variável de objeto sem declará-la primeiro, o seu tipo de dados será, como padrão, Variant.

Você pode declarar uma variável de objeto com o tipo de dados Object em situações onde o tipo de objeto específico só se torna conhecido na execução do procedimento. Utilize o tipo de dados Object para criar uma referência genérica a qualquer objeto.

Caso conheça o tipo de objeto específico, deve declarar a variável de objeto como pertencendo a esse tipo de objeto. Por exemplo, se o seu aplicativo contém um tipo de objeto Sample, você pode declarar uma variável de objeto para esse objeto através de uma destas instruções:

Dim MyObject As Object	' Declarada como objeto genérico.

Dim MyObject As Sample	' Declarada somente como objeto Sample.

A declaração de tipos de objeto específicos proporciona a verificação automática do tipo, código mais rápido e melhoria em legibilidade.

Atribuindo uma variável de objeto a um objeto

Utilize a instrução Set para atribuir um objeto a uma variável de objeto. Você pode atribuir uma expressão de objeto ou Nothing. Por exemplo, as atribuições de variáveis de objeto a seguir são válidas:

Set MyObject = YourObject	' Atribui referência de objeto.

Set MyObject = Nothing	' Interrompe a associação.

Você pode combinar a declaração de uma variável de objeto com a atribuição de um objeto a ele utilizando a palavra-chave New com a instrução Set. Por exemplo:

Set MyObject= New Object	' Cria e atribui

A definição de uma variável de objeto como Nothing interrompe a sua associação com qualquer objeto específico. Isso impede que você altere acidentalmente o objeto através da alteração da variável. Uma variável de objeto será sempre definida como Nothing após o fechamento do objeto associado, para que você possa testar se a variável de objeto aponta ou não para um objeto válido. Por exemplo:

If Not MyObject Is Nothing Then

' Variável se refere a objeto válido.

. . .

End If

É claro que esse teste jamais poderá determinar com absoluta certeza se um usuário fechou ou não o aplicativo que contém o objeto ao qual a variável de objeto faz referência.

Fazendo referência à ocorrência atual de um objeto

Utilize a palavra-chave Me para fazer referência à ocorrência atual do objeto no qual o código está sendo executado. Todos os procedimentos associados ao objeto atual têm acesso ao objeto identificado como Me. Utilizar Me é muito útil para passar informações sobre a instância atual de um objeto para um procedimento em outro módulo. Por exemplo, suponha que você possua o seguinte procedimento em um módulo:

Sub ChangeObjectColor (MyObjectNome As Object)

MyObjectName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)

End Sub

Você pode chamar o procedimento e passar a ocorrência atual do objeto como um argumento usando a instrução a seguir:

ChangeObjectColor Me


Criando procedimentos recursivos

Os procedimentos possuem uma quantidade de espaço limitada para variáveis. Cada vez que um procedimento chama a si mesmo, uma parte maior desse espaço é utilizada. Esse tipo de procedimento é chamado de procedimento recursivo. Um procedimento recursivo que chame a si próprio continuamente acaba provocando um erro. Por exemplo:

Function RunOut(Maximum)

RunOut = RunOut(Maximum)

End Function

Este erro pode ser menos óbvio quando dois procedimentos chamam-se um ao outro indefinidamente ou quando alguma condição que limita a recursão jamais se concretiza. A recursão tem sua utilidade. Por exemplo, o procedimento a seguir utiliza uma função recursiva para calcular fatoriais:

Function Factorial (N)

If N <= 1 Then	' Chegou ao fim das chamadas recursivas.

Factorial = 1	' (N = 0) retorna para fora das chamadas.

Else	' Chama novamente Factorial if N > 0.

Factorial = Factorial(N - 1) * N

End If

End Function

Você deve testar o seu procedimento recursivo para se certificar de que não chama a si mesmo tantas vezes, a ponto de esgotar a memória. Caso ocorra um erro, certifique-se de que o procedimento não está chamando indefinidamente a si mesmo. Depois disso, tente economizar memória:

•	Eliminando variáveis desnecessárias.

•	Utilizando tipos de dados diferentes de Variant.

•	Reavaliando a lógica do procedimento. Muitas vezes, você pode substituir recursão por loops aninhados.


Declarando matrizes

As matrizes são declaradas da mesma maneira que as outras variáveis, utilizando instruções Dim, Static, Private ou Public. A diferença entre as variáveis escalares (que não são matrizes) e variáveis de matriz é que geralmente você deve especificar o tamanho da matriz. Uma matriz cujo tamanho é especificado é uma matriz de tamanho fixo. Uma matriz cujo tamanho pode ser alterado durante a execução de um programa é uma matriz dinâmica.

A indexação de uma matriz a partir de 0 ou 1 depende da definição da instrução Option Base. Se Option Base 1 não for especificada, todos os índices de matriz iniciarão em zero.

Declarando uma matriz fixa

Na linha de código a seguir, uma matriz de tamanho fixo é declarada como uma matriz Integer com 11 linhas e 11 colunas:

Dim MyArray (10, 10) As Integer

O primeiro argumento representa as linhas; o segundo argumento representa as colunas.

Como ocorre com qualquer outra declaração de variável, a menos que você especifique um tipo de dados para a matriz, o tipo de dados dos elementos em uma matriz declarada é Variant. Cada elemento numérico Variant da matriz utiliza 16 bytes. Cada elemento Variant de seqüência de caracteres utiliza 22 bytes. Para criar código o mais compacto possível, declare explicitamente as suas matrizes como um tipo de dados diferente de Variant. As linhas de código a seguir comparam o tamanho de diversas matrizes:

' Matriz Integer utiliza 22 bytes (11 elementos * 2 bytes).

ReDim MyIntegerArray(10) As Integer

' Matriz de dupla precisão utiliza 88 bytes (11 elementos * 8 bytes).

ReDim MyDoubleArray (10) As Double

' Matriz Variant utiliza pelo menos 176 bytes (11 elementos * 16 bytes).

ReDim MyVariantArray (10)

' Matriz Integer utiliza 100 * 100 * 2 bytes (20.000 bytes).

ReDim MyIntegerArray (99, 99) As Integer

' Matriz de dupla precisão utiliza 100 * 100 * 8 bytes (80.000 bytes).

ReDim MyDoubleArray (99, 99) As Double

' Matriz Variant utiliza pelo menos 160.000 bytes (100 * 100 * 16 bytes).

ReDim MyVariantArray (99, 99)

O tamanho máximo de uma matriz varia com base no seu sistema operacional e na quantidade de memória disponível. A utilização de uma matriz que exceda a quantidade de RAM disponível no seu sistema é mais lenta porque os dados devem ser lidos e gravados no disco.

Declarando uma matriz dinâmica

Ao declarar uma matriz dinâmica, você pode dimensionar a matriz durante a execução do código. Utilize uma instrução Static, Dim, Private ou Public para declarar uma matriz, deixando vazios os parênteses, como mostra o exemplo a seguir.

Dim sngArray() As Single

Observação    Você pode utilizar a instrução ReDim para declarar uma matriz implicitamente dentro de um procedimento. Tome cuidado para não digitar errado o nome da matriz quando utilizar a instrução ReDim. Mesmo que haja uma instrução Option Explicit incluída no módulo, será criada uma segunda matriz.

Em um procedimento dentro do escopo da matriz, utilize a instrução ReDim para alterar o número de dimensões, definir o número de elementos e definir os limites superior e inferior de cada dimensão. Você pode utilizar a instrução ReDim para alterar a matriz dinâmica com a freqüência necessária. No entanto, todas as vezes que você tomar essa providência, os valores existentes na matriz serão perdidos. Utilize ReDim Preserve para expandir uma matriz enquanto preserva os valores existentes na matriz. Por exemplo, a instrução a seguir acrescenta 10 elementos à matriz varArray sem perder os valores atuais dos elementos originais.

ReDim Preserve varArray(UBound(varArray) + 10)

Observação    Quando utilizar a palavra-chave Preserve com uma matriz dinâmica, você pode alterar somente o limite superior da última dimensão, mas não pode alterar o número de dimensões.


Declarando constantes

Através da declaração de uma constante, você pode atribuir um nome significativo a um valor. Utilize a instrução Const para declarar uma constante e definir o seu valor. Depois que uma constante tiver sido declarada, não será possível modificá-la ou atribuir-lhe um novo valor.

Você pode declarar uma constante dentro de um procedimento ou na parte superior de um módulo, na seção Declarações. Como padrão, as constantes em nível de módulo são privadas. Para declarar uma constante em nível de módulo público, preceda a instrução Const com a palavra-chave Public. Para declarar explicitamente uma constante privada, preceda a instrução Const com a palavra-chave Private para facilitar a leitura e a interpretação do seu código. Para obter mais informações, consulte Compreendendo o escopo e a visibilidade na Ajuda do Visual Basic.

O exemplo a seguir declara a constante Public conIdade como um Integer e atribui a ela o valor 34.

Public Const conAge As Integer = 34

As constantes podem ser declaradas como um destes tipos de dados: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String ou Variant. Como você já conhece o valor de uma constante, pode especificar o tipo de dados em uma instrução Const. Para obter mais informações sobre tipos de dados, consulte Resumo de tipos de dados na Ajuda do Visual Basic.

Você pode declarar diversas constantes em uma instrução. Para especificar um tipo de dados, você deve incluir o tipo de dados de cada constante. Na instrução a seguir, as constantes conAge e conWage são declaradas como Integer.

Const conAge As Integer = 34, conWage As Currency = 35.000


Declarando variáveis

Ao declarar variáveis, você geralmente utiliza uma instrução Dim. Uma instrução de declaração pode ser colocada dentro de um procedimento para criar uma variável de nível de procedimento. Ou ela pode ser colocada na parte superior de um módulo, na seção Declarações, para criar uma variável de nível de módulo.

O exemplo a seguir cria a variável strName e especifica o tipo de dados String.

Dim strName As String

Se esta instrução aparecer dentro de um procedimento, a variável strName poderá ser utilizada somente nesse procedimento. Se a instrução aparecer na seção Declarações do módulo, a variável strName estará disponível para todos os procedimentos dentro do módulo, mas não para procedimentos em outros módulos no projeto. Para tornar essa variável disponível para todos os procedimentos no projeto, preceda-a com a instrução Public, como no exemplo a seguir:

Public strName As String

Para obter mais informações sobre a nomenclatura das suas variáveis, consulte Regras de nomenclatura do Visual Basic na Ajuda do Visual Basic.

As variáveis podem ser declaradas como um dos seguintes tipos de dados: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (para seqüências de caracteres de comprimento variável), String * length (para seqüências de caracteres de comprimento fixo), Object, ou Variant. Caso você não especifique um tipo de dados, o tipo de dados Variant será atribuído como padrão. Você também pode criar um tipo definido pelo usuário através da instrução Type. Para obter mais informações sobre tipos de dados, consulte Resumo de tipos de dados na Ajuda do Visual Basic.

Você pode declarar diversas variáveis em uma instrução. Para especificar um tipo de dados, você deve incluir o tipo de dados para cada variável. Na instrução a seguir, as variáveis intX, intY e intZ são declaradas como tipo Integer.

Dim intX As Integer, intY As Integer, intZ As Integer

Na instrução a seguir, intX e intY são declaradas como tipo Variant; apenas intZ é declarada como tipo Integer.

Dim intX, intY, intZ As Integer

Você não precisa fornecer o tipo de dados da variável na instrução de declaração. Caso você omita o tipo de dados, a variável será do tipo Variant.

Utilizando a instrução Public

Você pode utilizar a instrução Public para declarar as variáveis públicas em nível de módulo.

Public strName As String

As variáveis públicas podem ser utilizadas em todos os procedimentos do projeto. Caso uma variável pública seja declarada em um módulo padrão ou um módulo de classe, ela também poderá ser utilizada em qualquer projeto que faça referência ao projeto onde a variável pública é declarada.

Utilizando a instrução Private

Você pode utilizar a instrução Private para declarar as variáveis privadas em nível de módulo.

Private MyName As String

As variáveis privadas podem ser utilizadas somente por procedimentos no mesmo módulo.

Observação    Ao ser utilizada em nível de módulo, a instrução Dim é equivalente à instrução Private. Convém utilizar a instrução Private para facilitar a leitura e a interpretação do seu código.

Utilizando a instrução Static

Quando você utilizar a instrução Static no lugar de uma instrução Dim, a variável declarada reterá os seus valores entre as chamadas.

Utilizando a instrução Option Explicit

Você pode declarar implicitamente uma variável no Visual Basic, simplesmente utilizando-a em uma instrução de atribuição. Todas as variáveis declaradas implicitamente são do tipo Variant. As variáveis do tipo Variant exigem mais recursos de memória que a maioria das outras variáveis. O seu aplicativo será mais eficiente se você declarar as variáveis explicitamente e com um tipo de dados específico. A declaração explícita de todas as variáveis reduz a incidência de erros de conflitos de nomenclatura e de digitação.

Para impedir que o Visual Basic faça declarações implícitas, você pode inserir a instrução Option explicit em um módulo antes de todos os procedimentos. Essa instrução obriga-o a declarar explicitamente todas as variáveis dentro do módulo. Caso um módulo inclua a instrução Option Explicit, ocorrerá um erro em tempo de compilação quando o Visual Basic encontrar um nome de variável que ainda não tenha sido declarada ou que apresente algum erro de digitação.

Você pode definir uma opção no ambiente de programação do Visual Basic para incluir automaticamente a instrução Option Explicit em todos os módulos novos. Para obter ajuda sobre como alterar as opções do ambiente Visual Basic, consulte a documentação do aplicativo. Observe que essa opção não altera o código existente que você gravou.

Observação   Você deve declarar explicitamente as matrizes fixas e as matrizes dinâmicas.

Declarando uma variável de objeto para automação

Quando você utiliza um aplicativo para controlar os objetos de outro aplicativo, você deve definir uma referência à biblioteca de tipos do outro aplicativo. Quando você define uma referência, pode declarar as variáveis de objeto de acordo com o tipo mais específico. Por exemplo, caso esteja no Microsoft Word ao definir uma referência à biblioteca de tipos do Microsoft Excel, você pode declarar uma variável do tipo Worksheet a partir do Microsoft Word para representar um objeto Worksheet do Microsoft Excel.

Caso você esteja utilizando outro aplicativo para controlar objetos do Microsoft Access, poderá, na maioria dos casos, declarar as variáveis de objeto de acordo com o tipo de dados mais específico. Você também pode utilizar a palavra-chave New para criar automaticamente uma nova ocorrência de um objeto. No entanto, talvez você deva indicar que ele é um objeto do Microsoft Access. Por exemplo, quando você declara uma variável de objeto para representar um formulário do Microsoft Access, a partir do Microsoft Visual Basic, deve diferenciar o objeto Form do Microsoft Access de um objeto Form do Visual Basic. Inclua o nome da biblioteca de tipos na declaração da variável, como no exemplo a seguir:

Dim frmEncomendas As New Access.Form

Alguns aplicativos não reconhecem tipos de objeto individuais do Microsoft Access. Mesmo se definir uma referência à biblioteca de tipos do Microsoft Access a partir desses aplicativos, você deve declarar todas as variáveis de objeto do Microsoft Access como tipo Object. Você também não pode utilizar a palavra-chave New para criar uma nova ocorrência do objeto. O exemplo a seguir mostra como se declara uma variável para representar uma ocorrência do objeto Application do Microsoft Access a partir de um aplicativo que não reconhece tipos de objeto do Microsoft Access. Em seguida, o aplicativo cria uma ocorrência do objeto Application.

Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")

Para determinar a qual sintaxe um aplicativo oferece suporte, consulte a documentação do aplicativo.


Executando código ao definir propriedades

Você pode criar procedimentos Property Let, Property Set e Property Get que compartilhem o mesmo nome. Ao fazer isto, você pode criar um grupo de procedimentos relacionados que trabalhem juntos. Quando um nome é utilizado para um procedimento Property, ele não pode ser utilizado para nomear um procedimento Sub ou Function , uma variável ou um tipo definido pelo usuário.

A instrução Property Let permite que você crie um procedimento que defina o valor da propriedade. Um exemplo pode ser um procedimento Property que crie uma propriedade invertida para um bitmap em um formulário. Veja a seguir a sintaxe utilizada para chamar o procedimento Property Let:

Form1.Inverted = True

O verdadeiro trabalho de inversão de um bitmap no formulário é feito dentro do procedimento Property Let:

Private IsInverted As Boolean

Property Let Inverted(X As Boolean)

IsInverted = X

If IsInverted Then

…

(instruções)

Else

(instruções)

End If

End Property

A variável em nível de formulário IsInvertida armazena a definição da sua propriedade. Quando a declara como Private, o usuário poderá mudá-la somente se utilizar o seu procedimento Property Let. Utilize um nome que facilite o reconhecimento de que essa variável é utilizada pela propriedade.

Este procedimento Property Get é utilizado para retornar o estado atual da propriedade Inverted:

Property Get Invertida() As Boolean

Inverted = IsInverted

End Property

Os procedimentos de propriedade facilitam a execução do código durante a definição do valor de uma propriedade. Você pode utilizar os procedimentos de propriedade para executar os seguintes processamentos:

•	Antes de um valor de propriedade ser definido para determinar o valor da propriedade.

•	Depois de um valor de propriedade ser definido, com base no novo valor.


Fazendo loop no código

Utilizando instruções condicionais e instruções de estrutura (também chamadas de estruturas de controle), você pode criar código do Visual Basic que tome decisões e repita ações. Outra estrutura de controle de grande utilidade, a instrução With, permite que você execute uma série de instruções sem precisar requalificar um objeto.

Utilizando instruções condicionais para tomar decisões

As instruções condicionais avaliam se uma condição é True ou False, e em seguida especificam uma ou mais instruções a serem executadas, dependendo do resultado. Geralmente, uma condição é uma expressão que utiliza um operador de comparação para comparar valores ou variáveis.

Escolhendo a instrução condicional a ser utilizada

•	If...Then...Else: Desvia quando uma condição é True ou False

•	Select Case: Seleciona um desvio de um conjunto de condições

Utilizando loops para repetir código

Fazer loop permite que você execute um grupo de instruções repetidamente. Alguns loops repetem instruções até uma condição ser False; outros repetem instruções até uma condição ser True. Também há loops que repetem instruções um número específico de vezes ou em cada objeto em uma coleção.

Escolhendo o loop a ser utilizado

•	Do...Loop: Faz um loop enquanto ou até que uma condição seja True

•	For...Next: Utiliza um contador para executar instruções um determinado número de vezes

•	For Each...Next: Repete um grupo de instruções para cada objeto em uma coleção

Executando diversas instruções no mesmo objeto

No Visual Basic geralmente você deve especificar um objeto para poder executar um dos seus métodos ou alterar uma das suas propriedades. Você pode utilizar a instrução With para especificar um objeto uma vez para toda uma série de instruções.

•	With: Executa uma série de instruções no mesmo objeto


Acelerando loops For...Next

Os números inteiros utilizam menos memória que o tipo de dados Variant e são ligeiramente mais rápidos de atualizar. No entanto, esta diferença somente é perceptível quando você executa milhares de operações. Por exemplo:

Dim CountFaster As Integer	' Primeiro caso, utilize Integer.

For CountFaster = 0 to 32766

Next CountFaster

Dim CountSlower As Variant	' Segundo caso, utilize Variant.

For CountSlower = 0 to 32766

Next CountSlower

O primeiro caso acima é executado em um tempo ligeiramente menor do que o segundo. Entretanto, se CountFaster exceder de 32.767 bytes, ocorrerá um erro. Para corrigir isto, você pode alterar CountFaster para o tipo de dados Long, que aceita um intervalo de números inteiros bem maior. Em geral, quanto menor o tipo de dados, menor é o seu tempo de atualização. As variantes são ligeiramente mais lentas do que o tipo de dados equivalentes.


Passando argumentos de modo eficiente

Todos os argumentos são passados para os procedimentos por referência, a não ser que algo diferente seja especificado. Isto é eficaz, porque todos os argumentos passados por referência utilizam o mesmo tempo para passar e o mesmo espaço (4 bytes) em um procedimento, independentemente do tipo de dados do argumento.

Você pode passar um argumento por valor caso inclua a palavra-chave ByVal na declaração do procedimento. Os argumentos passados por valor consomem de 2 a 16 bytes no procedimento, dependendo do tipo de dados do argumento. Os tipos de dados maiores levam ligeiramente mais tempo para serem passados por valor do que os tipos menores. Por essa razão, os tipos de dados String e Variant geralmente não devem ser passados por valor.

A passagem de um argumento por valor copia a variável original. As alterações feitas no argumento dentro do procedimento não se refletem na variável original. Por exemplo:

Function Factorial (ByVal MyVar As Integer)	' Declaração da função.

MyVar = MyVar - 1

If MyVar = 0 Then

Factorial = 1

Exit Function

End If

Factorial = Factorial(MyVar) * (MyVar + 1)

End Function

' Chama Factorial com uma variável S.

S = 5

Print Factorial(S)	' Exibe 120 (o fatorial de 5)

Print S	' Exibe 5.

Sem incluir ByVal na declaração da função, as instruções Print acima exibiriam 1 e 0, pois MyVar seria referente à variável S, que é reduzida em 1 até ser igual a 0.

Como ByVal produz uma cópia do argumento, você pode passar uma variante à função Factorial acima. Você não pode passar uma variante por referência caso o procedimento que declara o argumento seja outro tipo de dados.


Retornando seqüências de caracteres de funções

Algumas funções possuem duas versões: uma que retorna um tipo de dados Variant e uma que retorna um tipo de dados String. As versões Variant são mais convenientes, porque variantes manipulam conversões entre diferentes tipos de dados automaticamente. Elas também permitem que Null seja propagado através de uma expressão. As versões String são mais eficientes, pois utilizam menos memória.

Considere utilizar a versão String quando:

•	Seu programa for muito grande e utilizar muitas variáveis.

•	Você gravar dados diretamente em arquivos de acesso aleatório.

As funções a seguir retornam valores em uma variável String quando se acrescenta um cifrão ($) ao nome da função. Estas funções têm o mesmo uso e sintaxe que os seus equivalentes Variant sem o cifrão.

Chr$	ChrB$	*Command$
CurDir$	Date$	Dir$
Error$	Format$	Hex$
Input$	InputB$	LCase$
Left$	LeftB$	LTrim$
Mid$	MidB$	Oct$
Right$	RightB$	RTrim$
Space$	Str$	String$
Time$	Trim$	UCase$
* Podem não estar disponíveis em todos os aplicativos.


Compreendendo a compilação condicional

Você pode utilizar compilação condicional para executar blocos de código seletivamente, por exemplo, depurando instruções, comparando a velocidade de diferentes abordagens com a mesma tarefa de programação ou localizando um aplicativo para diferentes linguagens.

Você declara uma constante de compilador condicional em código com a diretiva #Const e denota blocos de código a serem compilados condicionalmente com a diretiva #If...Then...#Else. O exemplo a seguir executa o código de depuração ou o código de produção com base no valor da variável conDebug.

' Declara a constante de compilação pública na seção Declarações.

#Const conDebug = 1

Sub SelectiveExecution()

#If conDebug = 1 Then

.	' Executa código com instruções de depuração.

.

.

#Else

.	' Executa código normal.

.

.

#End If

End Sub


Compreendendo a vida útil de variáveis

O tempo durante o qual uma variável retém o seu valor é conhecido como a sua vida útil. O valor de uma variável pode mudar no decorrer da sua vida útil, mas ela retém algum valor. Quando uma variável perde o escopo, ela deixa de ter um valor.

Quando tem início a execução de um procedimento, todas as variáveis são inicializadas. Uma variável numérica é inicializada como zero, uma seqüência de caracteres de comprimento variável é inicializada como uma seqüência de caracteres de comprimento zero ("") e uma seqüência de caracteres de comprimento fixo é preenchida com o caractere representado pelo código de caractere ASCII 0 ou Chr(0). As variáveis Variant são inicializadas como Empty. Cada elemento de uma variável de tipo definido pelo usuário é inicializado como se fosse uma variável independente.

Quando você declara uma variável de objeto, o espaço é reservado na memória, mas o seu valor é definido como Nothing até você atribuir uma referência de objeto a ele através da instrução Set.

Caso o valor de uma variável não seja alterado durante a execução do seu código, ele reterá seu valor inicializado até perder o escopo.

Uma variável em nível de procedimento declarada com a instrução Dim retém um valor até ser concluída a execução do procedimento. Caso os procedimentos chamem outros procedimentos, a variável reterá o seu valor enquanto esses procedimentos também estiverem sendo executados.

Caso uma variável em nível de procedimento seja declarada com a palavra-chave Static, a variável reterá o seu valor enquanto o código estiver sendo executado em algum módulo. Quando tiver sido concluída a execução de todo o código, a variável perderá o seu escopo e o seu valor. Sua vida útil é a mesma de uma variável em nível de módulo.

Uma variável em nível de módulo é diferente de uma variável estática. Em um módulo padrão ou em um módulo de classe, ela retém o seu valor até você interromper a execução do seu código. Em um módulo de classe, ele retém o seu valor durante a existência de uma ocorrência da classe. Como as variáveis em nível de módulo consomem recursos de memória até você redefinir os seus valores, utilize-as somente quando necessário.

Se você inserir a palavra-chave Static antes de uma instrução Sub ou Function, os valores de todas as variáveis em nível de procedimento no procedimento serão preservadas entre as chamadas.


Compreendendo argumentos nomeados e opcionais

Quando você chama um procedimento Sub ou Function, você pode fornecer argumentos posicionalmente, na ordem em que eles aparecem na definição do procedimento, ou pode fornecer os argumentos pelo nome, sem levar em consideração a posição deles.

Por exemplo, o procedimento Sub a seguir utiliza três argumentos:

Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)

Debug.Print strName, intAge, dteBirth

End Sub

Você pode chamar este procedimento fornecendo os seus argumentos na posição correta, separados por  uma vírgula, como mostra o exemplo apresentado a seguir:

PassArgs "Maria", 29, #2-21-69#

Você também pode chamar este procedimento fornecendo argumentos nomeados, delimitando-os com uma vírgula.

PassArgs intAge:=26, dteBirth:=#2/21/69#, strName:="Maria"

Um argumento nomeado consiste em um nome de argumento, seguido por dois-pontos e um sinal de igualdade (:=), seguido pelo valor do argumento.

Os argumentos nomeados são particularmente úteis quando você está chamando um procedimento que possui argumentos opcionais. Caso você utilize argumentos nomeados, não precisará inserir vírgulas para assinalar argumentos posicionais ausentes. Os argumentos nomeados facilitam o monitoramento dos argumentos passados e omitidos.

Os argumentos opcionais são precedidos pela palavra-chave Optional na definição de procedimento. Você também pode especificar um valor padrão para o argumento opcional na definição de procedimento. Por exemplo:

Sub OptionalArgs(strState As String, Optional strCountry As String = "USA")

. . .

End Sub

Quando você chama um procedimento com um argumento opcional, a especificação do argumento opcional é facultativa. Caso não especifique o argumento opcional, o valor padrão, se houver, será utilizado. Se nenhum valor padrão for especificado, o argumento será aquele que seria para qualquer variável do tipo especificado.

O procedimento a seguir inclui dois argumentos opcionais, as variáveis varRegion e varCountry. A função IsMissing determina se foi passado um argumento Variant opcional para o procedimento.

Sub OptionalArgs(strState As String, Optional varRegion As Variant, _

Optional varCountry As Variant = "USA")

If IsMissing(varRegion) And IsMissing(varCountry) Then

Debug.Print strState

ElseIf IsMissing(varCountry) Then

Debug.Print strState, varRegion

ElseIf IsMissing(varRegion) Then

Debug.Print strState, varCountry

Else

Debug.Print strState, varRegion, varCountry

End If

End Sub

Você pode chamar este procedimento utilizando os argumentos nomeados conforme mostrados nos exemplos a seguir.

OptionalArgs varCountry:="USA", strState:="MD"

OptionalArgs strState:= "MD", varRegion:=5


Compreendendo objetos, propriedades, métodos e eventos

Um objeto representa um elemento de um aplicativo, como uma planilha, uma célula, um gráfico, um formulário ou um relatório. No código do Visual Basic, você deve identificar um objeto antes de poder aplicar um dos métodos do objeto ou alterar o valor de uma das suas propriedades.

Uma coleção é um objeto que contém uma série de outros objetos, geralmente, mas nem sempre, do mesmo tipo. No Microsoft Excel, por exemplo, o objeto Workbooks contém todos os objetos Workbook que estiverem abertos. No Visual Basic, a coleção Forms contém todos os objetos Form de um aplicativo.

Os itens de uma coleção podem ser identificados por número ou por nome. Por exemplo, no procedimento a seguir, Workbooks(1) identifica o primeiro objeto Workbook aberto.

Sub CloseFirst()

Workbooks(1).Close

End Sub

O procedimento a seguir utiliza um nome especificado como uma seqüência de caracteres para identificar um objeto Form.

Sub CloseForm()

Forms("MeuFormulário.frm").Close

End Sub

Você também pode manipular toda uma coleção de objetos caso os objetos compartilhem métodos comuns. Por exemplo, o procedimento a seguir fecha todos os formulários abertos.

Sub CloseAll()

Forms.Close

End Sub

Um método é uma ação que um objeto pode executar. Por exemplo, Add é um método do objeto ComboBox, pois adiciona uma nova entrada a uma caixa de combinação.

O procedimento a seguir utiliza o método Add para adicionar um novo item a ComboBox.

Sub AddEntry(newEntry as String)

Combo1.Add newEntry

End Sub

Uma propriedade é um atributo de um objeto que define uma das características do objeto (assim como tamanho, cor ou localização na tela) ou um aspecto do seu comportamento (assim como se ela está ativada ou visível). Para alterar as características de um objeto, você pode alterar os valores das suas propriedades.

Para definir o valor de uma propriedade, coloque, após a referência a um objeto, um ponto, o nome da propriedade, um sinal de igualdade (=) e o novo valor da propriedade. Por exemplo, o procedimento a seguir altera a legenda de um formulário do Visual Basic através da definição da propriedade Caption.

Sub ChangeName(newTitle)

myForm.Caption = newTitle

End Sub

Algumas propriedades não podem ser definidas. O tópico da Ajuda de cada propriedade indica se ela pode ser definida (leitura e gravação) , se pode somente ser lida (somente leitura) ou se pode somente ser gravada (somente gravação).

Para recuperar informações sobre um objeto, basta retornar o valor de uma das suas propriedades. O procedimento a seguir utiliza uma caixa de mensagem para exibir o título que aparece na parte superior do formulário ativo no momento.

Sub GetFormName()

formName = Screen.ActiveForm.Caption

MsgBox formName

End Sub

Um evento é uma ação reconhecida por um objeto, como clicar o mouse ou pressionar uma tecla e para a qual você pode escrever código para responder. Podem ocorrer eventos em resposta a uma ação do usuário ou a um código do programa. Eles também podem ser acionados pelo sistema.

Retornando objetos

Todos os aplicativos têm uma maneira de retornar os objetos neles contidos. No entanto, como eles variam entre si, você deve consultar o tópico da Ajuda sobre o objeto ou a coleção que está utilizando no aplicativo para ver como retornar o objeto.


Compreendendo a automação

A Automação (antes conhecida como Automação OLE) é um recurso do Component Object Model (COM, modelo de objeto componente), uma tecnologia de padrão industrial utilizada pelos aplicativos para expor os seus objetos a ferramentas de desenvolvimento, linguagens de macro e a outros aplicativos que oferecem suporte à Automação. Por exemplo, um aplicativo de planilha pode expor uma planilha, gráfico, célula ou intervalo de células — como diferentes tipos de objetos. Um processador de textos pode expor objetos como um aplicativo, um documento, um parágrafo, uma frase, um indicador ou uma seleção.

Quando um aplicativo oferece suporte a automação, os objetos expostos por ele podem ser acessados pelo Visual Basic. Utilize o Visual Basic para manipular esses objetos invocando métodos sobre o objeto ou obtendo e definindo as propriedades do objeto. Por exemplo, você pode criar um objeto de automação nomeado MyObject e escrever o seguinte código para acessá-lo:

MyObj.Insert "Oi, mundo."	' Insere um texto.

MyObj.Bold = True	' Formata o texto.

If Mac = True	' Verifica a constante de sua plataforma

MyObj.SaveAs  "HD\PROCTXT\DOCS\OBJTEST.DOC"	' Grava o objeto (Macintosh).

Else

MyObj.SaveAs  "C:\PROCTXT\DOCS\OBJTEST.DOC"	' Grava o objeto (Windows).

As funções a seguir dão acesso a um objeto de automação:

Função	Descrição
CreateObject	Cria um novo objeto de um tipo especificado.
GetObject	Recupera um objeto de um arquivo.
Para obter mais informações sobre as propriedades e os métodos que obtêm suporte por um aplicativo, consulte a documentação do aplicativo. Os objetos, funções, propriedades e métodos que obtêm suporte por um aplicativo são normalmente definidos na biblioteca de objetos do aplicativo.


Compreendendo matrizes de parâmetro

Uma matriz de parâmetros pode ser utilizada para passar uma matriz de argumentos a um procedimento. Você não precisa saber o número de elementos na matriz quando for definir o procedimento.

Utilize a palavra-chave ParamArray para denotar uma matriz de parâmetros. A matriz deve ser declarada como uma matriz do tipo Variant e deve ser o último argumento na definição do procedimento.

O exemplo a seguir mostra como você pode definir um procedimento com uma matriz de parâmetros.

Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)

Dim intI As Integer

Debug.Print strName; "    Pontos"

' Utiliza a função UBound para determinar o limite superior da matriz.

For intI = 0 To UBound(intScores())

Debug.Print "          "; intScores(intI)

Next intI

End Sub

Os exemplos a seguir mostram como você pode chamar esse procedimento.

AnyNumberArgs "Rodrigo", 10, 26, 32, 15, 22, 24, 16

AnyNumberArgs "Carla", "ALto", "Baixo", "Médio", "Alto"


Compreendendo o escopo e a visibilidade

O escopo diz respeito à disponibilidade de uma variável, constante ou procedimento para ser utilizado por outro procedimento. Há três níveis de escopo: nível de procedimento, nível de módulo privado e nível de módulo público.

Você determina o escopo de uma variável quando a declara. É interessante declarar todas as variáveis explicitamente para evitar erros de conflito de nomenclatura entre as variáveis com diferentes escopos.

Definindo o escopo em nível de procedimento

Uma variável ou constante definida dentro de um procedimento não é visível fora desse procedimento. Somente o procedimento que contém a declaração da variável pode utilizá-la. No exemplo a seguir, o primeiro procedimento exibe uma caixa de mensagem que contém uma seqüência de caracteres. O segundo procedimento exibe uma caixa de mensagem em branco, pois, para o primeiro procedimento, a variável strMsg é local.

Sub LocalVariable()

Dim strMsg As String

strMsg = "Esta variável não pode ser utilizada fora deste procedimento."

MsgBox strMsg

End Sub

Sub OutsideScope()

MsgBox strMsg

End Sub

Definindo o escopo em nível de módulo privado

Você pode definir variáveis e constantes em nível de módulo na seção Declarações de um módulo. As variáveis em nível de módulo podem ser públicas ou privadas. As variáveis públicas estão disponíveis para todos os procedimentos em todos os módulos de um projeto; as variáveis privadas estão disponíveis somente para os procedimentos naquele módulo. Como padrão, o escopo das variáveis declaradas com a instrução Dim na seção Declarações é privado. No entanto, quando se precede a variável com a palavra-chave Private, o escopo no seu código se torna óbvio.

No exemplo a seguir, a variável de seqüência de caracteres strMsg está disponível para os procedimentos definidos no módulo. Quando o segundo procedimento for chamado, ele exibirá o conteúdo da variável de seqüência de caracteres strMsg em uma caixa de diálogo.

' Adiciona a seguinte seção Declarações do módulo.

Private strMsg sAs String

Sub InitializePrivateVariable()

strMsg = "Esta variável não pode ser utilizada fora deste módulo."

End Sub

Sub InitializePrivateVariable()

MsgBox strMsg

End Sub

Observação    Os procedimentos públicos em um módulo padrão ou módulo de classe estão disponíveis para qualquer projeto de referência. Para limitar o escopo de todos os procedimentos de um módulo ao projeto atual, adicione a instrução Option Private Module à seção Declarações do módulo. As variáveis e procedimentos públicos ainda estarão disponíveis para os outros procedimentos no projeto atual, mas não para os projetos de referência.

Definindo o escopo em nível de módulo público

Caso você declare uma variável em nível de módulo como pública, ela estará disponível para todos os procedimentos no projeto. No exemplo a seguir, a variável de seqüência de caracteres strMsg pode ser utilizada por qualquer procedimento em qualquer módulo do projeto.

' Insere a seção Declarações do módulo.

Public strMsg As String

Todos os procedimentos são públicos como padrão, exceto os procedimentos de evento. Quando o Visual Basic cria um procedimento de evento, a palavra-chave Private é automaticamente inserida antes da declaração do procedimento. Para todos os outros procedimentos, você deve declarar explicitamente o procedimento com a palavra-chave Private caso não deseje torná-lo público.

Você pode utilizar procedimentos, variáveis e constantes públicos definidos nos módulos padrão ou módulos de classe dos projetos de referência. No entanto, você deve primeiro definir uma referência ao projeto em que eles estão definidos.

Os procedimentos, variáveis e constantes públicos definidos em módulos que não sejam o padrão ou o de classe, como os módulos de formulário ou módulos de relatório, não estão disponíveis para os projetos de referência, pois esses módulos são privados ao projeto em que residem.


Compreendendo variantes

O tipo de dados Variant é automaticamente especificado caso você não especifique um tipo de dados quando declara uma constante, variável ou argumento. As variáveis declaradas como o tipo de dados Variant podem conter valores de seqüência de caracteres, de data, de hora, Boolean ou numéricos, e podem converter automaticamente os valores que contêm. Os valores numéricos Variant exigem 16 bytes de memória (o que é significativo apenas em grandes procedimentos ou módulos complexos) e o acesso a eles é mais lento do que a qualquer variável de outro tipo digitada explicitamente. Raramente você utiliza o tipo de dados Variant em uma constante. Os valores de seqüência de caracteres Variant exigem 22 bytes de memória.

As instruções a seguir criam variáveis Variant:

Dim myVar

Dim yourVar As Variant

aVar = "Texto."

A última instrução não declara explicitamente a variável theVar, mas declara a variável implícita ou automaticamente. As variáveis que são declaradas implicitamente são especificadas como o tipo de dados Variant.

Dica    Se você especificar um tipo de dados para uma variável ou argumento e, em seguida, utilizar o tipo de dados errado, ocorrerá um erro de tipo de dados. Para evitar erros de tipo de dados, utilize somente variáveis implícitas (o tipo de dados Variant) ou declare explicitamente todas as suas variáveis e especifique um tipo de dados. O último método é mais apropriado.


Compreendendo a sintaxe do Visual Basic

A sintaxe em um tópico da Ajuda do Visual Basic de um método, instrução ou função mostra todos os elementos necessários para que o método, instrução ou função seja utilizada corretamente. Os exemplos deste tópico ensinam a interpretar os elementos de sintaxe mais comuns.

Sintaxe do método Activate

object.Activate

Na sintaxe do método Activate, a palavra destacada em itálico "object" é um espaço reservado das informações que você fornece — neste caso, um código que retorna um objeto. As palavras destacadas em negrito devem ser digitadas exatamente como aparecem. Por exemplo, o procedimento a seguir ativa a segunda janela no documento ativo.

Sub MakeActive()

Windows(2).Activate

End Sub

Sintaxe da função MsgBox

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

Na sintaxe da função MsgBox, as palavras destacadas em negrito/itálico são os argumentos nomeados da função. Os argumentos colocados entre colchetes são opcionais. (Não digite os colchetes no código Visual Basic.) O único argumento que você deve fornecer para a função MsgBox é o texto do prompt.

Os argumentos das funções e métodos podem ser especificados no código pela posição ou pelo nome. Para especificar os argumentos por posição, siga a ordem apresentada na sintaxe, separando cada argumento com uma vírgula, por exemplo:

MsgBox "A sua resposta está correta!",0,"Caixa de Resposta "

Para especificar um argumento pelo nome, utilize o nome do argumento seguido por dois-pontos e um sinal de igualdade (:=) e o valor do argumento. Você pode especificar os argumentos nomeados em qualquer ordem, por exemplo:

MsgBox Title:="Caixa de Resposta ", Prompt:="A sua resposta está correta!"

A sintaxe das funções e de alguns métodos mostra os argumentos colocados entre parênteses. Como essas funções e métodos retornam valores, você deve colocar os argumentos entre parênteses para atribuir o valor a uma variável. Caso você ignore o valor de retorno ou não passe nenhum tipo de argumento, não inclua os parênteses. Os métodos que não retornam valores não precisam que os seus argumentos sejam colocados entre parênteses. Essas diretrizes se aplicam quer você esteja utilizando argumentos posicionais ou nomeados.

No exemplo a seguir, o valor de retorno da função MsgBox é um número que indica o botão selecionado que está armazenado na variável MyVar. Como o valor de retorno é utilizado, os parênteses são obrigatórios. Em seguida, outra caixa de mensagem exibirá o valor da variável.

Sub Question()

MyVar = MsgBox(Prompt:="Gosto do meu emprego.", _

Title:="Caixa de Resposta ", Buttons:="4")

MsgBox MyVar

End Sub

Sintaxe da instrução Option

Option Compare {Binary | Text | Database}

Na sintaxe da instrução Option Compare, as chaves e a barra vertical indicam uma escolha obrigatória entre três itens. (Não digite as chaves na instrução do Visual Basic). Por exemplo, a instrução a seguir especifica que, dentro do módulo, as seqüências de caracteres serão comparadas em uma ordem de classificação que não diferencia maiúsculas de minúsculas.

Option Compare Text0

Sintaxe da instrução Dim

Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As type]] . . .

Na sintaxe da instrução Dim, a palavra Dim é uma palavra-chave obrigatória. O único elemento obrigatório é varname (o nome da variável). Por exemplo, a instrução a seguir cria três variáveis: MyVar, nextVar e thirdVar. Elas são automaticamente declaradas como variáveis Variant.

Dim MyVar, nextVar, thirdVar

O exemplo a seguir declara uma variável como uma String. A inclusão de um tipo de dados poupa memória e pode ajudá-lo a encontrar erros no seu código.

Dim minhaResposta As String

Para declarar diversas variáveis em uma instrução, insira o tipo de dados para cada variável. As variáveis declaradas sem um tipo de dados são automaticamente declaradas como Variant.

Dim x As Integer, y As Integer, z As Integer

Na instrução a seguir, x e y são atribuídos ao tipo de dados Variant. Somente z é atribuído ao tipo de dados Integer.

Dim x, y, z As Integer

Caso você esteja declarando uma variável de matriz, você deve colocar parênteses. Os subscritos são opcionais. A instrução a seguir dimensiona uma matriz dinâmica, minhaMatriz.

Dim myArray()


Utilizando matrizes

Você pode declarar uma matriz para trabalhar com um conjunto de valores do mesmo tipo de dados. Uma matriz é uma variável única com muitos compartimentos para armazenar valores, enquanto uma variável típica tem somente um compartimento de armazenamento, no qual pode armazenar somente um valor. Consulte a matriz como um todo quando desejar fazer referência a todos os valores que ela armazena ou você pode consultar seus elementos individuais.

Por exemplo, para armazenar as despesas diárias de cada dia do ano, você pode declarar uma variável de matriz com 365 elementos, em vez de declarar 365 variáveis. Cada elemento de uma matriz contém um valor. A instrução a seguir declara a variável da matriz curExpense com 365 elementos. Como padrão, a indexação de uma matriz começa com zero, de modo que o limite superior da matriz é 364, em vez de 365.

Dim curExpense(364) As Currency

Para definir o valor de um elemento individual, especifique o índice do elemento. O exemplo a seguir atribui um valor inicial de 20 para todos os elementos da matriz.

Sub FillArray()

Dim curExpense(364) As Currency

Dim intI As Integer

For intI = 0 to 364

curExpense (intI) = 20

Next

End Sub

Alterando o limite inferior

Você pode utilizar a instrução Option Base na parte superior de um módulo para alterar o índice padrão do primeiro elemento de 0 para 1. No exemplo a seguir, a instrução Option Base altera o índice do primeiro elemento e a instrução Dim declara a variável da matriz curExpense com 365 elementos.

Option Base 1

Dim curExpense (365) As Currency

Você também pode definir explicitamente o limite inferior de uma matriz através da cláusula To, como mostra o exemplo a seguir.

Dim curExpense(1 to 365) As Currency

Dim strWeekDay(7 to 13) As String

Armazenando valores Variant em matrizes

Há duas formas de se criar matrizes de valores Variant. Uma delas é declarar uma matriz de tipo de dados Variant, como mostra o exemplo a seguir:

Dim varData(3) As Variant

varData(0) = "Ana Maria Souza"

varData(1) = "Alameda ABC, 4, suite 300"

varData(2) = 38

varData(3) = Format("06-09-1952", "General Date")

A outra forma é atribuir a matriz retornada pela função Array a uma variável Variant, como mostra o exemplo a seguir.

Dim varData As Variant

varData = Array("Roberto Souza", " Alameda ABC, 4, suite 300", 38, _

Format("06-09-1952", "General Date"))

Você identifica os elementos de uma matriz de valores Variant por índice, independente da técnica utilizada para criar a matriz. Por exemplo, a instrução a seguir pode ser adicionada a um dos exemplos acima.

MsgBox "Data de " & varData(0) & " foi gravada."

Utilizando matrizes multidimensionais

No Visual Basic, você pode declarar matrizes com até 60 dimensões. Por exemplo, a instrução a seguir declara uma matriz bidimensional de 5 por 10.

Dim sngMulti(1 To 5, 1 To 10) As Single

Se para você a matriz é uma matriz multidimensional, o primeiro argumento representa as linhas e o segundo, as colunas.

Utilize instruções aninhadas For...Next para processar as matrizes multidimensionais. O procedimento a seguir preenche uma matriz bidimensional com valores Single.

Sub FillArrayMulti()

Dim intI As Integer, intJ As Integer

Dim sngMulti(1 To 5, 1 To 10) As Single

' Preenche a matriz com valores.

For intI = 1 To 5

For intJ = 1 To 10

sngMulti(intI, intJ) = intI * intJ

Debug.Print sngMulti(intI, intJ)

Next intJ

Next intI

End Sub


Utilizando constantes

Freqüentemente, o seu código pode conter valores de constantes recorrentes ou pode depender de certos números difíceis de se lembrar, cujo significado não seja óbvio. A utilização de constantes pode facilitar a leitura e a manutenção do seu código. Uma constante é um nome significativo que assume o local de um número ou seqüência de caracteres que não pode ser alterado. Você não pode modificar uma constante ou atribuir um novo valor a ela, assim como pode com uma variável.

Há três tipos de constantes:

As constantes intrínsecas ou constantes definidas pelo sistema são fornecidas pelos aplicativos e controles. Os outros aplicativos que fornecem bibliotecas de objetos, como o Microsoft Access, o Microsoft Excel, o Microsoft Project , e o Microsoft Word também fornecem uma lista de constantes que você pode utilizar com os seus objetos, métodos e propriedades. Você pode obter uma listas das constantes fornecidas para as bibliotecas de objetos individuais no Pesquisador de objeto.

As constantes do Visual Basic são listadas na biblioteca de tipos do Visual Basic for Applications e na biblioteca do Data Access Object (DAO).

Observação   O Visual Basic continua a reconhecer constantes nos aplicativos criados nas versões anteriores do Visual Basic ou Visual Basic for Applications. Você pode atualizar as suas constantes àquelas listadas no Pesquisador de objeto. As constantes listadas no Pesquisador de objeto não precisam ser declaradas no seu aplicativo.

•	As constantes simbólicas ou definidas pelo usuário são declaradas através da instrução Const.

•	Constantes de compilação condicional são declaradas através da instrução #Const.

Nas versões anteriores do Visual Basic, os nomes das constantes eram em geral apresentados em letras maiúsculas separadas por sublinhados. Por exemplo:

TILE_HORIZONTAL

Atualmente, as constantes intrínsecas são qualificadas para evitar confusão quando há constantes com o mesmo nome em mais de uma biblioteca de objetos, às quais podem ter sido atribuídos diferentes valores. Há duas formas de qualificar os nomes de constante:

•	Por prefixo

•	Por referência de biblioteca

Qualificando as constantes por prefixo

As constantes intrínsecas fornecidas por todos os objetos aparecem em um formato cujo tamanho de letra é misto, com um prefixo de 2 caracteres que indica a biblioteca de objetos que define a constante. As constantes das bibliotecas de objetos do Visual Basic for Applications têm o prefixo "vb" e as constantes da biblioteca de objetos do Microsoft Excel têm o prefixo "xl". Os exemplos a seguir ilustram como variam os prefixos de controles personalizados, dependendo da biblioteca de tipos.

•	vbTileHorizontal

•	xlDialogBorder

Qualificando constantes por referência de biblioteca

Você também pode qualificar a referência a uma constante utilizando a sintaxe a seguir:

[[libname.] [modulename.]constname

A sintaxe para qualificar as constantes têm estas partes:

Parte	Descrição
libname	Opcional. O nome da biblioteca de tipos que define a constante. Na maioria dos controles personalizados (não disponível no Macintosh), este também é o nome de classe do controle. Caso você não se lembre o nome de classe do controle, posicione o ponteiro do mouse sobre o controle na caixa de ferramentas. O nome da classe será exibido na Dicas de ferramentas.
modulename	Opcional. O nome do módulo dentro da biblioteca de tipos que define a constante. Você pode encontrar o nome do módulo utilizando o Pesquisador de objeto.
constname	O nome definido para a constante na biblioteca de tipos.
Por exemplo:

Threed.LeftJustify


Utilizando os tipos de dados de forma eficiente

A menos que seja especificado de forma diferente, as variáveis não declaradas são atribuídas ao tipo de dados Variant. Este tipo de dados facilita a ´criação de programas, mas nem sempre é o tipo de dados mais eficiente a ser utilizado.

Você deve levar em consideração a utilização de outros tipos de dados se:

•	O seu programa for muito grande e utilizar muitas variáveis.

•	O seu programa tiver que ser executado com o máximo de velocidade possível.

•	Você gravar dados diretamente em arquivos de acesso aleatório.

Além de Variant, os tipos de dados que têm suporte incluem: Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object e String. Utilize a instrução Dim para declarar uma variável de um tipo específico, por exemplo:

Dim X As Integer

Essa instrução declara que uma variável X é um inteiro — um número entre –32.768 e 32.767. Caso você tente definir X como um número fora desse intervalo, ocorrerá um erro. Caso você tente definir X como uma fração, o número será arredondado. Por exemplo:

X = 32768	' Causa erro.

X = 5,9	' Define x como 6.


Utilizando instruções Do...Loop

Você pode utilizar instruções Do...Loop para executar um bloco de instruções um número indefinido de vezes. As instruções são repetidas enquanto uma condição for True ou até uma condição se tornar True.

Repetindo instruções enquanto uma condição for True

Há duas formas de se utilizar a palavra-chave While para se verificar uma condição em uma instrução Do...Loop. Você pode verificar a condição antes de entrar no loop ou pode verificá-la depois de o loop ser executado pelo menos uma vez.

No procedimento ChkFirstWhile a seguir, você verifica a condição antes de entrar no loop. Caso myNumber seja definido como 9 em vez de 20, as instruções dentro do loop jamais serão executadas. No procedimento ChkLastWhile, as instruções dentro do loop são executadas somente uma vez antes de a condição se tornar False.

Sub ChkFirstWhile()

counter = 0

myNumber = 20

Do While myNumber > 10

myNumber = myNumber - 1

counter = counter + 1

Loop

MsgBox "O loop concluiu " & counter & " repetições."

End Sub

Sub ChkLastWhile()

counter = 0

myNumber = 9

Do

myNumber = myNumber - 1

counter = counter + 1

Loop While myNumber > 10

MsgBox "O loop concluiu " & counter & " repetições."

End Sub

Repetindo instruções até uma condição se tornar True

Há duas formas de se utilizar a palavra-chave Until para verificar uma condição em uma instrução Do...Loop. Você pode verificar a condição antes de entrar no loop (como é mostrado no procedimento ChkFirstUntil, apresentado a seguir) ou pode verificá-la depois de o loop ser executado pelo menos uma vez (como é mostrado no procedimento ChkLastUntil, apresentado a seguir). O loop continuará enquanto a condição permanecer False.

Sub ChkFirstUntil()

counter = 0

myNumber = 20

Do Until myNumber = 10

myNumber = myNumber - 1

counter = counter + 1

Loop

MsgBox "O loop concluiu " & counter & " repetições."

End Sub

Sub ChkLastUntil()

counter = 0

myNumber = 1

Do

myNumber = myNumber ++1

counter = counter + 1

Loop Until myNumber = 10

MsgBox "O loop concluiu " & counter & " repetições."

End Sub

Saindo de uma instrução Do...Loop de dentro do loop

Você pode sair de Do...Loop utilizando a instrução Exit do. Por exemplo, para sair de um loop contínuo, utilize a instrução Exit Do no bloco de instruções True de uma instrução If...Then...Else ou uma instrução Select Case. Caso a condição seja False, o loop será executado do modo normal.

No exemplo a seguir, myNumber é atribuído a um valor que cria um loop contínuo. A instrução If...Then...Else verifica essa condição e, em seguida, sai, impedindo um loop contínuo.

Sub ExitExample()

counter = 0

myNumber = 9

Do Until myNumber = 10

myNumber = myNumber - 1

counter = counter + 1

If myNumber < 10 Then Exit Do

Loop

MsgBox "O loop concluiu " & counter & " repetições."

End Sub

Observação   Para interromper um loop contínuo, pressione ESC ou CTRL+BREAK.


Utilizando instruções For...Next

Você pode utilizar instruções For...Next para repetir um bloco de instruções um determinado número de vezes. Os loops For utilizam uma variável de contador cujo valor é aumentado ou diminuído a cada repetição do loop.

O procedimento a seguir faz com que o computador emita 50 avisos sonoros. A instrução For especifica a variável de contador x e seus valores inicial e final. A instrução Next incrementa a variável de contador em uma unidade.

Sub Beeps()

For x = 1 To 50

Beep

Next x

End Sub

Utilizando a palavra-chave Step, você pode aumentar ou diminuir a variável de contador pelo valor especificado. No exemplo a seguir, a variável de contador j é incrementada em 2 cada vez que o loop se repete. Quando o loop terminar, total será a soma de 2, 4, 6, 8 e 10.

Sub TwosTotal()

For j = 2 To 10 Step 2

total = total + j

Next j

MsgBox "O total é " & total

End Sub

Para diminuir a variável de contador, utilize um valor Step negativo. Para diminuir a variável de contador, você deve especificar um valor final que seja inferior ao valor inicial. No exemplo a seguir, a variável de contador meuNúm é reduzida em duas unidades cada vez que o loop se repete. Quando o loop terminar, total será a soma de 16, 14, 12, 10, 8, 6, 4 e 2.

Sub NewTotal()

For myNum = 16 To 2 Step -2

total = total + myNum

Next myNum

MsgBox "O total é " & total

End Sub

Observação   Não é preciso incluir o nome da variável de contador depois da instrução Next. Nos exemplos apresentados acima, o nome da variável foi incluído para deixá-los mais legíveis.

Você pode sair de uma instrução For...Next antes que o contador atinja o seu valor final utilizando a instrução Exit for. Por exemplo, quando ocorrer um erro, utilize a instrução Exit For no bloco de instruções True de uma instrução If...Then...Else ou uma instrução Select Case que verifica especificamente o erro. Caso não ocorra o erro, a instrução If…Then…Else será False e a execução do loop continuará conforme esperado.


Utilizando instruções For Each...Next

As instruções For Each...Next repetem um bloco de instruções para cada objeto de uma coleção ou cada elemento de uma matriz. O Visual Basic define automaticamente uma variável todas as vezes que o loop for executado. Por exemplo, o procedimento a seguir fecha todos os formulários, exceto o formulário que contém o procedimento que está sendo executado.

Sub CloseForms()

For Each frm In Application.Forms

If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close

Next

End Sub

O código a seguir executa um loop em cada elemento de uma matriz e define o valor de cada um deles como o valor da variável de índice I.

Dim TestArray(10) As Integer, I As Variant

For Each I In TestArray

TestArray(I) = I

Next I

Executando loop em um intervalo de células

Utilize um loop For Each...Next para executar um loop nas células de um intervalo. O procedimento a seguir executa um loop no intervalo A1:D10 da Plan1 e define qualquer número cujo valor absoluto seja inferior a 0,01 até 0 (zero).

Sub RoundToZero()

For Each MyObj in myCollection

If Abs(MyObject.Value) < 0.01 Then MyObject.Value = 0

Next

End Sub

Saindo de um loop For Each...Next antes de seu término

Você pode sair de um loop For Each...Next utilizando a instrução Exit For. Por exemplo, quando ocorrer um erro, utilize a instrução Exit For no bloco de instruções True de uma instrução If...Then...Else ou uma instrução Select Case que verifica especificamente o erro. Caso não ocorra o erro, a instrução If…Then…Else será False e a execução do loop continuará conforme esperado.

O exemplo a seguir testa a primeira célula do intervalo A1:B5 que não contenha um número. Se for encontrada uma célula desse tipo, será exibida uma mensagem e Exit For sairá do loop.

Sub TestForNumbers()

For Each MyObject In MyCollection

If IsNumeric(MyObject.Value) = False Then

MsgBox "Objeto contém um valor não-numérico."

Exit For

End If

Next c

End Sub


Utilizando instruções If...Then...Else

Você pode utilizar a instrução If...Then...Else para executar uma instrução específica ou um bloco de instruções, dependendo do valor de uma condição. As instruções If...Then...Else podem ser aninhadas em tantos níveis quanto você necessitar. No entanto, para uma melhor legibilidade, convém utilizar uma instrução Select Case em vez de criar múltiplos níveis de instruções If...Then...Else aninhadas.

Executando instruções caso uma condição seja True

Para executar somente uma instrução quando uma condição for True, utilize a sintaxe de uma linha da instrução If...Then...Else. O exemplo a seguir mostra a sintaxe de uma linha, omitindo a palavra-chave Else:

Sub FixDate()

myDate = #2/13/95#

If myDate < Now Then myDate = Now

End Sub

Para executar mais de uma linha de código, você deve utilizar a sintaxe de múltiplas linhas. Essa sintaxe inclui a instrução End If, como mostra o exemplo a seguir:

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = "Red"

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

End If

End Sub

Executando determinadas instruções caso uma condição seja True e executando outras, caso ela seja False

Utilize uma instrução If...Then...Else para definir dois blocos de instruções executáveis: um bloco é executado caso a condição seja True, o outro bloco é executado caso a condição seja False.

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = vbRed

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

Else

AlertLabel.Forecolor = vbBlack

AlertLabel.Font.Bold = False

AlertLabel.Font.Italic = False

End If

End Sub

Testando uma segunda condição caso a primeira condição seja False

Você pode adicionar instruções ElseIf a uma instrução If...Then...Else para testar uma segunda condição caso a primeira condição seja False. Por exemplo, o procedimento de função a seguir computa um bônus com base no cargo. A instrução posterior a instrução Else é executada caso as condições em todas as instruções If e ElseIf sejam False.

Function Bonus(performance, salary)

If performance = 1 Then

Bonus = salary * 0.1

ElseIf performance = 2 Then

Bonus = salary * 0.09

ElseIf performance = 3 Then

Bonus = salary * 0.07

Else

Bonus = 0

End If

End Function


Utilizando parênteses em código

Como os procedimentos Sub, as instruções internas e alguns métodos não retornam um valor, os argumentos não são colocados entre parênteses. Por exemplo:

MySub "stringArgument", integerArgument

Os procedimentos Function, as funções internas e alguns métodos retornam um valor, mas você pode ignorá-lo. Caso ignore o valor de retorno, não inclua parênteses. Chame a função da mesma maneira que chamaria um procedimento Sub. Omita os parênteses, liste os argumentos e não atribua a função a uma variável. Por exemplo:

MsgBox "Tarefa concluída!", 0, "Caixa de tarefa "

Para utilizar o valor de retorno de uma função, coloque os argumentos entre parênteses, como mostra o exemplo a seguir.

Answer3 = MsgBox("Você está satisfeito com o seu salário?", 4, "Pergunta 3")

Uma instrução em um procedimento Sub ou Function pode passar valores para um procedimento chamado utilizando argumentos nomeados. Devem ser levadas em consideração as diretrizes quanto ao uso de parênteses, independente de você utilizar argumentos nomeados. Quando você utiliza argumentos nomeados, pode listá-los em qualquer ordem, além de poder omitir os argumentos opcionais. Os argumentos nomeados são sempre seguidos de dois-pontos e um sinal de igualdade (:=) e, em seguida, o valor do argumento.

O exemplo a seguir chama a função MsgBox utilizando argumentos nomeados, mas ignora o valor de retorno:

MsgBox Title:="Caixa de tarefa ", Prompt:="Tarefa concluída!"

O exemplo a seguir chama a função MsgBox utilizando argumentos nomeados e atribui o valor de retorno à variável resposta3:

answer3 = MsgBox(Title:="Pergunta 3", _

Prompt:="Você está satisfeito com o seu salário?", Buttons:=4)


Utilizando instruções Select Case

Utilize a instrução Select Case como uma alternativa a ElseIf nas instruções If...Then...Else ao comparar uma expressão a diversos valores diferentes. Enquanto as instruções If...Then...Else podem avaliar uma expressão diferente em cada instrução ElseIf, a instrução Select Case avalia uma expressão somente uma vez, na parte superior da estrutura de controle.

No exemplo a seguir, a instrução Select Case avalia o argumento desempenho, que é passado para o procedimento. Observe que cada instrução Case pode conter mais de um valor, um intervalo de valores ou uma combinação de valores e operadores de comparação. A instrução Case Else opcional será executada caso a instrução Select Case não combine com um valor em uma das instruções Case.

Function Bonus(performance, salary)

Select Case performance

Case 1

Bonus = salary * 0.1

Case 2, 3

Bonus = salary * 0.09

Case 4 To 6

Bonus = salary * 0.07

Case Is > 8

Bonus = 100

Case Else

Bonus = 0

End Select

End Function


Utilizando instruções With

A instrução With permite que você especifique um objeto ou um tipo definido pelo usuário uma vez para toda uma série de instruções. As instruções With fazem os seus procedimentos serem executados com mais rapidez e ajudam a evitar digitação repetitiva.

O exemplo a seguir preenche um intervalo de células com o número 30, aplica a formatação negrito e define como amarelo a cor interna das células.

Sub FormatRange()

With Worksheets("Planilha1").Range("A1:C10")

.Value = 30

.Font.Bold = True

.Interior.Color = RGB(255, 255, 0)

End With

End Sub

Para melhor eficiência, você pode aninhar as instruções With. O exemplo a seguir insere uma fórmula na célula A1 e, em seguida, formata a fonte.

Sub MyInput()

With Workbooks("Livro1").Worksheets("Planilha1").Cells(1, 1)

.Formula = "=SQRT(50)"

With .Font

.Name = "Arial"

.Bold = True

.Size = 8

End With

End With

End Sub


Regras de nomenclatura do Visual Basic

Utilize as seguintes regras quando nomear procedimentos, constantes, variáveis e argumentos em um módulo do Visual Basic:

•	Você deve utilizar uma letra como o primeiro caractere.

•	Você não pode utilizar um espaço, ponto (.), ponto de exclamação (!) ou os caracteres @, &, $, # no nome.

•	nome pode ter no máximo 255 caracteres de comprimento.

•	Geralmente, você não deve utilizar nomes iguais às funções, instruções e métodos do Visual Basic. Você acaba encobrindo as mesmas palavras-chave na linguagem. Para utilizar uma função, instrução ou método intrínsecos da linguagem que entre em conflito com um nome atribuído, você deve identificá-lo explicitamente. Preceda o nome da função, instrução ou método intrínseco com o nome da biblioteca de tipos a que está associado. Por exemplo, se você tiver uma variável chamada Left, só poderá invocar a função Left utilizando VBA.Left.

•	Você não pode repetir nomes dentro do mesmo nível de escopo. Por exemplo, você não pode declarar duas variáveis com o nome idade dentro do mesmo procedimento. No entanto, é possível declarar uma variável privada com o nome idade e uma variável em nível de procedimento com o nome idade dentro do mesmo módulo.

Observação   O Visual Basic não diferencia maiúsculas de minúsculas, mas preserva a colocação em maiúsculas na instrução em que o nome for declarado.


Trabalhando entre aplicativos

O Visual Basic pode criar novos objetos e recuperar objetos existentes de muitos aplicativos da Microsoft. Outros aplicativos também podem fornecer objetos que poderão ser criados através do Visual Basic. Para obter mais informações, consulte a documentação do aplicativo.

Para criar um novo objeto ou obter um objeto existente de outro aplicativo, utilize a função CreateObject ou GetObject:

' Inicia o Microsoft Excel e cria um novo objeto PlanilhadeTrabalho.

Set ExcelWorksheet = CreateObject("Excel.Sheet")

' Inicia o Microsoft Excel e abre um objeto PlanilhadeTrabalho existente.

Set ExcelWorksheet = GetObject("PLANILHA1.XLS")

' Inicia o Microsoft Word.

Set WordBasic = CreateObject("Word.Basic")

A maioria dos aplicativos fornece um método Exit ou Quit que fecha o aplicativo independente de ele estar visível. Para obter mais informações sobre os objetos, métodos e propriedades fornecidas por um aplicativo, consulte a documentação do aplicativo.

Alguns aplicativos permitem que você utilize a palavra-chave New para criar um objeto de qualquer classe existente na sua biblioteca de tipos. Por exemplo:

Dim X As New Field

Nesse caso, Field é um exemplo de uma classe na biblioteca de tipos de acesso a dados. Uma nova ocorrência de um objeto Field é criada através dessa sintaxe. Para obter informações sobre as classes de objeto que podem ser criadas dessa forma, consulte a documentação do aplicativo.


Escrevendo um procedimento Function

Um procedimento Function é uma série de instruções do Visual Basic colocadas entre as instruções Function e End Function. Um procedimento Function é semelhante a um procedimento Sub, mas uma função também pode retornar um valor. Um procedimento Function pode utilizar argumentos, como constantes, variáveis ou expressões passadas para ele por um procedimento de chamada. Caso um procedimento Function não tenha argumentos, sua instrução Function deve incluir um conjunto de parênteses vazio. Uma função retorna um valor atribuindo um valor ao seu nome em uma ou mais instruções do procedimento.

No exemplo a seguir, a função Celsius calcula o número de graus Celsius a partir dos graus Fahrenheit. Quando a função for chamada a partir do procedimento Main, uma variável que contém o valor do argumento será passada para a função. O resultado do cálculo é retornado para o procedimento de chamada e exibido em uma caixa de mensagem.

Sub Main()

temp = Application.InputBox(Prompt:= _

"Digite a temperatura em graus F.", Type:=1)

MsgBox "A temperatura é " & Celsius(temp) & " graus C."

End Sub

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function


Escrevendo um procedimento Property

Um procedimento Property é uma série de instruções do Visual Basic que permite que um programador crie e manipule propriedades personalizadas.

•	Os procedimentos Property podem ser utilizados para criar propriedades somente leitura para formulários, módulos padrão e módulos de classe.

•	Os procedimentos Property devem ser utilizados em vez de variáveis Public em um código que deve ser executado quando o valor da propriedade for definido.

•	Ao contrário das variáveis Public, os procedimentos Property podem ter seqüências de caracteres da Ajuda atribuídas a eles no Pesquisador de objeto.

Quando você cria um procedimento Property , ele se torna uma propriedade do módulo que contém o procedimento. O Visual Basic fornece os três tipos de procedimentos Property apresentados a seguir:

Procedimento	Descrição
Property Let	Um procedimento que define o valor de uma propriedade.
Property Get	Um procedimento que retorna o valor de uma propriedade.
Property Set	Um procedimento que define uma referência a um objeto.
A sintaxe para a declaração de um procedimento Property é:

[Public | Private] [Static] Property {Get | Let | Set} propertyname_ [(arguments)] [As type]

instruções

End Property

Geralmente, os procedimentos Property são utilizados em pares: Property Let com Property Get e Property Set com Property Get. A declaração de um procedimento Property Get sozinho corresponde à declaração de uma propriedade somente leitura. A utilização dos três tipos de procedimento Property ao mesmo tempo aplica-se somente às variáveis Variant, pois somente uma Variant pode conter um objeto ou informações sobre outro tipo de dados. Property Set é utilizada com objetos; ao contrário de Property Let.

Os argumentos obrigatórios nas declarações de procedimento Property são mostrados na tabela a seguir:

Procedimento	Sintaxe da declaração
Property Get	Property Get propname(1, …, n) As type
Property Let	Property Let propname(1, …,,,, n, n+1)
Property Set	Property Set propname(1, …, n, n+1)
Os argumentos do primeiro ao penúltimo (1, …, n) devem compartilhar os mesmos nomes e tipos de dados em todos os procedimentos Property com o mesmo nome.

Uma declaração do procedimento Property Get utiliza um argumento a menos do que as declarações Property Let e Property Set relacionadas. O tipo de dados do procedimento Property Get deve ser igual ao mesmo tipo de dados que o tipo de dados do último argumento (n+1) nas declarações Property Let e Property Set relacionadas. Por exemplo, caso você declare o procedimento Property Let apresentado a seguir, a declaração Property Get deve utilizar argumentos com o mesmo nome e tipo de dados que os argumentos no procedimento Property Let.

Property Let Names(intX As Integer, intY As Integer, varZ As Variant)

' Instrução aqui.

End Property

Property Get Names(intX As Integer, intY As Integer) As Variant

' Instrução aqui.

End Property

O tipo de dados do argumento final em uma declaração Property Set deve ser um tipo de objeto ou uma Variant.


Escrevendo um procedimento Sub

Um procedimento Sub é uma série de instruções do Visual Basic colocada entre as instruções Sub e End Sub que executam ações, mas não retornam um valor. Um procedimento Sub pode utilizar argumentos, como constantes, variáveis ou expressões passadas por um procedimento de chamada. Caso um procedimento Sub não tenha argumentos, a instrução Sub deve incluir um conjunto de parênteses vazios.

O procedimento Sub a seguir tem comentários que explicam cada linha.

' Declara um procedimento nomeado GetInfo

' Este procedimento Sub não utiliza argumentos

Sub GetInfo()

' Declara uma variável de seqüência de caracteres nomeada answer

Dim answer As String

' Atribui o valor de retorno da função InputBox à answer

answer = InputBox(Prompt:="Qual é o seu nome?")

' Instrução condicional If...Then...Else

If answer = Empty Then

' Chama a função MsgBox

MsgBox Prompt:="Você não digitou um nome."

Else

' Função MsgBox concatenou com a variável answer

MsgBox Prompt:="O seu nome é " & answer

' Encerra a instrução If...Then...Else

End If

' Encerra o procedimento Sub

End Sub


Escrevendo instruções de atribuição

As instruções de atribuição atribuem um valor ou expressão a uma variável ou constante. As instruções de atribuição sempre incluem um sinal de igualdade (=). O exemplo a seguir atribui o valor de retorno da função InputBox à variável yourName.

Sub Question()

Dim yourName As String

yourName = InputBox("Qual é o seu nome?")

MsgBox "Seu nome é " & yourName

End Sub

A instrução Let é opcional e geralmente é omitida. Por exemplo, a instrução de atribuição apresentada acima pode ser gravada

Let yourName = InputBox("Qual é o seu nome?").

A instrução Set é utilizada para atribuir um objeto a uma variável que foi declarada como um objeto. A palavra-chave Set é obrigatória. No exemplo a seguir, a instrução Set atribui um intervalo na Planilha1 à variável de objeto myCell:

Sub ApplyFormat()

Dim myCell As Range

Set myCell = Worksheets("Planilha1").Range("A1")

With myCell.Font

.Bold = True

.Italic = True

End With

End Sub

As instruções que definem os valores de propriedade também são instruções de atribuição. O exemplo a seguir define a propriedade Bold do objeto Font para a célula ativa:

ActiveCell.Font.Bold = True


Escrevendo instruções de declaração

As instruções de declaração são utilizadas para nomear e definir procedimentos, variáveis, matrizes e constantes. Quando você declara um procedimento, variável ou constante, também pode definir o seu escopo, dependendo do local em que for inserida a declaração e das palavras-chave utilizadas para declará-lo.

O exemplo a seguir contém três declarações.

Sub ApplyFormat()

Const limite As Integer = 33

Dim minhaCélula As Range

' Mais instruções

End Sub

A instrução Sub (com a instrução End Sub correspondente) declara um procedimento nomeado ApplyFormat. Todas as instruções entre as instruções Sub e End Sub serão executadas sempre que o procedimento ApplyFormat for chamado ou executado.

•	Escrevendo um procedimento Sub

A instrução Const declara a constante limite, especificando o tipo de dados Integer e um valor 33.

•	Declarando constantes

A instrução Dim declara a variável minhaCélula. O tipo de dados é um objeto, neste caso, um objeto Range do Microsoft Excel. Você pode declarar uma variável como qualquer objeto exposto no aplicativo que está sendo utilizado. As instruções Dim são um tipo de instrução utilizada para declarar variáveis. Outras palavras-chaves utilizadas em declarações são ReDim, Static, Public, Private e Const.

•	Declarando variáveis


Escrevendo instruções executáveis

Uma instrução executável inicia uma ação. Ela pode executar um método ou função e pode executar loops ou desviar-se pelos blocos de código. Freqüentemente, as instruções executáveis contêm operadores matemáticos ou condicionais.

O exemplo a seguir utiliza uma instrução For Each...Next para iterar pelas células de um intervalo nomeado MeuIntervalo na Planilha1 de uma pasta de trabalho do Microsoft Excel. A variável c é uma célula na coleção de células contidas em MeuIntervalo.

Sub ApplyFormat()

Const limite As Integer = 33

For Each c In Worksheets("Planilha1").Range("MeuIntervalo").Cells

If c.Value > limite Then

With c.Font

.Bold = True

.Italic = True

End With

End If

Next c

MsgBox "Pronto!"

End Sub

A instrução If...Then...Else, no exemplo, verifica o valor da célula. Caso o valor seja superior a 33, a instrução With definirá as propriedades Bold e Italic do objeto Font dessa célula. As instruções If...Then...Else terminam com End If.

A instrução With pode poupar o trabalho de digitação, pois as instruções que ela contém são automaticamente executadas no objeto posterior a palavra-chave With.

A instrução Next chama a próxima célula na coleção de células contidas em MeuIntervalo.

A função MsgBox (que exibe uma caixa de diálogo interna do Visual Basic) exibe uma mensagem que indica que a execução do procedimento Sub foi concluída.


Gravando dados em arquivos

Quando se trabalha com grandes quantidades de dados, é conveniente freqüentemente gravar dados em um arquivo ou ler dados de um arquivo. A instrução Open permite que você crie e acesse arquivos diretamente. Open fornece três tipos de acesso a arquivo:

•	Acesso seqüencial (modos Input, Output e Append) é utilizado na gravação de arquivos de texto, como logs e relatórios de erros.

•	Acesso aleatório (modo Random) é utilizado para ler e gravar dados em um arquivo sem fechá-lo. O acesso aleatório a arquivos mantém os dados em registros, o que agiliza a localização das informações.

•	Acesso binário (modo Binary) é utilizado para ler ou gravar dados em qualquer posição de byte em um arquivo, como no armazenamento ou exibição de uma imagem de bitmap.

Observação   A instrução Open não deve ser utilizada para abrir os tipos de arquivo do próprio aplicativo. Por exemplo, não utilize Open para abrir um documento do Word, uma planilha do Microsoft Excel ou um banco de dados do Microsoft Access. Se você agir dessa forma, o arquivo terá a sua integridade perdida e será corrompido.

A tabela a seguir mostra as instruções que normalmente são utilizadas ao gravar ou ler dados em/de arquivos.

Tipo de acesso	Gravando dados	Lendo dados
Sequential	Print #, Write #	Input #
Random	Put	Get
Binary	Put	Get


Escrevendo instruções do Visual Basic

Uma instrução no Visual Basic é uma instrução completa. Ela pode conter palavras-chave, operadores, variáveis, constantes e expressões. Cada instrução pertence a uma das três categorias seguintes:

•	As instruções de declaração, que nomeiam uma variável, constante ou procedimento e também podem especificar um tipo de dados.

Escrevendo instruções de declaração

•	Instruções de atribuição, que atribuem um valor ou uma expressão a uma variável ou constante.

Escrevendo instruções de atribuição

•	Instruções executáveis, que iniciam ações. Essas instruções podem executar um método ou função e podem executar loops ou desviar-se pelos blocos de código. Freqüentemente, as instruções executáveis contêm operadores matemáticos ou condicionais.

Escrevendo instruções executáveis

Continuando uma instrução através de múltiplas linhas

Normalmente, uma instrução cabe em apenas uma linha, mas, se utilizar um caractere de continuação de linha, você poderá continuar uma instrução até a linha seguinte. No exemplo a seguir, a instrução executável MsgBox ocupa três linhas:

Sub DemoBox()  'Este procedimento declara uma variável de seqüência de caracteres,

' atribui-lhe o valor Ana Maria e, em seguida, exibe

' uma mensagem concatenada.

Dim MyVar As String

MyVar = "João"

MsgBox Prompt:="Oi, " & MyVar, _

Title:="Caixa de cumprimentos", _

Buttons:=vbExclamation

End Sub

Adicionando comentários

Os comentários podem explicar um determinado procedimento ou instrução para a pessoa que esteja lendo o código. O Visual Basic ignora os comentários ao executar os seus procedimentos. As linhas de comentário começam com um apóstrofo (') ou com Rem seguido de um espaço, e podem ser adicionadas a qualquer parte de um procedimento. Para adicionar um comentário a uma linha que contém uma instrução, insira um apóstrofo depois da instrução, seguido pelo comentário. Como padrão, os comentários são exibidos através de texto em verde.

Verificando erros de sintaxe

Se pressionar ENTER depois de digitar uma linha de código, e a linha aparecer em vermelho (também pode ser exibida uma mensagem de erro), procure um erro na sua instrução e, em seguida, corrija-o.


Utilizando o Gerenciador de suplementos

Use the Add-In Manager dialog box to load or unload an add-in. If you close only the visible portions of an add-in—by double-clicking its system menu or by clicking its close button, for example—its forms disappear from the screen, but the add-in is still present in memory. O próprio objeto suplemento sempre ficará residente na memória até que o suplemento seja desconectado por meio da caixa de diálogo Gerenciador de suplementos.