Вы находитесь на странице: 1из 96

Sumário

1. ORIENTAÇÃO A EVENTOS...............................................................................................................2
1.1. ORDEM DE EXECUÇÃO DOS EVENTOS....................................................................................3
2. NORMAS DE NOMENCLATURA......................................................................................................5
2.1. JANELA DE CÓDIGO .....................................................................................................................6
3. VARIÁVEIS............................................................................................................................................7
3.1. DECLARAÇÃO DE VARIÁVEIS ...................................................................................................7
3.2. OPERADORES...............................................................................................................................11
3.2.4. PRECEDÊNCIAS ........................................................................................................................11
4. ESTRUTURAS DE PROGRAMAÇÃO .............................................................................................12
4.1. COMANDOS CONDICIONAIS ....................................................................................................12
4.2. COMANDOS DE LAÇOS CONDICIONAIS ................................................................................13
5.1. ACESSO RANDÔMICO ................................................................................................................15
5.2. ACESSO SEQUENCIAL................................................................................................................18
5.3. ACESSO BINÁRIO ........................................................................................................................20
6. PROCEDIMENTOS - FUNÇÕES E SUBROTINAS........................................................................25
6.1. ARGUMENTOS BYVAL E BYREF .............................................................................................26
6.2. ARGUMENTOS OPCIONAIS .......................................................................................................27
7. UTILIZAÇÃO DE OBJETOS DO ACCESS.....................................................................................28
7.1. OBJETO DOCMD ..........................................................................................................................28
7.2. OBJETO SCREEN..........................................................................................................................28
8. TRATAMENTO DE ERROS..............................................................................................................29

9. LINGUAGEM SQL.............................................................................................................................35
9.1. LINGUAGEM DE MANIPULAÇÃO DE DADOS .......................................................................35
9.2.1. INSTRUÇÃO CREATE TABLE .................................................................................................40
9.2.2. INSTRUÇÃO CREATE INDEX .................................................................................................40
9.2.3. INSTRUÇÃO DROP TABLE OU DROP INDEX .......................................................................41
9.2.4. INSTRUÇÃO ALTER TABLE....................................................................................................41
9.2.5. CLÁUSULA CONSTRAINT.......................................................................................................42
9.3. FUNÇÕES AGREGADAS .............................................................................................................42
10. TÉCNICAS DE PESQUISA DE DADOS.........................................................................................43
10.1. MÉTODO FIND............................................................................................................................45
10.2. MÉTODO SEEK ...........................................................................................................................47
11. INTEGRANDO COM O OFFICE 2000...........................................................................................50
11.1 FUNÇÕES CREATEOBJECT E GETOBJECT ............................................................................51
11.2. INSTANCIANDO O MICROSOFT WORD ................................................................................52
11.3. INSTANCIANDO O MICROSOFT EXCEL................................................................................53
11.4. INSTANCIANDO O MICROSOFT ACCESS .............................................................................55
12. EXERCÍCIOS PROPOSTOS............................................................................................................57

ANEXO 1 ..................................................................................................................................................59

ANEXO 2 ..................................................................................................................................................73

1
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

1. ORIENTAÇÃO A EVENTOS
Um evento é uma ação específica que ocorre sobre e/ou com um
determinado objeto. O Access pode responder a vários eventos simultaneamente,
como por exemplo: cliques de mouse, alterações em dados, abertura ou
fechamento de formulários e muitos outros. Os eventos são, geralmente, o
resultado de uma ação do usuário. Podemos criar a nossa própria resposta a um
evento através de um procedimento de evento ou de uma macro.
Quando você cria um procedimento de evento para um objeto, o Microsoft
Access adiciona um modelo de procedimento de evento nomeado para o evento do
objeto formulário ou o objeto relatório. Tudo o que você precisa fazer é adicionar o
código que responda às ações quando ocorrer(em) o(s) evento(s) para o formulário
ou relatório.
Abaixo a lista de eventos disponíveis em ordem alfabética:

Evento Propriedade do Evento


Activate Ao Ativar
AfterDelConfirm Após Confirmar Exclusão
AfterInsert Após Inserir
AfterUpdate Após Atualizar
ApplyFilter Ao Aplicar Filtro
BeforeDelConfirm Antes De Confirmar Exclusão
BeforeInsert Antes De Inserir
BeforeUpdate Antes De Atualizar
Change Ao Alterar
Click Ao Clicar
Close Ao Fechar
Current No Atual
DblClick Ao Clicar Duas Vezes
Deactivate Ao Desativar
Delete Ao Excluir
Enter Ao Entrar
Error Ao Ocorrer Erro
Exit Ao Sair
Filter Ao Filtrar
Format Ao Formatar
GotFocus Ao Receber Foco
Initialize nenhuma
ItemAdded nenhuma
ItemRemoved nenhuma
KeyDown Ao Apertar Tecla
KeyPress Ao Pressionar Tecla
KeyUp Ao Liberar Tecla
Load Ao Carregar
LostFocus Ao Perder Foco
MouseDown Ao Apertar Mouse
MouseMove Ao Mover Mouse
MouseUp Ao Liberar Mouse
NoData Se Nenhum Dado
NotInList Se Não Estiver Na Lista
Open Ao Abrir
Page Na Página
Print Ao Imprimir
Resize Ao Redimensionar

2
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Evento Propriedade do Evento


Retreat Ao Retirar
Terminate nenhuma
Timer No Cronômetro
Unload Ao Descarregar
Updated Ao Atualizar
Tabela 1 - Eventos

Uma única ação pode acionar vários eventos que ocorrem em uma
seqüência específica, visto que a execução do Visual Basic se dá de modo
assíncrono, ou seja, o processador pode executar diversas tarefas simultaneamente
todas elas independentes umas das outras, sem necessariamente uma ter que
encerrar para iniciar à outra, ou uma ficar aguardando a outra. Portanto, é muito
importante saber em que ordem os eventos acontecem, porque isso pode afetar a
sua execução.

1.1. ORDEM DE EXECUÇÃO DOS EVENTOS

Movendo o foco para um controle:


Enter (Ao entrar) GotFocus (Ao receber foco)

Abrindo um formulário:
Open (Ao abrir) Activate (Ao ativar) Current (No atual) Enter
(Ao entrar) GotFocus (Ao receber foco)

Abandonando um controle num formulário:


Exit (Ao sair) LostFocus (Ao perder foco)

Movendo o foco para um outro controle:


Exit (Ao sair) LostFocus (Ao perder foco) Enter (Ao entrar) GotFocus
(Ao receber foco)

Fechando um formulário:
Exit (Ao sair) LostFocus (Ao perder foco) Unload (Ao descarregar)
Deactivate (Ao desativar) Close (Ao fechar)

Alterando e atualizando dados em um controle:


BeforeUpdate (Antes de atualizar) AfterUpdate (Depois de atualizar)
Exit (Ao sair) LostFocus (Ao perder foco)

Alterando o conteúdo de uma caixa de texto


Change (Ao alterar) BeforeUpdate (Antes de atualizar) AfterUpdate
(Depois de atualizar)

Pressionando uma tecla em uma caixa de texto:


KeyDown (Ao apertar tecla) KeyPress (Ao pressionar tecla) Change
(Ao alterar) KeyUp (Ao liberar tecla)

3
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Excluindo um registro:
Delete (Ao excluir) BeforeDelConfirm (Confirmar antes de excluir)
AfterDelConfirm (Após confirmar exclusão)

Criando um novo registro:


Current (No atual) Enter (Ao entrar) GotFocus (Ao receber foco)
BeforeInsert (Antes de inserir) AfterInsert (Depois de inserir)

Abrindo um formulário:
Open (Ao abrir) Load (Ao carregar) Resize (Ao redimensionar)
Activate (Ao ativar) Current (No atual)

Fechando um formulário:
Unload (Ao descarregar) Deactivate (Ao desativar) Close (Ao fechar)

Clicando em um outro controle:


No primeiro controle:
Exit (Ao sair) LostFocus (Ao perder foco)

No segundo controle:
Enter (Ao entrar) GotFocus (Ao receber foco) MouseDown
(Ao apertar mouse) MouseUp (Ao liberar mouse) Click (Ao clicar)

Imprimindo ou visualizando um relatório:


Open (Ao abrir) Activate (Ao ativar) Format (Ao formatar) Print
(Ao imprimir) Close (Ao fechar) Deactivate (Ao desativar)

Sempre que manipulamos os objetos do Access devemos saber que eles


estão abaixo do objeto Application, que se refere ao aplicativo ativo de banco de
dados, conforme demonstra o esquema abaixo:

Figura 1 - Objeto Application

Este objeto contém todas as coleções e objetos do Microsoft Access,


incluindo a coleção de formulários (Forms), a coleção de relatórios (Reports), a
coleção de módulos (Modules), a coleção de referências (References), o objeto de
tela (Screen) e o objeto de executar ações (DoCmd).
Você pode utilizar o objeto Application para aplicar definições de
propriedades ou métodos a todo o aplicativo do Microsoft Access. Um exemplo seria
utilizar o método SetOption do objeto Application para definir uma das opções do
banco de dados, selecionar a caixa de Barra de Status na guia Exibir da janela de
diálogo Opções do menu Ferramentas. Application.SetOption "Mostrar Barra de
Status", True

4
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

2. NORMAS DE NOMENCLATURA

Você deve sempre se preocupar com a documentação e a padronização de


variáveis, controles e objetos e do sistema como um todo, para que se tenha um
aplicativo com uma programação bem legível e que o processo de manutenção seja
o mais fácil e eficiente possível.
Portanto, adotaremos a referência da LNC - Leszinsky Naming Conventions e
a RNC - Reddick Naming Conventions. Estas normas para nomenclatura são
utilizadas internacionalmente, chamadas de notações húngaras, e fornecem um
método capaz de tornar compreensível o significado de cada objeto ao qual o
código faz referência. De forma bem simples demonstraremos o seu emprego:

[prefixo][marca](nome_do_componente)[sufixo]

Ex.: gstrNome_Cliente - variável tipo global, cujo conteúdo é um string e


armazena a informação do Nome do Cliente.

Abaixo as tabelas com as principais características destas convenções:

PREFIXO TIPO DE OBJETO


s Variável local estática
l Variável local ao módulo
g Variável global ou pública
a Matriz (array)
i Índice de matriz ou coleção
Tabela 2 - Prefixos para variáveis

MARCA TIPO DE VARIÁVEL


byt Byte
f Boolean
int Integer
lng Long
sng Single
dbl Double
cur Currency
dtm Date
obj Object
str String
var Variant
Tabela 3 - Marcas para variáveis

MARCA TIPO DE CONTROLE


app Application
chk Check Box
cbo Combo Box
cmd Command Button
ctl Control Collection
ocx Control Customized
frm Form
img Image Control
lbl Label
lst List Box
bas/mdl Module
opt Option Button

5
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

MARCA TIPO DE CONTROLE


rpt Report
txt Text Box
Tabela 4 - Marcas para controles e objetos

MARCA TIPO DE SUFIXO


Min O menor elemento retornado
First O primeiro elemento retornado
Last O último elemento retornado
Lim O limite superior dos elementos utilizados
Max O maior elemento retornado
Cnt Para campos do tipo Autonumeração
Tabela 5 - Marcas para sufixos

2.1. JANELA DE CÓDIGO

Inicia, pára ou Exibe a Exibe o Exibe a janela


redefine a execução janela explorador de de inspeção de
do código depurar objetos variáveis

Ativa/Desativa
pontos de
interrupçãp

Seleciona o objeto
desejado
Seleciona o procedimento,
Insere módulo método ou evento do
ou objeto.
procedimento Área de código onde
na área de escrevemos os comandos em
código VBA.

Figura 2 - Janela de Código do VBA

Visualiza somente um ou
todos procedimentos da
janela

6
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3. VARIÁVEIS

3.1. DECLARAÇÃO DE VARIÁVEIS


A declaração de nomes de variáveis não é obrigatória no Visual Basic, mas é
recomendada, pois com esta precaução evitam-se erros de digitação e atribuição de
valores. Variáveis são estruturas onde armazenamos qualquer tipo de informação e
que serão utilizadas no nosso código.
Na criação do nome da variável, devemos seguir as seguintes regras:
Comece o nome com uma letra, após pode conter letras e/ou números;
O nome deve conter apenas letras, números e o caracter underscore
(sublinhado). Caracteres de pontuação, acentuação e espaços não
devem ser utilizados;
O nome não deve exceder 40 caracteres. Não podem ser utilizadas
palavras reservadas do Access, como por exemplo, as propriedades
Nome(Name) e Valor(Value) dos objetos.

TIPO DESCRIÇÃO LIMITE


Byte 1 byte 0 a 255
Boolean 2 bytes True ou False
Integer Inteiro de 2 bytes -32.768 até 32.767
Long Inteiro de 4 bytes -2.147.483.648 até 2.147.483.647
Single Número de Ponto -3,402823E38 até -1,401298E-45 para
Flutuante de 4 bytes valores negativos 1,401298E-45 até
3,402823E38 para valores positivos
Double Número de Ponto -1,797693E308 a -4,940656E-324 para
Flutuante de 8 bytes valores negativos; 4,940656E-324 até
1,797693E308 para valores positivos
Currency Ponto Decimal fixo -922.337.203.685.477,5808 até
com 8 bytes 922.337.203.685.477,5807
Date 8 bytes 1 de janeiro de 100 até 31 de dezembro
de 9999
Object 4 bytes Qualquer referência a Objeto
String String de caracteres 1 a 65.400 aproximadamente
Variant 16 a 22 bytes Qualquer tipo de dado
User- Número Requerido Cada elemento obedece seu tipo
defined
Tabela 6 - Tipos Fundamentais de Variáveis

Quando você declara uma variável dentro de uma procedimento ou função,


apenas o código contido neste procedimento pode acessar ou trocar o valor desta
variável, significando que o escopo ou alcance daquela variável é restrito ou é local
àquele procedimento. Às vezes, você pode necessitar usar a variável com um
alcance maior, de forma que o seu conteúdo esteja disponível para todas os
procedimentos contidos dentro de um formulário, ou mesmo que ela possa ser visto
por todos os módulos em todos os formulários de uma aplicação. O Visual Basic
permite que você especifique o escopo ou alcance de uma variável dependendo da
forma que você a declarar.

7
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3.1.1. DECLARAÇÃO IMPLÍCITA DE VARIÁVEIS


Você não precisa declarar uma variável antes de usá-la. Por exemplo,
você pode escrever uma função como abaixo:
Function ValidaData(Data)
dtmData = Data
If isdate(Data) Then
ValidaData = True
Else
ValidaData = False
Endif
....
....
End Function
Você não tem que declarar dtmData antes de usá-lo na função. O
Visual Basic automaticamente cria uma variável com o seu nome, de forma
que você pode usá-lo como se houvesse explicitamente declarado a variável.
Ao mesmo tempo que este procedimento é conveniente , ele também pode
levar a erros em seu código se você escrever uma variável de forma errada.
3.1.2. DECLARAÇÃO EXPLÍCITA DE VARIÁVEIS
Para evitar o problema de variáveis escritas de forma errada , você
pode estipular que o Visual Basic irá sempre gerar uma mensagem de erro
quando encontrar um nome não previamente declarado explicitamente como
uma variável. Para fazer isto, coloque a sentença abaixo na seção
Declarations do formulário ou do módulo de código, conforme mostra a
figura :

Esta instrução obriga a


declaração de variáveis.

Figura 3 - Janela de Módulo

8
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3.1.3. DECLARAÇÃO DE CONSTANTES


Utilizada quando um valor ou um sring repete-se constantemente dentro do
código com o propósito de aumentar a legibilidade do código e facilidade de
modificação de seu conteúdo.

Sintaxe: [Public] Const nome_constante = expressão

Exemplos:
Const PI=3.141592654
Public Const MAX_REG=20
Const NEW_MAX_REG = MAX_REG * 3

Tipos de variáveis definidos pelo usuário (estruturas) :

Você pode criar tipos de variáveis definidos pelo usuário com o uso da
sentença TYPE, que deve ser colocada na seção de declarações de um módulo de
código. Um tipo criado pelo usuário é sempre visto de forma global dentro do
código, apesar de que as variáveis declaradas com este tipo possam ser globais ou
locais as funções ou aos módulos do formulário.
Abaixo criamos um tipo definido pelo usuário que guarda as informações de
um usuário.

Type RegUsuario
Cod As Integer
Nome As String
Cargo As String
Salario As Currency
End Type

Você pode declarar uma variável global ou local ou a nível de módulo com o
tipo RegUsuario.

Dim Cadastro As RegUsuario

Podemos atribuir valores aos elementos da variável desta maneira:


RegUsuario.Cod = "0001"
RegUsuario.Nome = "Patricia Santos"
RegUsuario.Cargo = "Recepcionista"
RegUsuario.Salario = "1800"
3.1.4. DECLARAÇÃO DE ARRAYS
De uma maneira bem simplificada, os Arrays são conjuntos de variáveis de
memória agrupadas com um mesmo nome, sendo que cada uma destas variáveis é
completamente distinta uma da outra. Neste caso, o que diferencia um elemento do
outro é a sua posição relativa dentro do array.
Imagine que o seu programa utiliza três variáveis de memória para
armazenar os preços de produtos concorrentes com os fabricados pela sua
empresa.
Neste caso, você poderia resolver o problema através da seguinte maneira:
Dim Preco1 As Single, Preco2 As Single, Preco3 As Single
Preco1 = txtPrecoConc1.Text
Preco2 = txtPrecoConc2.Text
Preco3 = txtPrecoConc3.Text

9
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Vamos, então utilizar a estrutura de array para armazenar estas


informações:
Dim Preco(3) As Single
Preco(1) = txtPrecoConc1.Text
Preco(2) = txtPrecoConc2.Text
Preco(3) = txtPrecoConc3.Text
Note que cada uma destas variáveis é completamente independente das
outras, exceto pelo fato de todas possuírem o mesmo nome comum. Quaisquer
alterações feitas em um elemento do array não são refletidas nos demais
componentes. Neste caso, você pode referenciar cada elemento do array através de
seu nome e sua posição relativa:

Valor = Preco(2) * 1.25

Vamos declarar um array para que possamos utilizá-lo com no exemplo


anterior:

Dim NomeVar[ ([Dimensão]) ][As Tipo]

Onde:
NomeVar : É o nome do array que você deseja criar. Este nome segue as
mesmas regras da criação de variáveis.
Dimensão : É a dimensão da variável Array. Você pode declarar o elemento
inicial e final do array através da seguinte sintaxe:
[Inicial To] Final
Tipo : Segue as mesmas regras de tipos de dados.

Você não precisa declarar o limite inferior do array, somente o extremo


superior. Quando você não declara o limite inferior, o Visual Basic segue o padrão
estabelecido pela declaração Option Base. Em outras palavras, se você não incluir a
declaração Option Base em suas procedures, o limite inferior do array sempre será,
por default, o valor ZERO. Caso esta opção esteja declarada como Option Base 1, o
limite inferior do array será o número 1.
Se utilizarmos o comando Dim Preco(4) para criarmos um array, ele conterá
quatro elementos, sendo que podemos acessá-los nas posições de 0 a 3. Se você
tentar referenciar o elemento Preco(4) estará tentando referenciar o quinto
elemento do array, sendo que ele não existe!

Observações: Você também pode utilizar o comando Dim para declarar um


Array dinâmico, isto é, sem dimensão definida. Neste caso, o seu array seria
declarado da seguinte forma:

Dim TempoEmpresa() As Integer

Este recurso é útil quando você não sabe ao certo quantos elementos irão
compor seu array, mas já quer deixá-lo declarado em seu código. Depois para
dimensioná-lo, usa-se o comando Redim. Outro ponto a ser considerado é que você
pode criar um array sem definir o tipo de dados que ele conterá. Todos os seus
elementos serão do tipo de dados Variant (cada um dos seus elementos terá 16
bytes de tamanho).
A sintaxe do comando Redim é praticamente idêntica à do comando Dim:

Redim [Preserve] NomeVar(dimensão) [As Tipo]

Onde:
Preserve: Mantém todos os dados existentes no array que está
sendo redimensionado.

10
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3.2. OPERADORES

Como você já deve estar imaginando, operadores são sinais gráficos que
indicam determinadas operações a serem realizadas, e se dividem em quatro
categorias distintas:

• Operadores Aritméticos ⇒ utilizados para a realização de cálculos


matemáticos.
• Operadores de Comparação ⇒ utilizados em expressões para comparar
dois ou mais valores existentes.
• Operadores de Concatenação ⇒ utilizados para a combinação de strings.
• Operadores Lógicos ⇒ realizam operações lógicas entre dois ou
mais valores existentes.

3.2.1. OPERADORES ARITMÉTICOS


São utilizados para operações matemáticas entre dados numéricos:

• + Soma de dois números quaisquer.


• - Subtrai dois números quaisquer ou indica que um determinado número é
negativo.
• * Multiplica dois números quaisquer.
• / Divide dois números quaisquer.
• ^ Eleva um dado número a uma potência qualquer.
• \ Divide dois números e retorna um valor inteiro.

3.2.2. OPERADORES DE COMPARAÇÃO

Estes operadores servem para indicar uma operação de comparação entre


dois ou mais valores ou expressões existentes. Após avaliar a expressão que
contém este tipo de operador , o VB retornará o valor True caso a comparação seja
verdadeira ou o valor False, caso a comparação não se verifique. Temos, então:
<, <=, >, >=, <> e =
3.2.3. OPERADORES LÓGICOS
Este tipo de operador é utilizado para testar logicamente duas ou mais
expressões ou variáveis de memória, baseando-se na álgebra booleana. Temos,
então: NOT, AND e OR

3.2.4. PRECEDÊNCIAS
Quando uma expressão composta por vários operadores existem regras para
indicar sua prioridade de execução. Para evitarmos que se encontre um valor
diferente para uma mesma expressão, o VBA adota a seguinte ordem no momento
de avaliar uma expressão:

11
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Operadores Aritméticos Operadores de Comparação Operadores Lógicos

Imagine encontrar a seguinte expressão:

7 * 3 > 16 ^ 2 And 200 / 4 = 3 * 12

A mesma seria avaliada da seguinte forma

7*3 > 16 ^ 2 And 200 / 4 = 3 * 12

1 2 3 4

5 7 6

4. ESTRUTURAS DE PROGRAMAÇÃO

4.1. COMANDOS CONDICIONAIS


As sentenças que controlam decisões condicionais para executar uma ou
mais instruções. A instrução avalia a expressão contida na condição, se verdadeiro
realiza os comando do bloco Then e se for falsa o do bloco Else. Podemos, também,
utilizarmos outra estrutura de teste no uso de múltiplas instruções.

If «condição» Then «comando»

If «condição» Then
«comando1»
«comando2»
Else
«comando3»
«comando4»
End If

If «condição1» Then
«comando1»
«comando2»
ElseIf «condição2» Then
«comando3»
Else
«comando4»
End If

IIf(«condição»,«cláusula Então»,«cláusula Senão»)

Select Case «expressão»


Case «item1»
bloco_de_comandos1
Case «item2»
bloco_de_comandos2
Case Else
bloco_de_comandosX
End Select

12
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Cada item de teste é uma lista de um ou mais valores. Se houver mais de


um valor, eles estarão separados por vírgulas. Cada bloco de comandos contém um
comando, mais de um comando ou nenhum comando. Se mais de um Case coincide
com a expressão testada, apenas o bloco de comandos associado com o primeiro
Case coincidente será executado. O Visual Basic executará comandos no bloco Case
Else (que é opcional) se nenhum dos valores na lista de itens coincidir com a
expressão de teste.

4.2. COMANDOS DE LAÇOS CONDICIONAIS


Do ... Loop
Use o Do ... Loop para executar um bloco de comandos por um número
indefinido de vezes. Existem variações da sentença Do... , mais cada uma avalia
uma condição numérica para determinar quando continuar a execução. Assim como
acontece com o If_Then a condição precisa resultar em um valor numérico que
possa ser traduzido como True(-1) ou False (0).
A estrutura abaixo é executada enquanto a condição for True:

Do While «condição»
bloco_de_comandos
Loop

Outra variação do Do...Loop executa primeiro os comandos e depois testa a


condição. Esta variação garante pelo menos uma vez a execução do bloco de
comandos :

Do
bloco_de_comandos
Loop While «condição»

As duas variações abaixo são analogas as anteriores , com a exceção de que


elas ficam em loop enquanto a condição de teste é Falsa.

Executa zero ou mais vezes

Do Until «condição» OBSERVAÇÃO:


bloco_de_comandos Note bem que Do Until «condição» é
Loop equivalente a instrução de Do While Not
«condição».
Executa pelo menos uma vez
Do
bloco_de_comandos
Loop Until «condição»

For ... Next


Esta é uma estrutura de repetição utilizada quando se sabe previamente o
número de vezes que um bloco de comandos será executado. O For...Next utiliza
um contador que é incrementado ou decrementado durante cada repetição. Sua
sintaxe é:

For contador = início To final [ Step incremento ]


comandos
Next [ contador ]

13
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Os argumentos contador, inicio , final e incremento são todos numéricos. O


argumento incremento pode ser positivo ou negativo. Se incremento é positivo,
inicio deve ser menor ou igual a final. Se incremento é negativo, inicio deve ser
maior ou igual a final, para que os comandos sejam executados. Se o incremento
não for informado então ele terá seu valor assumido como 1.

O comando Exit permite que você abandone diretamente um bloco


For..Next, Do...Loop, Sub procedure, ou Function procedure. Vejamos o exemplo:

For intInd = 1 To 100 OBSERVAÇÃO:


strNome= txtNome_Cliente Podemos utilizar estas
If strNome = "Mario Paranhos" Then saídas forçadas:
Exit For Exit Do
End If Exit For
Next intInd Exit Function
Exit Sub

Go To
Faz com que o programa desvie incondicionalmente para um rótulo ou uma
linha especificada dentro de uma procedure. Não se recomenda utilizar este
comando para programação estruturada, somente para desvio quando acontecer
um erro.
Sintaxe: Go To (rótulo | número de linha)
Exemplo:
...
On Error Go To Trata_Erro
...
...
Trata_Erro:
MsgBox Err.Description
...
...
End Sub

For Each «elemento» In «elemento» ... Next


Permite que você percorra os elementos de uma coleção ou matriz

Exemplo:
Dim ctl as Control
For Each ctl in Me
If ctl.Name = vbText Then
Debug.Print "Este Controle é uma Caixa de Texto."
Endif
Next

With «objeto» ... End With


Esta instrução permite que se referencie a várias propriedades de um objeto
de uma só vez.

Exemplo:
With Me!txtNome
.BackColor = 0
.Visible = True
.Enabled = True
End With

14
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

5. MANIPULAÇÃO DE ARQUIVOS
Um arquivo nada mais é do que uma série de bytes relacionados e
localizados em disco. Quando uma aplicação acessa um arquivo, é necessário fazer
suposições sobre o tipo de dado que será acessado (integer, single, ou outros tipos
de dados). Existem três tipos de acesso a arquivos:
• Randômico
• Seqüencial
• Binário

5.1. ACESSO RANDÔMICO


Um arquivo aberto para acesso randômico é composto de uma série de
registros de mesmo tamanho. Apesar de um registro precisar, necessariamente,
corresponder a um único tipo de dado, isto não representa muitas restrições, uma
vez que podemos utilizar o tipo de dado definido pelo usuário (Type).
O acesso randômico possui muitas vantagens em acesso e tratamento de
registros. Por outro lado, os dados dentro de um registro são geralmente, menores
do que o tamanho reservado para eles, o que ocasiona um espaço de disco perdido.
Em um arquivo de acesso randômico, os bytes formam registros com
estruturas idênticas, cada uma contendo um ou mais campos. Um registro com um
único campo corresponde a um único tipo padrão, como integer ou string de
tamanho fixo. Um registro com mais de um campo corresponde a qualquer
estrutura de dados definida pelo usuário. Em um arquivo aberto para acesso
randômico, todos os registros precisam corresponder a um único tipo.
Antes de abrir um arquivo para acesso randômico, definimos o tipo de
registro que o arquivo deverá armazenar. No exemplo que será tratado nesta
seção, Agenda de Telefones, o tipo de registro é declarado como um tipo definido
pelo usuário e recebe o nome de Registro:

Figura 4 - Declaração de um Registro

Obs.: Dentro de um módulo global podemos utilizar a declaração anterior


com escopo Public ou Private, porém, dentro de formulários, apenas o escopo
Private é aceito (e obrigatório)

15
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Notamos que todos os strings são de tamanho fixo. Isto se torna necessário
uma vez que o registro precisa ter um comprimento pré-determinado e fixo.
Notamos também que, se Nome possuir somente 10 caracteres, os 5 caracteres
restantes são preenchidos com espaços em branco. Da mesma forma que se Nome
for maior que 15, os caracteres a partir do 15° serão ignorados (truncados).

Para abrir um arquivo de acesso randômico, utilizamos a sintaxe para a


declaração Open

Open <Arquivo> For Random As numero_arquivo Len = tamanho_registro

Onde:
Len = tamanho_registro, utilizamos para especificar o tamanho do
registro. Se este valor for incorreto, o acesso será inadequado e os dados
inconsistentes.

Exemplo:

Figura 6 - Comando Open

Para editar um arquivo aberto por acesso randômico, devemos copiar os


registros provenientes do arquivo para variáveis, alterá-las se necessário e depois
copiá-las de volta para o arquivo.

Lendo registros do arquivo:

Devemos utilizar a declaração Get para copiar os registros para as variáveis


do programa. Para realizar esta tarefa utilizamos a seguinte sintaxe:
Get NumArq, Posicao, Agenda
Onde:
NumArq - Variável que contém o número utilizado para abrir o
arquivo na declaração Open.
Posição - Variável que contém o número do registro a ser copiado do
arquivo especificado.
Agenda - Variável do tipo Registro que receberá o conteúdo do
registro.

16
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Gravando no arquivo

Devemos utilizar a declaração Put para copiar registros em arquivos de


acesso randômico. Para adicionar um novo registro no final de um arquivo de
acesso randômico, devemos utilizar a declaração Put mostrada no procedimento
evento Insere_click a seguir. Notemos que a posição de inserção é uma a mais
do que a última posição do arquivo. Por exemplo, se um arquivo possuir 8
registros, devemos inserir o novo registro na posição 9.

Figura 7 - Gravando Registro

Deletando Registros

Podemos deletar um registro simplesmente limpando todos os seus campos,


contudo, apesar de vazio, o registro ainda existiria no arquivo. Ou seja, nesta
solução criamos buracos no arquivo gerando espaços no disco perdidos e problemas
em operações seqüenciais.
A melhor maneira de deletar um registro é copiar todos os registros
posteriores a ele para uma posição anterior. Por exemplo, vamos supor que o
registro 6 deve ser deletado de um arquivo que contenha 8 registros: Neste caso
devemos copiar o registro 7 sobre o 6, que será apagado, e o registro 8 devemos
copiar sobre o registro 7, que agora é o registro 6.

Figura 8 - Excluindo Registros

O procedimento Deleta_Click possui uma falha: A última iteração da malha


For..Next copia o último registro sobre o registro anterior a ele, deixando, contudo,
o último registro com duas cópias no arquivo - na penúltima e última posição.

17
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Para remover uma das cópias deste registro duplicado devemos seguir os
seguintes passos.
⇒ Criar um novo arquivo
⇒ Copiar todos os registros válidos do arquivo original para o novo arquivo
⇒ Fechar todos os arquivos abertos através da declaração Close
⇒ Utilizar a declaração Kill para apagar o arquivo original do disco
⇒ Utilizar a declaração Name para renomear o novo arquivo com o nome
do arquivo original
⇒ Abrir novamente o arquivo e atualizar o valor de suas variáveis de
controle.

5.2. ACESSO SEQUENCIAL


O acesso a arquivos de maneira seqüencial, oferece melhores resultados
quando o arquivo é formado por um texto, como um arquivo criado por um editor
de texto normal.

Quando abrimos um arquivo para acesso seqüencial, podemos realizar uma


entre as três operações a seguir

• Ler caracteres do arquivo (Input)


• Gravar caracteres no começo do arquivo (Output)
• Gravar caracteres no fim do arquivo (Append)
Após abrir o arquivo para uma das operações anteriores, é necessário fechar
o arquivo, através da declaração Close, antes de reabri-lo para uma outra
operação.
Para abrir um arquivo para acesso seqüencial utilizamos a declaração Open
com a seguinte sintaxe:

Open arquivo For [Input / Output / Append] As ArqNum [Len]=TamanhoBuffer

OBS.: Quando utilizamos Input, o arquivo já deve existir, caso contrário o


VB produzirá um erro. Contudo, quando tentamos abrir um arquivo inexistente com
Output ou Append, o VBA primeiramente cria o arquivo e depois o abre.

Para editar um arquivo aberto por acesso seqüencial, devemos copiar o


conteúdo do arquivo para variável, alterá-las se necessário e depois copiá-las de
volta para o arquivo.
Para ler o conteúdo de um arquivo de texto, devemos abrir o arquivo para
acesso seqüencial através da declaração Input. Utilizamos em seguida as
declarações Line Input #, Input$, ou Input # para copiar o arquivo para as
variáveis do programa.
Normalmente, todo o conteúdo de um arquivo texto é lido de uma única vez.
Contudo, o VBA oferece algumas ferramentas que permitem ler e gravar arquivos
seqüenciais linha por linha.

18
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Exemplo:

Figura 9 - Lendo Registros

O código acima lê o conteúdo de um arquivo até que a função EOF retorne


True, indicando que o fim de arquivo foi encontrado. A cada iteração do laço, a
declaração Line Input# armazena uma única linha do arquivo na variável
ProximaLinha.
A declaração Line Input# reconhece o fim de uma linha de texto quando
encontra a seqüência de caracteres “nova linha” e “retorno do carro” (linefeed e
carriage return - vbCrLf). Contudo, estes caracteres não são lidos pela
declaração, logo se quisermos armazenar esta seqüência de caracteres na variável
devemos proceder como no código acima.
Podemos utilizar a função Input para copiar qualquer número de caracteres
de um arquivo para uma variável. Esta função obedece a seguinte sintaxe:

Input [$] (n,NumArq)

Onde:
• Input retorna um tipo de dado Variant e Input$ retorna uma String
• n; número de bytes (caracteres) a serem lidos
• NumArq: Número do arquivo definido para uso na declaração Open

Para lermos um arquivo inteiro para uma variável do programa de uma


única vez utilizamos o seguinte código:

LinhasDoArquivo = Input$(LOF(NumArq),NumArq)

Onde LOF(NumArq) retorna o tamanho do arquivo em bytes, ou seja o


número de caracteres do arquivo.
OBS.: Ao contrário da declaração Line Input#, a função Input lê os
caracteres de “nova linha” e “retorno de carro”.

O VBA também suporta a declaração Input #. Utilizamos esta declaração


para ler uma lista de expressões numéricas e/ou strings escritas em um arquivo
com a declaração Write #

19
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Caixas de texto são freqüentemente utilizadas em VB para exibir arquivos de


texto. O tamanho máximo de um arquivo que pode ser editado é 32K, o que é o
máximo valor que pode ser atribuído a uma caixa de texto de múltiplas linhas em
VB. Portanto, antes de lermos um arquivo para uma caixa de texto, devemos
verificar o tamanho do mesmo.
Obs.: 32000 é a aproximação grosseira para 32K. Uma aproximação mais
precisa seria de 32*1024 = 32768

Escrever strings: Para armazenar o conteúdo de variáveis em um arquivo


de texto, devemos abri-lo com Output ou Append e utilizarmos a declaração Print
#. Por exemplo, o código a seguir copia todo o conteúdo de uma caixa de texto
para um arquivo:

Print #NumArq, Text1.Text

O VBA também suporta a declaração Write #. Esta declaração permite que


se escreva uma lista de expressões numéricas e/ou strings em um arquivo. As
expressões são separadas automaticamente por vírgulas, sendo que as expressões
strings são colocadas entre aspas.

5.3. ACESSO BINÁRIO


O acesso binário permite uma flexibilidade muito maior para tratamento de
arquivos, uma vez que os bytes neste tipo de arquivo podem representar qualquer
tipo. Devemos utilizar acesso binário quando desejarmos manter o arquivo com o
menor tamanho possível.
Para abrir um arquivo para acesso binário, devemos utilizar a seguinte
sintaxe da declaração Open.

Open Arquivo For Binary As NumArq

Para entendermos melhor quando utilizar um arquivo de Acesso Binário,


vamos considerar um tipo de registro, Pessoa, utilizado para arquivos de acesso
randômico. Este registro típico é descrito através da declaração Type...EndType:

Figura 10 - Declaração de Registro

20
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

• Neste exemplo são utilizados registros de tamanho fixo ( exigência do acesso


randômico ) para armazenar informações sobre empregados de uma instituição.
• Todo registro neste arquivo ocupa 194 bytes (integer - 2bytes, double - 8bytes,
Long - 4 bytes, 15,15,150), não importando o seu conteúdo. No campo
Comentários, a string “Bom Trabalho” ocupa o mesmo espaço de disco que a
string “O empregado tem se mostrado um pouco indeciso quando colocado
sobre pressão. Não aconselhado para cargos de gerência”.
• Pode acontecer também que 150 caracteres seja muito pouco para este campo
Comentários. Algumas vezes são necessários cerca de 500 caracteres, contudo a
média é de 20 caracteres. Utilizando acesso randômico teríamos que definir um
tamanho do campo suficiente para armazenar a maior necessidade, ou seja 500
bytes. Com isto teríamos em média 480 bytes não aproveitados por registro.
• Este tipo de problema pode ser evitado através do uso de arquivos com acesso
binário, uma vez que neste tipo de arquivo não é necessário a pré-definição do
tamanho dos campos. Com isto o registro Pessoa pode assumir o seguinte
aspecto:

Figura 11 - Declaração de Tipo de Dados

Cada registro Empregado armazena agora somente o número de bytes


efetivamente utilizados. Isto, contudo, pode gerar um problema quando
necessitamos determinar o tamanho de cada campo para efetivarmos a leitura dos
dados.

Uma boa maneira de solucionar este problema é gravar um tipo de dado


Integer, o qual informará o tamanho da string, no próprio arquivo antes de cada
campo de tamanho variável. Esta solução tem um custo de espaço em disco (2
bytes por string), porém, sem dúvida, torna os registros Empregados, em média
menores do que os utilizados em acesso randômico.
O procedimento Escreve_um_Registro, descrito a seguir, grava um registro
no arquivo de empregados:

21
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Figura 12 - Gravação de Registro

OBS.: Apesar do acesso binário prover uma maior flexibilidade que o acesso
randômico, requer mais código para manipulação de operações de I/O.

A declaração Get, quando utilizada com variáveis de tamanho fixo, ou de


tamanho conhecido, lê o número de bytes pré-determinados, mesmo que existam
bytes não utilizados. Quando utilizamos a declaração Get para strings de tamanho
variável, é lido somente o tamanho corrente(atual) da string.

Considere o seguinte exemplo:


Escola = "PEOPLE COMPUTAÇÃO" ' String contém 17 caracteres
Get #1, , Escola ' Lê 17 bytes do arquivo #1 para a
variável escola

O procedimento Get_um_Registro, a seguir lê os registros gravados pelo


procedimento Escreve_Um_Registro visto anteriormente. Antes de lermos cada
campo é necessário conhecermos o tamanho deste campo. Uma vez determinado o
tamanho do campo utilizaremos a função String$ para definir a variável que
receberá os dados como uma variável com o tamanho correto e inicialmente
composta de espaços em branco.

22
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Figura 13 - Leitura de Registros (Get)

Uma outra maneira, mais simples, de realizarmos a mesma tarefa é através


da utilização da declaração Input$. O procedimento Put_Um_Registro, ilustra a
utilização desta declaração:

Figura 14 - Leitura de Registros (Input)


Indiferente ao método de acesso utilizado, é importante manter a
informação da localização dos registros em um arquivo. Caso contrário, será preciso
ler desde o começo de um arquivo toda vez que for necessário a recuperação de
um dado, o que pode tornar uma aplicação consideravelmente lenta.

23
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

O acesso randômico tem alguma vantagem neste ponto, pois mantém as


informações da posição de seus registros baseado no tamanho dos mesmos e na
posição do início do arquivo. Tudo que precisamos fazer então é fornecer à função
de escrita ou leitura o número do registro. Entretanto, isto somente é útil quando
desejamos acessar no conteúdo de um de seus campos, como por exemplo o último
nome do empregado.
Se estivermos utilizando acesso binário, os dados serão localizados em
lugares pré-estabelecidos, em alguns casos os dados binários nem mesmo se
encontram na forma de registros. Nestes casos é necessário o uso de algum
mecanismo que manterá, de alguma forma, informações sobre a localização dos
registros no arquivo.
Um destes mecanismos é a tabela de localização do arquivo (File Location
table). Por exemplo, vamos supor que precisamos de um rápido acesso a qualquer
dos registros dos empregados, e que utilizaremos o último nome para localizar
estes registros. Começaremos construindo um novo tipo de dado, e em seguida
construiremos nossa tabela com base neste tipo.

Figura 15 - Tabela de Array

O código acima cria uma tabela que pode ser utilizada para procurar um
empregado pelo seu último nome. A tabela fornece a localização do começo do
registro especificado.
Esta tabela pode ser lida ou criada a cada vez que o arquivo de empregados
é aberto. Não devemos esquecer de atualizar esta tabela toda vez que o registro
sofrer alguma alteração.

24
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

6. PROCEDIMENTOS - FUNÇÕES E SUBROTINAS


São trechos de programa que executam uma determinada tarefa. A tarefa a
ser realizada pode ou não retornar um parâmetro (resultado). Quando retorna
parâmetro é chamada de função. As subrotinas não retornam parâmetros. Em
Visual Basic as funções e subrotinas são declaradas de maneira quase idêntica.

Sintaxe

[Static][Private][Public] Function Nome_Função[(Lista Argumentos)] [As Tipo]


[Bloco de Declarações]
[Nome_Função = expressão]
[Exit Function]
[Bloco de Declarações]
[Nome_Função = expressão]
End Function

[Static][Private][Public] Sub Nome_Sub[(Lista Argumentos)] [As Tipo]


[Bloco de Declarações]
[Exit Sub]
[Bloco de Declarações]
End Sub

As funções e subrotinas possuem as seguintes partes:

Static: Indica que as variáveis locais da procedure são preservadas entre as


chamadas. As variáveis declaradas fora da procedure não são afetadas pelo
atributo Static, mesmo que sejam acessadas pela procedure.

Private: Indica que a função ou subrotina é acessável apenas por funções


ou subrotinas do mesmo módulo em que foi escrita.

Public: Indica que a função ou subrotina é acessável por todas funções ou


subrotinas não importando o escopo em que foi escrita.

Function/Sub: Marca o início da função / subrotina

NomeFunção / NomeSub: Nome da função/subrotina. Não devem ter o


mesmo nome de palavras reservadas, funções ou subrotinas já declaradas. Pode-se
evitar conflitos com procedures de outros módulos utilizando a palavra Private
(desde que o nome não coincida com o de outra função, subrotina ou variável do
módulo onde está sendo declarada).

25
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Lista Argumentos: Lista de variáveis, com os argumentos que são


passados quando a função ou subrotina é chamada. A passagem de múltiplas
variáveis é feita separando-as por vírgula. Os argumentos são passados de duas
formas: por referência(default) ou por valor. Na passagem por referência é passado
um ponteiro do tipo far (32 bits). Na passagem por valor, é passado o valor da
própria variável. A palavra chave ByVal que faz com que o argumento seja passado
por valor.

O argumento Lista Argumentos tem a seguinte sintaxe:

[ByVal]variável[()] [As Type] [,[ByVal]variável[()] [As Tipo]]...

ByVal: Palavra reservada, indica que o tipo de passagem do argumento é


por valor.
Variável: Nome da variável que representa o argumento.
As Tipo: Define o tipo da variável retornada pela função. Pode ser utilizado
o caracter de sufixo (#,$,%,etc...)

BlocoDeDeclarações: Qualquer grupo de declarações executadas internamente ao


corpo da função ou subrotina.
Expressão: Valor de retorno da função. O valor retornado é atribuído ao nome da
função. Se nenhum valor for atribuído à função será sempre retornado 0 (se o tipo
numérico) ou “” (se string)
Exit Function / Sub : Provoca o encerramento imediato da função ou subrotina.
End Function / Sub: Marca o final da procedure.

6.1. ARGUMENTOS BYVAL E BYREF


Indica que o argumento é passado por valor e não por referência (ByRef).
Quando ByVal precede uma variável de argumento numérico, o argumento é
convertido para o tipo numérico indicado em Declare (como Integer ou Long, por
exemplo) antes de ser passado. Se precede uma string, o ponteiro é passado para
a procedure.

Exemplo:

Sub PesquisaFornecedor(Nome As Control, Indice As Integer)


Static Fornecedor(4) As String
Fornecedor(0) = "Antarctica"
Fornecedor(1) = "Brahma"
Fornecedor(2) = "Kaiser"
Fornecedor(3) = "Skol"

If TypeOf Control is LabelBox Then


Nome.Caption = Fornecedor(Indice)
...
End If
End Sub

OBS.: Como você percebeu, a maneira default de passar parâmetros no VBA é


sempre por referência, já que nesse caso não é necessário a declaração explícita.
Deve ser utilizado com muito cuidado, de modo a não alterar variáveis
acidentalmente. Por padrão, utilize passagem de parâmetros por valor, a menos
que o outro mecanismo seja essencial.

26
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

6.2. ARGUMENTOS OPCIONAIS

Quando você declara na definição de uma procedure que um parâmetro é


opcional, o Visual Basic entende que quando o usuário fizer uma chamada a este
procedimento, poderá incluir ou não este argumento, sem que isto cause um erro
de execução.
A maneira de declarar que um argumento é opcional é bastante simples. Basta
incluir a palavra Optional antes do nome da variável de memória que receberá este
argumento:
Seguindo em nosso exemplo, a procedure CalculaMenorDez deve ter seus
argumentos declarados da seguinte forma:

Function CalculaMenorDez( Optional Valor, Optional Data) As Single

Note que quando você utilizar a opção optional para um argumento, todos
os demais argumentos subseqüentes deverão ser opcionais também.
Neste caso, você deverá incluir a palavra Optional na frente de cada um dos
argumentos declarados em sua procedure.
Para completarmos nosso exemplo vamos contar com a ajuda de uma nova função,
a IsMissing.

6.2.1. TESTANDO ARGUMENTOS NÃO PASSADOS

Esta função IsMissing opera de uma forma bastante simples, retornando um


valor lógico True ou False, indicando se o argumento opcional foi passado ou não
ao procedimento. Se o valor de retorno for True (IsMissing=True - Está faltando =
Verdadeiro) o argumento não foi passado. Analogamente a resposta False indica
que o procedimento recebeu o parâmetro indicado.
A sintaxe desta função é:

IsMissing(Nome do Argumento)

Onde o Nome do Argumento é o nome da variável declarada como opcional


na definição da procedure, como Valor ou Data em nosso exemplo.

Exemplo:

Function CalculaMenorDez(Optional Valor, Optional Data) As Single


If IsMissing(Valor) Then
MsgBox("Não recebi o parâmetro Valor.")
Else
ValorSeguro = Valor * 1.01
Valor = ValorSeguro + 1
If IsMissing(Data) Then
MsgBox("Não recebi o parâmetro Data.")
Else
MsgBox("OK. Recebi os parâmetros.")
End If
CalculaMenorDez=Valor
End If
End Function

27
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

7. UTILIZAÇÃO DE OBJETOS DO ACCESS

7.1. OBJETO DOCMD


Você pode utilizar os métodos do objeto DoCmd para executar ações do
Microsoft Access a partir do Visual Basic para Aplicativos. Uma ação pode realizar
tarefas como fechar janelas, abrir formulários e definir o valor de controles. Este
objeto pode executar todas as ações de macros disponíveis e ainda o método
RunCommand que permite ativar qualquer uma das opções dos menus disponíveis
dentro do Access.
Sintaxe:
[Application.]DoCmd.Nome_Metodo [arg1, arg2, ...]
Exemplo:
Docmd.OpenForm "frmFuncionarios", acNormal
Docmd.OpenReport "rptPedidos", acViewPreview
A maioria dos métodos deste objeto têm argumentos obrigatórios, e outros
são opcionais. Se você omitir os argumentos opcionais, eles assumirão os valores
padrão do método. Por exemplo, o método OpenForm utiliza sete argumentos, mas
somente o primeiro argumento, o nome do formulário, é obrigatório.
O exemplo abaixo mostra como você pode abrir o formulário
frmFuncionarios e somente exibir os funcionários com o cargo de "Representante de
Vendas".
DoCmd.OpenForm "Funcionarios", , ,"[Cargo] = 'Representante de Vendas'"

7.2. OBJETO SCREEN


O objeto Screen se refere a determinado formulário, relatório ou controle,
que tem atualmente o foco. Você pode, por exemplo, utilizar o objeto Screen com a
propriedade ActiveForm para referir-se ao formulário na janela ativa sem conhecer
o nome do formulário.
O exemplo abaixo exibe o nome do formulário que está na janela ativa.
MsgBox Screen.ActiveForm.Name
O exemplo a seguir utiliza o objeto Screen para imprimir o nome do
formulário que está na janela ativa e o nome do controle ativo nesse formulário.
Dim frm As Form
Dim ctl As Control
' Retorna objeto Form apontando para o formulário ativo.
Set frm = Screen.ActiveForm
MsgBox frm.Nome & " é o formulário que tem o foco ativo."
' Retorna objeto Control apontando para o controle ativo.
Set ctl = Screen.ActiveControl
MsgBox ctl.Nome & " é o controle que tem o foco ativo neste
formulário."
Este objeto não torna ativo um formulário, relatório ou controle. Para torná-
lo ativo um formulário, relatório ou controle, você deve utilizar o método
SelectObject do objeto DoCmd. O Access retorna um erro em tempo de execução
caso não encontre nenhum objeto ativo.
Você pode utilizar a propriedade ActiveForm juntamente com o objeto
Screen para identificar ou referir-se ao formulário que tem o foco. Se um
subformulário tiver o foco, A propriedade ActiveForm se refere ao formulário
principal.

28
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

8. TRATAMENTO DE ERROS
Nenhum programa é a prova de erros. Logo, quando isto acontece, faz com
que o programa seja inesperadamente interrompido, e se nenhuma rotina
específica existir para tratar esta ocorrência, o programa será finalizado.

Existem três tipos de erros que podem acontecer em um programa:


Erros de sintaxe: Ocorrem quando se digita equivocadamente um
comando, propriedade, o nome de um controle ou um método do VBA. O
compilador da linguagem identifica o erro e marca o erro em vermelho.
Erros de lógica: São erros que produzem resultados imprecisos ou
inválidos, quando criamos um sequência de comandos incorretas. Este
tipo de erro só o desenvolvedor pode corrigir.
Erros inesperados: Ocorrem de modo inesperado, ou seja, o sistema
tenta executar algum comando/operação não disponível ou impossível. .
O compilador da linguagem identifica este erro e exibe uma mensagem.

Abaixo algumas dicas para não termos problemas com os erros mais
comuns:
Usarmos sempre a opção Option Explicit para obrigar a declaração das
variáveis utilizadas;
Sempre escreva o procedimento ou função em uma folha de papel para
depois transferir para o módulo, utilize-se do português estruturado;
Comente ao máximo o seu programa;
Crie sempre uma rotina de tratamento de erros em seus módulos. Os
assistentes do Access, quando criam algum controle ou procedimento do
evento, já introduzem no código a rotina padrão de tratamento de erros.

Zera o código de erro retornado

Descrição do código de erro retornado

Valor do código do erro retornado

Figura 16 - Método Err (Erro)

29
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Existem três instruções para gerenciarmos o erro:


On Error GoTo «número_da_linha» | «rótulo» - Desvia o controle do
programa para uma determinada linha ou um rótulo do seu código. As
instruções subsequentes ao ponto onde ocorreu o erro ficam
interrompidas de executar até que a rotina de tratamento de erro
determine o que fazer.
On Error Resume Next - Sempre que ocorre um erro, aquela insturção
não será executada, e o programa continua a partir da próxima linha de
comando, ou seja, não interrompe a execução mesmo que
temporariamente.
On Erro GoTo 0 - Este comando desabilita o tratamento de erro
gerenciado pela instrução On Error. Portanto, cuidado ao utilizar esta
instrução!

Sempre que ocorrer um erro o sistema gera um código de erro,


retornado através do objeto Err. Esta instrução também retorna a descrição da
mensagem do erro provocado.

Se o seu programa não gerar erro o objeto Err retornará o valor zero(0).
Já se ocorrer um erro o objeto Err atualiza as suas propriedades em tempo de
execução.
Esta instrução contém informações sobre os erros gerados e suas
propriedades têm valores somente enquanto o tratamento de erros não é
desativado, seja por um Resume, seja pela finalização do procedimento. Se você
desejar gerar um erro específico, use os métodos Clear e Raise, para esvaziar os
valores atuais das propriedades e gerar um novo tipo de erro.
Você obtém informações completas sobre o erro gerado inspecionando
os valores das propriedades Number e Description do objeto. Sempre que
necessário, você pode inspecionar a propriedade Number e, de posse do código do
erro, efetuar um tratamento específico para cada caso. A propriedade Description é
extremamente útil para o programador, pois evita que, em todos os pontos do
programa, seja necessário criar código para exibir uma mensagem padrão, porém
deve-se levar em conta que a mensagem será sempre exibida em inglês.

Esquematizando:

Start Label_X:

Error Resume
On Error GoTo Label_X Handler
Resume Next
Ação 1 (Error)
Resume

Ação 2

Ret_Erro: Ação 3

End

30
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Abaixo a janela de código onde podemos inspecionar o conteúdo de


variáveis, executar o procedimento passo a passo, ativar pontos de interrupção,
exibir a janela iemdiata, entre outras:

Inserindo um ponto
de interrupção.

Este menu de atalho é mostrado quando se


clica com o botão direito do mouse em
qualquer lugar da área de código.
Figura 17 - Depurando o código

Se selecionarmos a variável e posicionarmos o cursor sobre ela o VBA exibe


uma legenda com o seu conteúdo atual, como mostra a figura acima, quando
selecionamos o campo da tabela chamado "Valor Contratado" ele é igual a
706293,9.

Figura 18 - Janela Imediata


Na janela imediata ou depurar você pode inspecionar o valor de qualquer
variável de sistema, do objeto ativo. Você pode, em tempo de execução, alterar o
valor de uma variável para realizar um teste ou alguma correção.

31
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Existe uma função MsgBox que serve para mostrar ao usuário uma
mensagem de erro ou de aviso. Ela mostra a mensagem em uma caixa de diálogo;
aguarda o usuário escolher um botão e retorna um valor indicando qual botão foi
clicado pelo usuário.
Esta função possui 5 argumentos. O primeiro é o próprio texto da
mensagem que se quer exibir. O segundo é o tipo de botão e o ícone que se quer
exibir. O terceiro é o texto da barra de título da janela da mensagem. O quarto é o
arquivo de ajuda associado à mensagem de erro ou aviso. E o quinto argumento é
o contexto da ajuda dentro do arquivo.

Sua sintaxe é:

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

Onde:

Prompt: A mensagem que será mostrada na janela de diálogo. O


tamanho máximo é de aproximadamente 1024 caracteres, dependendo da largura
do caracter que está sendo usado. Você pode separá-lo em várias linhas usando
caractere de retorno de carro Chr(13), ou um caracter nova linha Chr(10), ou uma
combinação dos dois (Chr(13) & Chr(10));
Buttons: Uma soma de valores especificando o número e o tipo de
botões que serão apresentados, o estilo do ícone a ser usado, ou identificar o botão
default. Se omitido, o valor default para os botões é 0.
Title: String que representa o título da janela de diálogo.
HelpFile: String que identifica o nome do arquivo de help a ser
utilizado. Se Helpfile não for fornecido, o próximo argumento context também não
deverá ser.
Context: Expressão numérica que indica qual o contexto de help deverá
ser apresentado.

Figura 19 - Comando MessageBox

32
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Abaixo os valores válidos para o argumento Buttons:

Valor do botão O que irá mostrar


vbOKOnly Mostra apenas o botão OK.
vbOkCancel Mostra os botões Ok e Cancelar.
vbAbortRetryIgnore Mostra os botões Abort, Retry e Ignore.
vbYesNoCancel Mostra os botões Yes, No e Cancel.
vbYesNo Mostra os botões Yes e No.
vbRetryCancel Mostra os botões Retry e Cancel.
vbCritical Exibe o ícone Mensagem crítica.
vbQuestion Exibe o ícone Consulta de aviso.
vbExclamation Exibe o ícone Mensagem de aviso.
vbInformation Exibe o ícone Mensagem de informação.
vbdefaultButton1 O primeiro botão é o padrão.
vbDefaultButton2 O segundo botão é o padrão.
vbDefaultButton3 O terceiro botão é o padrão.
vbDefaultButton4 O quarto botão é o padrão.
vbApplicationModal Janela restrita do aplicativo; o usuário deve responder à
caixa de mensagem antes de continuar o trabalho no
aplicativo atual.
vbSystemModal Janela restrita do sistema; todos os aplicativos são
suspensos até que o usuário responda à caixa de
mensagem.
Tabela 7 - Constantes do Botão

Exemplo:

On Error GoTo Rotina_Erro


Você pode combinar ícones
...
e botões somando o valor
...
das constantes.
...

Rotina_Erro:
Select Case Err.Number
Case 3022
MsgBox "Violação de Chave!", _
vbOKOnly + vbCritical, "Mensagem de Erro"
Case 3314
MsgBox "Campo requerido não preenchido!", _
vbOKOnly + vbQuestion, "Mensagem de Aviso"
Case Else
MsgBox Err.Description
End Select

33
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Figura 20 - Função MessageBox

Abaixo os valores das constantes que esta função pode retornar:

CONSTANTE VALOR DESCRIÇÃO


vbOK 1 O botão pressionado foi o OK.
vbCancel 2 O botão pressionado foi o Cancelar.
vbAbort 3 O botão pressionado foi o Abortar.
vbRetry 4 O botão pressionado foi o Repetir.
vbIgnore 5 O botão pressionado foi o Ignorar.
vbYes 6 O botão pressionado foi o Sim.
vbNo 7 O botão pressionado foi o Não.
Tabela 8 - Constantes da Função

34
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

9. LINGUAGEM SQL
É a linguagem mais utilizada no gerenciamento de banco de dados. A
Linguagem Estruturada de Consulta (Structured Query Language) é uma liguagem
de aplicação para banco de dados relacionais. Através da instrução SQL é que o
banco de dados retorna ou executa a ação sobre o conjunto de registros. Os
comandos são, basicamente, divididos em linguagem de definição de dados (DDL) e
linguagem de manipulação de dados (DML).
Se você quiser se aprimorar mais neste vasto conceito da linguagem SQL
utilize o arquivo de help do próprio produto Access 2000, que é o mecanisno do Jet
Engine 3.5, que está no diretório C:\Windows\System\JetSql35.hlp.

Ex.: SELECT MAX([Preco]) AS [Maior_Preco]


FROM Pedidos
WHERE [Cod_Categoria] ="001" AND [Cidade] LIKE "Porto*"
ORDER BY [Data_Pedido]

Palavras-chaves:
Comandos: SELECT ...FROM
Qualificadores: WHERE
Cláusulas: ORDER BY
Operadores: =, >, <>, LIKE ...
Funções agregadas: MAX, MIN, COUNT...

9.1. LINGUAGEM DE MANIPULAÇÃO DE DADOS


São comandos que servem para recuperação dos dados, acrescentar,
remover e atualizar os registros.
9.1.1. CONSULTA SELEÇÃO
Para executar esta operação, o mecanismo de banco de dados procura a
tabela ou tabelas especificadas, extrai as colunas escolhidas, seleciona as linhas
que atendem aos critérios e classifica ou agrupa as linhas resultantes na ordem
especificada. Você pode utilizar um asterisco (*) para selecionar todos os campos
em uma tabela. Se um nome de campo for incluído em mais de uma tabela na
cláusula FROM, coloque antes dele o nome da tabela e o operador . (ponto). Se
desejar um nome de campo diferente ou um nome não for sugerido pela expressão
utilizada para gerar o campo, utilize a palavra reservada AS.

Sintaxe:

SELECT [atributo] { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2


[AS alias2] [, ...]]}
FROM expressãodetabela [, ...] [IN bancodedadosexterno]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]

35
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Exemplos:

SELECT * FROM Funcionários;

SELECT Funcionários.Departamento, Supervisores.SupvNome


FROM Funcionários INNER JOIN Supervisores
WHERE Funcionários.Departamento = Supervisores.Departamento;

SELECT DataDeNascimento AS Nascimento FROM Funcionários;

SELECT COUNT(CódigoDoFuncionário) AS ContagemDePessoas


FROM Funcionários;

9.1.2. CONSULTA CRIAR TABELA


Você pode utilizar consultas criar tabela para arquivar registros, fazer cópias
de backup das tabelas ou fazer cópias para exportar para um outro banco de
dados, ou para usar como base para relatórios que exibem dados sobre um
determinado período de tempo.
Por exemplo, você poderia produzir um relatório de Vendas Mensais por
Região, executando a mesma consulta criar tabela todos os meses. Convém definir
uma chave primária para a nova tabela. Quando você cria a tabela, os campos na
nova tabela herdam o tipo de dados e tamanho de campo de cada campo das
tabelas base da consulta, mas nenhuma outra propriedade do campo ou da tabela é
transferida. Isso servirá para não permitir a duplicação de registros quando da
utilização de uma nova consulta para acrescentar registros.

Sintaxe:

SELECT campo1[, campo2[, ...]] INTO novatabela [IN bancodedadosexterno]


FROM origem

Exemplos:

SELECT Funcionários.* INTO [Backup Func] FROM Funcionários;

9.1.3. CONSULTA ACRÉSCIMO


Você pode usar esta consulta para adicionar registros a uma tabela. Nesse
caso, o código especifica o nome e o valor de cada campo do registro. Você deve
especificar cada um dos campos do registro ao qual será atribuído um valor e um
valor para aquele campo. Quando você não especifica os campos, o valor padrão ou
Null é inserido para colunas ausentes. Os registros são adicionados ao fim da
tabela.
Se a tabela de destino contiver uma chave primária, certifique-se de
acrescentar valores exclusivos não-Null ao campo ou campos da chave primária; se
não o fizer, o mecanismo de banco de dados não acrescentará os registros. Se você
acrescentar os registros a uma tabela com um campo AutoNumeração e quiser
renumerar os registros acrescentados, não inclua esse campo.
Inclua o campo AutoNumeração na consulta se quiser conservar os valores
originais do campo.

36
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Sintaxe:

INSERT INTO destino [IN bancodedadosexterno] [(campo1[, campo2[, ...]])]


SELECT [origem.]campo1[, campo2[, ...]
FROM expressãodetabela

INSERT INTO destino [(campo1[, campo2[, ...]])]


VALUES (valor1[, valor2[, ...])

Exemplos:

INSERT INTO Funcionários (Nome,Sobrenome, Cargo)


VALUES ('Pedro', 'Silva', 'Estagiário');

9.1.4. CONSULTA ATUALIZAÇÃO


Cria uma consulta que altera valores de campos em uma tabela
especificada, com base em critérios especificados. Ela não gera um conjunto de
resultados. Além disso, depois de atualizar os registros usando uma consulta de
atualização, você não poderá desfazer a operação.
Mantenha sempre cópias de backup dos dados. Se você atualizar os
registros errados, poderá recuperá-los a partir das cópias.

Sintaxe:

UPDATE tabela SET novovalor WHERE critérios;

Exemplos:

UPDATE Pedidos SET QuantiaDoPedido = QuantiaDoPedido * 1.1,


Frete = Frete * 1.03
WHERE PaísDeDestino = 'UK';
9.1.5. CONSULTA EXCLUSÃO
Cria uma consulta que remove os registros de uma ou mais tabelas
relacionadas. No te a diferença entre excluir a tabela e os registros, se você excluir
a tabela a estrutura será perdida. Em contrapartida, quando você deleta os
registros, somente os dados são excluídos; a estrutura da tabela e todas as suas
propriedades, como atributos de campo e índices, permanecem intactos.
A consulta exclusão exclui registros inteiros, não somente os dados em
campos específicos. Se você quiser excluir valores de um campo específico, crie
uma consulta atualização que altere os valores para Null. Depois de remover os
registros utilizando uma consulta exclusão, você não poderá desfazer a operação.
Mantenha sempre cópias de backup dos dados. Assim, se você excluir os
registros errados, poderá recuperá-los a partir das cópias.

Sintaxe:
DELETE [tabela.*] FROM tabela WHERE critérios;

Exemplos:
DELETE * FROM Funcionários WHERE Cargo = 'Estagiário';

37
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

9.1.6. CONSULTA UNIÃO


Cria uma consulta que combina os resultados de duas ou mais consultas ou
tabelas independentes. Você pode mesclar os resultados de duas ou mais
consultas, tabelas e instruções SELECT, em qualquer combinação, em uma única
operação UNION. Como padrão, nenhum registro duplicado é retornado quando
você usa uma operação UNION; entretanto, você pode incluir o atributo ALL para
assegurar que todos os registros sejam retornados. Isso faz com que a execução da
consulta seja mais rápida.
Todas as consultas em uma operação UNION devem solicitar o mesmo
número de campos; contudo, os campos não deverão ter o mesmo tamanho ou tipo
de dados. Use apelidos somente na primeira instrução SELECT pois eles são
ignorados em qualquer outra.

Sintaxe:

[TABLE] consulta1 UNION [ALL] [TABLE] consulta2 [UNION [ALL] [TABLE]


consultan [... ]]

Exemplo:

TABLE [Novas Contas] UNION ALL SELECT * FROM Clientes


WHERE QuantidadeDoPedido > 1000;

9.1.7. DECLARAÇÃO PARAMETERS


Você pode utilizar uma declaração PARAMETERS para criar uma consulta
parâmetro. Uma consulta parâmetro pode ajudar a automatizar o processo de
alteração dos critérios da consulta. Em uma consulta parâmetro, o código precisará
fornecer os parâmetros a cada vez que a consulta for executada.
A declaração PARAMETERS é opcional, se a declaração incluir mais de um
parâmetro, separe-os com vírgulas. O exemplo a seguir inclui dois parâmetros:

Sintaxe:

PARAMETERS [Preço baixo] Currency, [Data inicial] DateTime;

Você pode usar nome, mas não tipo de dados em uma cláusula WHERE ou HAVING.
O exemplo a seguir espera que dois parâmetros sejam fornecidos e, então, aplica
os critérios aos registros na tabela Pedidos:

PARAMETERS [Preço baixo] Currency,


[Data inicial] DateTime;
SELECT NúmeroDoPedido, QuantiaDoPedido
FROM Pedidos
WHERE QuantiaDoPedido > [Preço baixo]
AND DataDoPedido >= [Data inicial];

38
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Sintaxe:

PARAMETERS nome tipodedados [, nome tipodedados [, ...]]

Exemplo:

PARAMETERS [Cargo do Funcionário] Text


SELECT Sobrenome, Nome, CódigoDoFuncionário
FROM Funcionários
WHERE Cargo =[Cargo do Funcionário];

9.1.8. OPERADOR "INNER JOIN"


Combina registros de duas tabelas sempre que houver valores
correspondentes em um campo comum a ambas.

Sintaxe:

... FROM tabela1 INNER JOIN tabela2 ON tabela1.campo1 opercomp


tabela2.campo2

Exemplo:

SELECT DISTINCTROW (Nome & Chr(32) & Sobrenome) AS NomeCompleto


FROM Funcionários INNER Pedidos
ON Pedidos.CódigoDoFuncionário =
Funcionários.CódigoDoFuncionário
GROUP BY (Nome & Chr(32) & Sobrenome);

9.1.9. OPERADORES "LEFT JOIN" ou "RIGHT JOIN"


Combina registros da tabela de origem quando usados em qualquer cláusula
FROM. Utilize uma operação LEFT JOIN para criar uma associação externa à
esquerda. As associações externas à esquerda incluem todos os registros da
primeira (esquerda) de duas tabelas, mesmo que não haja valores correspondentes
para os registros na segunda tabela (direita).
Utilize uma operação RIGHT JOIN para criar uma associação externa à
direita. As associações externas à direita incluem todos os registros da segunda
(direita) de duas tabelas, mesmo que não haja valores correspondentes para
registros na primeira (esquerda) tabela.

Sintaxe:

... FROM tabela1 [ LEFT | RIGHT ] JOIN tabela2 ON tabela1.campo1 opercomp


tabela2.campo2

Exemplo:

SELECT [Nome do Departamento], Nome & Chr(32) & Sobrenome AS Name


FROM Departamentos LEFT JOIN Funcionários
ON Departamentos.[Código Do Departamento] =
Funcionários.[Código Do Departamento]
ORDER BY [Nome do Departamento];

39
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

9.2. LINGUAGEM DE DEFINIÇÃO DE DADOS


São comandos que servem para definir a estrutura de tabelas, modificar as
tabelas, além de criar e excluir índices

9.2.1. INSTRUÇÃO CREATE TABLE


Use esta instrução para definir uma nova tabela e seus campos e restrições
de campo. Se NOT NULL for especificado para um campo, então é necessário que
os novos registros tenham dados válidos naquele campo. Uma cláusula
CONSTRAINT estabelece várias restrições em um campo e pode ser utilizada para
estabelecer a chave primária. Você também pode utilizar a instrução CREATE
INDEX para criar uma chave primária ou índices adicionais em tabelas existentes.
Você pode utilizar NOT NULL em um campo único ou dentro de uma cláusula
CONSTRAINT nomeada que se aplica a uma CONSTRAINT nomeada de campo único
ou de campos múltiplos. Contudo, você pode aplicar a restrição NOT NULL somente
uma vez a um campo, ou ocorrerá um erro em tempo de execução.

Sintaxe:

CREATE TABLE tabela (campo1 tipo [(tamanho)] [NOT NULL] [índice1] [, campo2
tipo [(tamanho)] [NOT NULL] [
índice2] [, ...]] [, CONSTRAINT índicedemulticampos [, ...]])

Exemplo:

CREATE TABLE EstaTabela (Nome TEXT, Sobrenome TEXT);

9.2.2. INSTRUÇÃO CREATE INDEX


Para proibir valores duplicados no campo ou campos indexados de diferentes
registros, use a palavra reservada UNIQUE. Na cláusula WITH opcional, você pode
impor regras de validação de dados. Você pode:
Proibir entradas Null no campo ou campos indexados dos novos registros,
utilizando a opção DISALLOW NULL.
Impedir que registros com valores Null no campo ou campos indexados
sejam incluídos no índice utilizando a opção IGNORE NULL.
Designar o campo ou campos indexados como a chave primária utilizando a
palavra reservada PRIMARY. Isto significa que a chave é exclusiva e, portanto, você
pode omitir a palavra reservada UNIQUE.
Observação Não use a palavra reservada PRIMARY ao criar um novo índice
numa tabela que já tenha uma chave primária; se você o fizer, ocorrerá um erro.

Sintaxe:

CREATE [ UNIQUE ] INDEX índice


ON tabela (campo [ASC|DESC][, campo [ASC|DESC], ...])
[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]

Exemplo:

CREATE INDEX NovoÍndice ON Funcionários " _


& "(TelefoneResidencial, Ramal);"

40
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

9.2.3. INSTRUÇÃO DROP TABLE ou DROP INDEX


Exclui uma tabela existente de um banco de dados ou exclui um índice
existente de uma tabela. Você deve fechar a tabela para poder excluí-la ou remover
um índice dela.

Sintaxe:

DROP {TABLE tabela | INDEX índice ON tabela}

Exemplo:

DROP INDEX NovoÍndice ON Funcionários;


DROP TABLE Funcionários;"

9.2.4. INSTRUÇÃO ALTER TABLE


Modifica a estrutura de uma tabela depois de ter sido criada com a instrução
CREATE TABLE. Através da instrução ALTER TABLE, você pode alterar uma tabela
existente de diversas maneiras. Você pode:
Utilizar ADD COLUMN para adicionar um novo campo à tabela. Você
especifica o nome do campo, tipo de dados e (para campos Texto e Binário) um
tamanho opcional. Você também pode definir um índice no campo. Se você
especificar NOT NULL para um campo, então os novos registros deverão ter dados
válidos naquele campo.
Utilizar ADD CONSTRAINT para adicionar um índice de campos múltiplos.
Utilizar DROP COLUMN para excluir um campo. Você especifica somente o
nome do campo.
Utilizar DROP CONSTRAINT para excluir um índice de campos múltiplos.
Você especifica somente o nome do índice após a palavra reservada CONSTRAINT.

Sintaxe:

ALTER TABLE tabela {ADD {COLUMN campo tipo[(tamanho)] [NOT NULL]


[CONSTRAINT índice] |
CONSTRAINT índicedemulticampos} |
DROP {COLUMN campo I CONSTRAINT nomedoíndice} }

Exemplo:

ALTER TABLE Funcionários ADD COLUMN Salário CURRENCY;

41
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

9.2.5. CLÁUSULA CONSTRAINT


Uma restrição é semelhante a um índice, embora também possa ser
utilizada para estabelecer uma relação com uma outra tabela. Você utiliza a
cláusula CONSTRAINT nas instruções ALTER TABLE e CREATE TABLE para criar ou
excluir restrições. Há dois tipos de cláusulas CONSTRAINT: um para criar uma
restrição em um campo único e outro para criar uma restrição em mais de um
campo.
Sintaxe:
Restrição de campo único:
CONSTRAINT nome {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES tabelaexterna [(campoexterno1, campoexterno2)]}

Restrição de campos múltiplos:

CONSTRAINT nome
{PRIMARY KEY (primária1[, primária2 [, ...]]) |
UNIQUE (exclusiva1[, exclusiva2 [, ...]]) |
NOT NULL (nãonulo1[, nãonulo2 [, ...]]) |
FOREIGN KEY (ref1[, ref2 [, ...]]) REFERENCES tabelaexterna
[(campoexterno1 [, campoexterno2 [, ...]])]}
Exemplo:
CREATE TABLE MinhaTabela (Nome TEXT, Sobrenome TEXT, DataNasc DATETIME,
CONSTRAINT MinhaTabelaRestrição UNIQUE (Nome, Sobrenome,
DataNasc));

9.3. FUNÇÕES AGREGADAS


Utilizando os SQL funções agregadas, você pode determinar várias
estatísticas em conjuntos de valores. Você pode utilizar estas funções em uma
consulta e em expressões agregadas na propriedade SQL de um objeto QueryDef
ou ao criar um objeto Recordset baseado em uma consulta SQL.
9.3.1. MÉDIA
Calcula a média aritmética de um conjunto de valores contido em um campo
especificado em uma consulta.

Sintaxe: Avg(expr)

SELECT Avg(Frete) AS [Média do Frete]


FROM Pedidos WHERE Frete > 100;
9.3.2. CONTAR
Calcula o número de registros retornado por uma consulta.

Sintaxe: Count(expr)

SELECT Count (PaísDeDestino) AS [Pedidos UK]


FROM Pedidos WHERE PaísDeDestino = 'UK';

42
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

9.3.3. MÍNIMO e MÁXIMO


Retornam o mínimo ou o máximo de um conjunto de valores contido em um
campo especificado em uma consulta.

Sintaxe: Min(expr)
Max(expr)

SELECT Min(Frete) AS [Frete Baixo], Max(Frete)AS [Frete Alto]


FROM Pedidos
WHERE PaísDeDestino = 'UK';

9.3.4 SOMA
Retorna a soma de um conjunto de valores contido em um campo
especificado em uma consulta.

Sintaxe: Sum(expr)

SELECT Sum(PreçoUnitário*Quantidade) AS [Total de Vendas UK]


FROM Pedidos INNER JOIN [Detalhes do Pedido]
ON Pedidos.NúmeroDoPedido = [Detalhes do Pedido].NúmeroDoPedido
WHERE (PaísDeDestino = 'UK');

10. TÉCNICAS DE PESQUISA DE DADOS

O Objeto de Acesso a Dados (DAO) permite que você manipule a estrutura


do seu banco de dados e os dados nele contidos através dos objetos Recordset. A
maioria das propriedades que podem ser definidas como objetos DAO são definidas
pelo mecanismo de banco de dados Microsoft Jet 3.5.
A maneira mais fácil e rápida de se fazer isso é criar variáveis de objeto que
representem os diferentes objetos com os quais você precisa trabalhar e referir-se
à elas no seu código. Por exemplo, o código a seguir cria um novo objeto TableDef
(tabela) e define sua propriedade Name com o nome da tabela:

Dim dbs As Database, tdf As TableDef


Set dbs = CurrentDb
Set tdf = dbs.CreateTableDef
tdf.Name = "Contatos"

Você pode utilizar a propriedade RecordsetClone para referir-se ao objeto


Recordset de um formulário, especificado pela propriedade RecordSource do
formulário. O RecordsetClone é uma cópia da consulta ou tabela base especificada
pela propriedade RecordSource do formulário. Se um formulário estiver baseado
em uma consulta, por exemplo, referir-se à propriedade RecordsetClone equivale a
criar um clone de um objeto Recordset utilizando a mesma consulta. Você deve
utilizar esta propriedade para navegar ou manipular os registros de um formulário
independente do próprio formulário.

43
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Você pode, por exemplo, utilizar a propriedade RecordsetClone quando


desejar utilizar um método, tal como o método FindFirst, que não pode ser utilizado
com formulários. Quando um novo objeto Recordset é aberto, o seu primeiro
registro é o registro atual. Ao utilizar um dos métodos Find ou Move para tornar
atual qualquer outro registro do Recordset, você deve sincronizar o registro atual
do objeto Recordset com o registro atual do formulário atribuindo o valor da
propriedade DAO Bookmark à propriedade Bookmark do formulário.
Você pode utilizar a propriedade RecordCount para contar o número de
registros em um objeto Recordset. O exemplo a seguir mostra como você pode
combinar a propriedade RecordCount e a propriedade RecordsetClone para contar
os registros em um formulário:

Forms!Pedidos.RecordsetClone.MoveLast
MsgBox "Este formulário contém " _
& Forms!Pedidos.RecordsetClone.RecordCount _
& " registros.", vbInformation, "Quantidade de Registros"

O próximo exemplo utiliza a propriedade RecordsetClone e o objeto


Recordset para sincronizar o registro de um conjunto de registros com o registro
atual do formulário. Quando o nome de uma empresa é selecionado a partir de uma
caixa de combinação, o método FindFirst é utilizado para localizar o registro dessa
empresa e a propriedade DAO Bookmark do objeto Recordset é atribuída à
propriedade Bookmark do formulário fazendo com que este exiba o registro
encontrado.

Sub Cod_Empresa_AfterUpdate()
Dim rst As Recordset
Dim strLocalizar As String

Set rst = Me.RecordsetClone


strLocalizar = Str(Me!Cod_Empresa)
rst.FindFirst " Cod_Empresa = " & strLocalizar
If rst.NoMatch Then
MsgBox "Esta empresa não foi localizada. Tente outro código."
Else
Me.Bookmark = rst.Bookmark
End If
rst.Close
End Sub

44
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

10.1. MÉTODO FIND

Localizam o primeiro registro, o último registro, o registro anterior ou o


próximo registro em um objeto Recordset tipo dynaset ou snapshot que satisfaça
aos critérios especificados e torna esse registro o registro.

Sintaxe: Um String usado para localizar o registro. É como a


cláusula WHERE em uma instrução SQL, mas sem a palavra
WHERE.

conjuntoderegistros.{FindFirst | FindLast | FindNext | FindPrevious} critérios

Uma variável de objeto que representa


um objeto Recordset tipo dynaset ou
snapshot existente.

Se você quiser incluir todos os registros na sua pesquisa - não apenas os


que atendam a uma condição específica - use o método Move para se mover de
registro para registro. Para localizar o registro em um Recordset tipo table, use o
método Seek.
Se um registro que satisfaça aos critérios não for localizado, o ponteiro do
registro atual será desconhecido e a propriedade NoMatch definida como True. Se
conjuntoderegistros contiver mais de um registro que satisfaça aos critérios,
FindFirst localizará a primeira ocorrência, FindNext localizará a próxima ocorrência
e assim por diante.
Cada um dos métodos Find localiza o registro, ou seja:
FindFirst Encontra o primeiro registro;
FindLast Encontra o último registro;
FindNext Encontra o próximo registro;
FindPrevious Encontra o registro anterior.
Sempre verifique o valor da propriedade NoMatch para determinar se a
operação Find encontrou o registro desejado, se sim esta propriedade será False.
Se falhar, ela será True e o registro atual não será mostrado. Nesse caso, você
deverá posicionar o ponteiro do registro atual de volta a um registro válido.

45
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

O exemplo a seguir cria um objeto Recordset do tipo dynaset e, então,


utiliza o método FindFirst para localizar o primeiro registro que satisfaz o critério
especificado. Em seguida, o procedimento localiza os demais registros que
satisfazem o critério.

Sub LocalizarRegistro()
Dim dbs As Database, rst As Recordset
Dim strCritério As String
' Retorna referência ao banco de dados atual.
Set dbs = CurrentDb
' Define critério de localização.
strCritério = "[PaísDeDestino] = 'Reino Unido' And " _
& "[DataDoPedido] >= #01/01/2001#"
' Cria um objeto Recordset do tipo dynaset com base na tabela
Pedidos.
Set rst = dbs.OpenRecordset("Pedidos", dbOpenDynaset)
' Localiza o primeiro registro coincidente.
rst.FindFirst strCritério
' Verifica se o registro foi localizado.
If rst.NoMatch Then
MsgBox "Nenhum registro foi localizado."
Else
' Localiza outros registros coincidentes.
Do Until rst.NoMatch
Debug.Print rst!PaísDeDestino; " "; rst!DataDoPedido
rst.FindNext strCritério
Loop
End If
rst.Close
Set dbs = Nothing
End Sub

Propriedade Bookmark

Define ou retorna um indicador que identifica com exclusividade o registro


atual em um objeto Recordset. Quando você cria ou abre um objeto Recordset,
cada um de seus registros já possui um indicador exclusivo. Você pode salvar o
indicador do registro atual atribuindo o valor da propriedade Bookmark a uma
variável. Para retornar rapidamente a esse registro a qualquer momento depois de
se mover para um registro diferente, defina a propriedade Bookmark do objeto
Recordset com o valor daquela variável.
Para criar um indicador de um registro diferente do registro atual, mova
para o registro desejado e atribua o valor da propriedade Bookmark a uma variável
String que identifique o registro. Se você usar o método Clone para criar uma cópia
de um objeto Recordset, as configurações da propriedade Bookmark do original e
do objeto Recordset duplicado serão idênticas e poderão ser utilizadas a qualquer
instante.
O valor da propriedade Bookmark não é o mesmo que o número de um
registro.

46
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

A seguir um exemplo onde inserimos uma parte do nome do contato a ser


encontrado. Se o nome for encontrado, a propriedade Bookmark do formulário será
definida com a propriedade Bookmark do objeto Recordset, o que move o registro
atual do formulário para o nome encontrado.

Private Sub cmdLocalizarNomeDoContato_Click()


Dim rst As Recordset, strCritério As String
strCritério = "[NomeDoContato] Like '*" & InputBox("Digite algumas das
"_
& "primeiras letras do nome a ser localizado") & "*'"
Set rst = Me.RecordsetClone
rst.FindFirst strCritério
If rst.NoMatch Then
MsgBox "Nenhum contato foi encontrado."
Else
Me.Bookmark = rst.Bookmark
End If
End Sub

10.2. MÉTODO SEEK


Localiza o registro em um objeto Recordset tipo table indexado que satisfaça
os critérios especificados para o índice atual e faz dele o registro atual (somente
espaços de trabalho do Microsoft Jet).

Sintaxe

conjuntoderegistros.Seek comparação, chave1, chave2...chave13

A sintaxe do método Seek possui as seguintes partes:

Parte Descrição
conjuntoderegistros Uma variável de objeto que representa um objeto
Recordset tipo table que possui um índice definido como especificado pela
propriedade Index do objeto Recordset.
comparação Uma das seguintes expressões de seqüência: <, <=, =, >= ou
>.
chave1, chave2...chave13 Um ou mais valores que correspondem aos
campos no índice atual do objeto Recordset, como especificado pela configuração
da sua propriedade Index. Você pode usar até 13 argumentos chave.
Comentários

Você deve definir o índice atual com a propriedade Index antes de usar
Seek. Se o índice identificar um campo chave não-exclusivo, Seek localizará o
primeiro registro que satisfizer os critérios.
O método Seek pesquisa pelos campos-chave especificados e localiza o
primeiro registro que satisfaz os critérios especificados por comparação e chave1.
Uma vez encontrado, ele torna esse registro no registro atual e define a
propriedade NoMatch como False. Se o método Seek não conseguir localizar uma
correspondência, a propriedade NoMatch será definida como True e o registro atual
ficará indefinido.

47
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Se comparação for igual a (=), maior ou igual a (>=), ou maior que (>),
Seek começará no início do índice e pesquisará para frente.
Se comparação for menor que (<) ou menor ou igual a (<=), Seek
começará no final do índice e pesquisará para trás. Entretanto, se houver alguma
entrada de índice duplicada no final do índice, Seek começará em uma entrada
arbitrária entre as duplicatas e pesquisará para trás.
Você deve especificar valores para todos os campos definidos no índice. Se
você utilizar Seek com um índice de várias colunas e não especificar um valor de
comparação para cada campo no índice, não poderá utilizar o operador igual a (=)
na comparação. Isso porque alguns dos campos dos critérios (chave2, chave3,
etc.). adotarão Null como padrão, o que provavelmente não terá correspondência.
Portanto, o operador igual a (=) só operará corretamente se você tiver um registro
que seja todo Null, exceto a chave que você estiver procurando. Recomenda-se que
você utilize o operador maior ou igual a (>=) em seu lugar.

O argumento chave1 deve ser do mesmo tipo de dados do campo do campo


correspondente no índice atual. Por exemplo, se o índice atual fizer referência a um
campo numérico (como Código Do Funcionário), chave1 deve ser numérico. Da
mesma forma, se o índice atual fizer referência a um campo Texto (como
Sobrenome), chave1 deverá ser uma seqüência.
Não é necessário que haja um registro atual quando você utilizar Seek.
Você pode utilizar a coleção Indexes para enumerar os índices existentes.
Para localizar um registro em um Recordset tipo dynaset ou snapshot que
corresponda a uma condição específica que não esteja coberta pelos índices
existentes, use os métodos Find. Para incluir todos os registros, e não apenas os
que correspondam a uma condição específica, use os métodos Move para mover de
registro para registro.
Você não pode usar o método Seek em uma tabela vinculada, pois as
tabelas vinculadas não podem ser abertas como objetos Recordset tipo table.
Porém, se você usar o método OpenDatabase para abrir diretamente um banco de
dados ISAM instalável (não-ODBC), poderá usar Seek nas tabelas desse banco de
dados.
Em um espaço de trabalho ODBCDirect, os métodos Find e Seek não estão
disponíveis em nenhum tipo de objeto Recordset, pois a execução de Find ou Seek
através de uma conexão ODBC não é muito eficiente em uma rede. Em vez disso,
você deve projetar a consulta (ou seja, utilizar o argumento origem para o método
OpenRecordset) com uma cláusula WHERE adequada que restrinja os registros
retornados apenas àqueles que correspondam aos critérios que você utilizaria em
Find ou Seek.

48
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

O exemplo a seguir cria um novo objeto Index em uma tabela Funcionários.


O novo índice consiste em dois campos, Sobrenome e Nome. Em seguida, o
procedimento utiliza o método Seek para localizar um registro específico.
Sub NovoÍndice()
Dim dbs As Database, tdf As TableDef, idx As Index
Dim fldSobrenome As Field, fldNome As Field, rst As Recordset
' Retorna referência ao banco de dados atual.
Set dbs = CurrentDb
' Retorna referência à tabela Funcionários.
Set tdf = dbs.TableDefs!Funcionários
' Retorna o objeto Index que aponta para o novo índice.
Set idx = tdf.CreateIndex("NomeCompleto")
' Cria e acrescenta campos de índice.
Set fldSobrenome = idx.CreateField("Sobrenome", dbText)
Set fldNome = idx.CreateField("Nome", dbText)
idx.Fields.Append fldSobrenome
idx.Fields.Append fldNome
' Acrescenta objeto Index.
tdf.Indexes.Append idx
tdf.Indexes.Refresh
' Abre objeto Recordset do tipo table.
Set rst = dbs.OpenRecordset("Funcionários")
' Faz do novo índice o índice atual.
rst.Index = idx.Name
' Especifica registro a ser localizado.
rst.Seek "=", "Fuller", "Andrew"
If rst.NoMatch Then
Debug.Print "A pesquisa não foi bem-sucedida!"
Else
Debug.Print "A pesquisa foi bem-sucedida."
End If
rst.Close
Set dbs = Nothing
End Sub

49
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

11. INTEGRANDO COM O OFFICE 2000


O Visual Basic for Applications (VBA) é a linguagem que lhe permite
trabalhar com objetos no Office. O propósito da automação ActiveX é permitir que
um desenvolvedor use a funcionalidade de um aplicativo a partir de outro
aplicativo. O pacote do Microsoft Office contém muitas funcionalidades. Por
exemplo, se você precisar permitir que um usuário crie uma mala-direta, por que
tentar desenvolver sua própria função de mala-direta quando os processadores de
texto já fazem isso? Da mesma forma, se você precisa rodar um cálculo financeiro
como a amortização de uma dívida, por que escrever outra função quando esse
recurso já existe dentro de outro aplicativo?
Todas as ferramentas estão disponíveis para essa integração, de modo que,
em muitos casos, o usuário não precisa saber que o Excel, por exemplo, calculou os
juros da dívida por meio da automação ActiveX em vez de algum algoritmo dentro
do próprio VBA.
Como o DAO (Data Access Objects) é uma hierarquia de objetos com suas
próprias propriedades e métodos, antes de qualquer um dos objetos no Office97
poderem ser reconhecidos pelos seus aplicativos, você precisa acrescentar as
referências apropriadas ao seu projeto do banco de dados. Você pode fazer isso
selecionando ou criando um módulo e no modo estrutura selecionar Ferramentas
| Referências... no menu do Access, para depois escolher as referências de objeto
necessárias, como mostrado na figura abaixo.

Neste caso, estão


selecionadas as referências
do Access, do Word, do
Excel e do próprio DAO,
além da biblioteca do VBA.

Figura 21 - Referências Utilizadas no Aplicativo

50
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

11.1 FUNÇÕES CREATEOBJECT E GETOBJECT


O CreateObject cria uma referência para um objeto ActiveX enquanto
GetObject retorna uma referência a um objeto ActiveX a partir de um arquivo.
Você precisa usar a função CreateObject quando não há nenhuma ocorrência atual
do objeto já instanciada. Se CreateObjet for usada quando houver uma ocorrência
do objeto instanciado, uma nova ocorrência é criada. No entanto, se um objeto for
registrado como objeto de uma única ocorrência, então, independentemente de
quantas vezes CreateObject seja chamada, somente uma ocorrência do objeto é
criada. Comparando, GetObject é necessária quando uma ocorrência de um objeto
já existe ou se você quiser criar um objeto com um arquivo já carregado.
Por exemplo, dê uma olhada nos seguintes exemplos de código. Aqui,
CreateObject é usada para criar uma nova instância do Word:

Dim oleWord As Word.Application


Set oleWord = CreateObject("Word.Application")

Se quisermos criar o mesmo objeto baseado no objeto associado com um


determinado arquivo, poderíamos usar GetObject. Por exemplo:

Dim oleWord As Object


Set oleWord = GetObject("c:\temp\RotinasAccess.doc")

Quando você não precisar mais da referência do objeto, certifique-se de


limpar a memória liberando a referência ao objeto, já que os objetos do Office são
grandes consumidores de memória.

Set oleWord = Nothing

No exemplo anterior, a variável que conterá o objeto foi declarada como tipo
Object, não como tipo Word.Application. O VBA sabe qual objeto criar porque as
extensões de arquivo estão registradas no Windows em HKEY_CLASSES_ROOT. Por
isso, a extensão .DOC significa Microsoft Word e .XLS indica o Excel.

51
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

11.2. INSTANCIANDO O MICROSOFT WORD

O Microsoft Word é o processador de texto mais popular no mercado


atualmente. O Word tem um complexo modelo de objeto, em que os três
componentes principais do modelo são: Documents, Windows e Selection.

Microsoft WORD

Documents

Windows

Selection

O modelo de objeto do Word permite-lhe isolar partes muito específicas de


um documento do Word.

Dim oleWord As Word.Application


Dim docDocument As Document

Set oleWord = CreateObject("Word.Application")


OleWord.Visible = True
Set docDocument = oleWord.Documents._
Open("c:\senac\exerc01.doc")
MsgBox docDocument.Paragraphs(3)
MsgBox docDocument.Sentences(3)
MsgBox docDocument.Words(15)
MsgBox docDocument.Characters(35)
Set oleWord = Nothing

ou então você pode combinar essas referências dos objetos, como segue:

MsgBox docDocument.Paragraphs(3).Sentences(3).Word(5)

Este comando irá retornar a 5ª palavra da 3ª frase do 3º parágrafo.

52
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

11.3. INSTANCIANDO O MICROSOFT EXCEL

O Excel é um aplicativo de planilha eletrônica que contém dentro de si uma


vasta coleção de funções matemáticas, financeiras e estatísticas. O modelo do
objeto Excel é bem complexo, como pode ver no esquema abaixo.

APPLICATION

Workbooks
WorkSheets Add-Int

Charts AutoCorrect
Document Properties Assistant
VBProject DBug

CustomViews Dialogs

Command Bars WorksheetFunction

PivotCaches RecentFiles

Styles FileSearch
Borders VBE
Font ODBCErrors
Interior
Windows
Panels
Names

Routing Slip
Mailer
Por exemplo, um aplicativo de investimento precisaria calcular uma fórmula
para apurar um valor futuro.

Cálculo do valor futuro

Dim oleExcel As Excel.Application


Dim oleWorkBook As Excel.Workbook
Dim oleWorkSheet As Excel.Worksheet

Set oleExcel = CreateObject("Excel.Application")

' Cria uma referência para um novo objeto WorkBook


' ao adicioná-lo à coleção WorkBook.
Set oleWorkBook = oleExcel.Workbooks.Add

' Cria uma referência a um novo objeto WorkSheet ao


' adicioná-lo à coleção WorkSheet.
Set oleWorkSheet = oleExcel.Worksheets.Add

' Atribui alguns valores padrões às caixas de texto.


txtDepósitoInic = 2500

53
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

txtJurosAnuais = 8
txtDepósitoMensal = 400

' Escreve os valores em células individuais na planilha.


' Por exemplo, a referência Cells(2, 1) indica a segunda
' linha, primeira coluna.
oleWorkSheet.Cells(1, 1) = Val(txtDepósitoInic) * -1
oleWorkSheet.Cells(2, 1) = Val(txtJurosAnuais) / 12
oleWorkSheet.Cells(3, 1) = Val(txtDepósitoMensal) * -1

' Escreve o valor futuro da fórmula do Excel em uma célula.


' Os valores são escritos por meio de VBA exatamente como se
' você os digitasse diretamente no Excel.

oleWorkSheet.Cells(4, 1).Formula = "=FV(A2%, 360, A3, A1, 1)"

' Retorna o resultado para a caixa de texto.


txtResult = oleWorkSheet.Cells(4, 1)

Set oleExcel = Nothing


Set oleWorkBook = Nothing
Set oleWorkSheet = Nothing

Suponha que você queira exportar um Recordset para uma planilha do


Excel, esse exemplo procura demonstrar como escrever nas células de uma
planilha.

Dim oleExcel As Excel.Application


Dim oleWorkBook As Excel.Workbook
Dim oleWorkSheet As Excel.Worksheet
Dim dbDadosPrinc As Database
Dim snpPais As Recordset
Dim strPath as String
Dim x As Integer
Dim y As Integer

x=1
Set oleExcel = CreateObject("Excel.Application")
Set oleWorkBook = oleExcel.Workbooks.Add
Set oleWorkSheet = oleExcel.Worksheets.Add
strPath = "C:\Arquivos de Programas\Microsoft Office\Office\Exemplos\"
Set dbDadosPrinc = OpenDatabase(strPath & "Northwind.mdb")
Set snpPais = dbDadosPrinc.OpenRecordset _
("SELECT * FROM pais", dbOpenSnapshot, dbForwardOnly)
Do While Not snpPais.EOF
For y = 1 To snpPais.Fields.Count
oleWorkSheet.Cells(x, y) = snpPais.Fields(y - 1)
Next y
x=x+1
snpPais.MoveNext
Loop
oleWorkSheet.SaveAs "c:\temp\pais.xls"
snpPais.Close
Set snpPais = Nothing
Set oleExcel = Nothing
Set oleWorkBook = Nothing
Set oleWorkSheet = Nothing

54
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

11.4. INSTANCIANDO O MICROSOFT ACCESS


De especial interesse para os desenvolvedores de bancos de dados, o
Microsoft Access é também habilitado para a automação ActiveX. O modelo de
objetos do Access inicia com um objeto Application.

APPLICATION

References

Forms
Controls
Reports
Controls
Modules

Screen

Docmd

Algumas funcionalidades mais úteis relacionadas com bancos de dados é o


objeto DoCmd e que envolve o uso de relatórios do Access. O Access tem
assistentes de relatórios permitindo que os usuários criem relatórios com facilidade.
Usando a automação ActiveX, você pode agora dar aos usuários acesso aos
relatórios que eles criaram através do método OpenReport.

Dim oleAccess As Access.Application


Set oleAccess = CreateObject("Access.Application")
strPath = "C:\Arquivos de Programas\Microsoft Office\Office\Exemplos\"
oleAccess.OpenCurrentDatabase strPath & "Northwind.mdb"
oleAccess.DoCmd.OpenReport "Listagem de Pedidos", acViewPreview
oleAccess.Visible = True

Outra aplicação para o objeto DoCmd é permitir que o Access faça a maior
parte da exportação de dados para você. Nem o Visual Basic nem DAO oferecem
uma capacidade inerente de transferir dados para/de uma tabela. Os tipos possíveis
de saída para o método OutPutTo incluem as seguintes constantes:

• AcFormatActiveXServer
• AcFormatHTML
• AcFormatIIS
• AcFormatRTF
• AcFormatTXT
• AcFormatXLS

Enviando uma tabela para uma planilha

Dim oleAccess As Access.Application


Set oleAccess = CreateObject("Access.Application")
strPath = "C:\Arquivos de Programas\Microsoft Office\Office\Exemplos\"
oleAccess.OpenCurrentDatabase strPath & "Northwind.mdb"
oleAccess.DoCmd.OutputTo acOutputTable, "País", _
acFormatXLS, "c:\temp\Pais.xls", True

55
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

O método TransferDatabase pode ser usado, entre outras coisas, para


fazer cópias de backup das tabelas dentro de um banco de dados. Por exemplo, o
código a seguir faz a uma cópia da tabela Aluno chamada CopiaAluno.

Dim oleAccess As Access.Application


Set oleAccess = CreateObject("Access.Application")
strPath = "C:\Arquivos de Programas\Microsoft Office\Office\Exemplos\"
oleAccess.OpenCurrentDatabase strPath & "Northwind.mdb"
oleAccess.DoCmd.TransferDatabase acExport, "Microsoft Access", _
"c:\temp\escola.mdb", acTable, _
"Produtos", "tblProdutos ", False

O método TransferSpreadSheet permite-lhe importar ou exportar dados


entre o banco de dados atual do Access e um arquivo de planilha. Você também
pode vincular planilhas do Excel ao arquivo MDB atual. Com uma planilha
vinculada, você pode visualizar e editar os dados da planilha com o Access
enquanto ainda permite acesso completo aos dados do seu programa de planilha do
Excel. Permitem os seguintes tipos de transferência:

• AcSpreadSheetTypeExcel3
• AcSpreadSheetTypeExcel4
• AcSpreadSheetTypeExcel5
• AcSpreadSheetTypeExcel7
• AcSpreadSheetTypeExcel97
• AcSpreadSheetTypeLotusWK1
• AcSpreadSheetTypeLotusWK3
• AcSpreadSheetTypeLotusWK4

No exemplo mostrado a seguir, o conteúdo da tabela Clientes está sendo


exportado para uma planilha do Excel. O valor True na lista de parâmetros indica
que a primeira linha na planilha deve conter os nomes das colunas.

Dim oleAccess As Access.Application


Set oleAccess = CreateObject("Access.Application")
strPath = "C:\Arquivos de Programas\Microsoft Office\Office\Exemplos\"
oleAccess.OpenCurrentDatabase strPath & "Northwind.mdb"
oleAccess.DoCmd.TransferSpreadsheet acExport, _
acSpreadSheetTypeExcel97, "Clientes", "c:\temp\Clientes.xls", True

O método TransferText permite importar, vincular ou exportar dados de


arquivos de texto. Você também pode vincular os dados em um arquivo de texto
com o banco de dados atual do Access através de diferentes delimitações para os
dados.

56
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

12. EXERCÍCIOS PROPOSTOS

Todos os itens abaixo devem ser feitos no aplicativo entregue em sala de


aula de nome AccessVBA.mdb.

1. Criar um esquema de segurança para o aplicativo usando a coleção de


grupos e usuários do arquivo de grupo de trabalho e criar um formulário
que permita a troca de senha do usuário. Deve-se criar formulários para
cadastrar os grupos e usuários e também para associar os usuários aos
grupos, além de definir as permissões de acesso destes ao sistema.

2. Utilizar o objeto Docmd para encontrar registros, para abrir formulários e


abrir relatórios, para executar os aplicativos - calculadora, word, excel e
o explorer, executar uma importação de dados de maneira "largura fixa"
para que se possa recepcionar os registros, através de disquete, para
acrescentá-los ao banco de dados.

3. Criar uma rotina que execute um backup de segurança dos dados do seu
sistema. Para isso precisamos armazenar em disquete somente as
tabelas do banco.

4. Criar uma barra de comandos padrão para utilização em todos os


formulários do sistema. Esta barra deve conter botão de comando para
pesquisar, adicionar, alterar e excluir os registros, além de permitir a
impressão dos dados da tela e fechar o formulário. Criar uma rotina para
habilitar/desabilitar os botões conforme o contexto.

5. Criar procedimentos necessários para manipulação de registros do DAO,


assim como inserir, alterar e excluir registros, pesquisar determinado
registro e navegar entre os mesmos.

6. Criar um formulário de Clientes com dois subformulários, um com todos


os pedidos e outro com todos os produtos comprados naquele pedido,
inserir um campo calculado no rodapé deste subformulário com a soma
total de preço unitário.

7. Criar formulários encadeados e passando parâmetros, ou seja, adicione


no formulário de Clientes um controle de grupo de opção onde tenha
botões de "Abrir Pedidos deste mês", "Abrir Pedidos deste ano", "Abrir
Pedidos até hoje", a partir daí tem-se que abrir o outro formulário
exibindo os registros de acordo com o selecionado no formulário anterior.

8. Criar uma rotina para desabilitar/habilitar a tecla SHIFT, já que esta tecla
permite que o usuário aborte os procedimentos de inicialização do
aplicativo, liberando-o no seu modo de estrutura. Tem-se que ter
cuidado, pois se você desabilitar a tecla shift em seu aplicativo nem você
poderá abri o BD no modo estrutura.

9. Criar um relatório com totalização por página. Temos que criar uma
variável para zerar o acumulador e depois devemos, a cada registro
impresso, incrementar o valor armazenado no acumulador.

10. Criar um relatório de impressão de etiquetas e não desperdiçar etiquetas


deixadas em branco, para isso precisamos saber quantas etiquetas
devemos pular para na próxima imprimir.

57
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

11. Executar filtro por formulário para exibir todos os clientes que realizaram
compras no Brasil, com a possibilidade de se remover o filtro aplicado.
Criar um botão para exibir o relatório de todos as compras realizadas
pelo cliente que você estiver posicionado.

12. Utilizar código para testar os diversos eventos de um objeto, tais como:
antes de inserir, antes de atualizar, ao sair do controle, ao fechar, no
cronômetro, ao clicar, e outros.

13. Utilização do objeto Calendário para organizar as datas de entrega de


determinados produtos de determinado período: por data atual, por mês,
e até aquela data.

58
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Anexo 1

Erros Interceptáveis do VBA (Microsoft JET + Objeto DAO)

Os erros interceptáveis do mecanismo de banco de dados Microsoft Jet podem ocorrer


enquanto um aplicativo estiver sendo executado, seja dentro do ambiente de desenvolvimento
ou como um arquivo executável autônomo. Você pode testar e responder a erros ocorridos
utilizando o objeto Error.

Código Mensagem

2420 Erro de sintaxe em número.


2421 Erro de sintaxe em data.
2422 Erro de sintaxe em seqüência.
2423 Utilização inválida de '.', '!' ou '()'.
2424 Nome desconhecido.
2425 Nome de função desconhecido.
2426 Função não-disponível em expressões.
2427 Objeto sem valor.
2428 Argumentos inválidos utilizados com a função de domínio.
2429 Operador In sem ().
2430 Operador Between sem And.
2431 Erro de sintaxe (operador ausente).
2432 Erro de sintaxe (vírgula).
2433 Erro de sintaxe.
2434 Erro de sintaxe (operador ausente).
2435 ) extra.
2436 ), ] ou item ausentes.
2437 Utilização inválida de barras verticais.
2438 Erro de sintaxe.
2439 Número incorreto de argumentos utilizados com a função.
2440 Função IIF sem ().
2442 Utilização inválida de parênteses.
2443 Utilização inválida do operador Is.
2445 Expressão muito complexa.
2446 Memória insuficiente durante o cálculo.
2447 Utilização inválida de '.', '!' ou '()'.
2448 Não é possível definir o valor.
3000 Erro <Item> reservado; não existe mensagem para este erro.
3001 Argumento inválido.
3002 Não foi possível iniciar a sessão.
3003 Não foi possível iniciar a transação; já existem muitas transações aninhadas.
3005 <Nome do banco de dados> não é um nome de banco de dados válido.
3006 O banco de dados <nome> está bloqueado exclusivamente.
3007 Não é possível abrir o banco de dados da biblioteca <nome>.
3008 A tabela <nome> já está aberta exclusivamente por outro usuário ou já está aberta
através da interface do usuário e não pode ser manipulada programaticamente.
3009 Você tentou bloquear a tabela <tabela> enquanto a abria, mas ela não pode ser
bloqueada porque está em uso no momento. Aguarde um instante e, em seguida, tente
a operação novamente.
3010 A tabela <nome> já existe.
3011 O mecanismo de banco de dados Microsoft Jet não pôde encontrar o objeto <nome>.
Certifique-se de que o objeto existe e que você digitou o seu nome e o nome do
caminho corretamente.
3012 O objeto <nome> já existe.
3013 Não foi possível renomear o arquivo ISAM instalável.
3014 Não é possível abrir mais tabelas.

59
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3015 <Nome do índice> não é um índice nesta tabela. Consulte a coleção Indexes do objeto
TableDef para determinar os nomes de índice válidos.
3016 O campo não caberá no registro.
3017 O tamanho do campo é grande demais.
3018 Não foi possível encontrar o campo <nome>.
3019 Operação inválida sem um índice atual.
3020 Você tentou chamar Update ou CancelUpdate ou tentou atualizar um Field em um
conjunto de registros sem chamar primeiro AddNew ou Edit.
3021 Sem registro atual.
3022 As alterações que você solicitou à tabela não foram bem-sucedidas porque criariam
valores duplicados no índice, na chave primária ou na relação. Altere os dados no
campo ou campos que contêm dados duplicados, remova o índice ou redefina-o para
permitir entradas duplicadas e tente novamente.
3023 AddNew ou Edit já utilizado.
3024 Não foi possível encontrar <nome>.
3025 Não é possível abrir mais arquivos.
3026 Espaço insuficiente em disco.
3027 Não foi possível atualizar. O banco de dados ou objeto é somente leitura.
3028 Não é possível iniciar seu aplicativo. O arquivo de informações do grupo de trabalho
está ausente ou aberto exclusivamente por outro usuário.
3029 Nome de conta ou senha inválidos.
3030 <Nome da conta> não é um nome de conta válido.
3031 Senha inválida.
3032 Não é possível executar esta operação.
3033 Você não tem as permissões necessárias para utilizar o objeto <nome>. Faça o seu
administrador do sistema ou a pessoa que criou este objeto estabelecer as permissões
apropriadas para você.
3034 Você tentou aceitar ou cancelar uma transação sem utilizar primeiro BeginTrans.
3036 O banco de dados alcançou o tamanho máximo.
3037 Não é possível abrir mais tabelas ou consultas.
3039 Não foi possível criar o índice; muitos índices já definidos.
3040 Erro de E/S em disco durante a leitura.
3041 Não é possível abrir um banco de dados criado com uma versão anterior do seu
aplicativo.
3042 Sem identificadores de arquivo do MS-DOS.
3043 Erro de disco ou rede.
3044 <Caminho> não é um caminho válido. Certifique-se de que o nome do caminho está
digitado corretamente e que você está conectado ao servidor no qual se encontra o
arquivo.
3045 Não foi possível utilizar <nome>; o arquivo já está em utilização.
3046 Não foi possível salvar; atualmente bloqueado por outro usuário.
3047 O registro é grande demais.
3048 Não é possível abrir mais bancos de dados.
3049 Não é possível abrir o banco de dados <nome>. Ele pode não ser um banco de dados
que o seu aplicativo reconheça ou o arquivo pode estar corrompido.
3051 O mecanismo de banco de dados Microsoft Jet não pode abrir o arquivo <nome>. Ele
já está aberto exclusivamente por outro usuário ou você precisa de permissão para
visualizar seus dados.
3052 O número de bloqueios de compartilhamento de arquivos do MS-DOS foi excedido.
Você precisa aumentar o número de bloqueios instalados com Share.exe.
3053 Tarefas cliente em excesso.
3054 Campos Memorando ou ‘Objeto OLE’ em excesso.
3055 Nome de campo inválido.
3056 Não foi possível reparar este banco de dados.
3057 Operação não suportada em tabelas vinculadas.
3058 O índice ou chave primária não pode conter um valor Null.
3059 Operação cancelada pelo usuário.
3060 Tipo de dados incorreto para o parâmetro <parâmetro>.
3061 Muito poucos parâmetros. Eram esperados <número>.
3062 Alias de saída <nome> duplicado.

60
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3063 Destino de saída <nome> duplicado.


3064 Não é possível abrir a consulta ação <nome>.
3065 Não é possível executar uma consulta seleção.
3066 A consulta deve ter pelo menos um campo de destino.
3067 A entrada da consulta deve conter pelo menos uma tabela ou consulta.
3068 Nome de alias inválido.
3069 A consulta ação <nome> não pode ser utilizada como origem da linha.
3070 O mecanismo de banco de dados Microsoft Jet não reconhece <nome> como um nome
de campo ou expressão válida.
3071 Esta expressão está digitada incorretamente ou é complexa demais para ser avaliada.
Por exemplo, uma expressão numérica pode conter muitos elementos complicados.
Tente simplificar a expressão atribuindo partes da expressão a variáveis.
3073 A operação deve utilizar uma consulta atualizável.
3074 Não é possível repetir o nome da tabela <nome> na cláusula FROM.
3075 <Mensagem> na expressão de consulta <expressão>.
3076 <Nome> na expressão de critério.
3077 <Mensagem> na expressão.
3078 O mecanismo de banco de dados Microsoft Jet não consegue encontrar a tabela de
entrada ou a consulta <nome>. Certifique-se de que ela existe e que o seu nome está
digitado corretamente.
3079 O campo especificado <campo> poderia se referir a mais de uma tabela listada na
cláusula FROM da sua instrução SQL.
3080 A tabela associada <nome> não está listada na cláusula FROM.
3081 Não é possível associar mais de uma tabela com o mesmo nome <nome>.
3082 A operação JOIN <operação> refere-se a um campo que não está em uma das tabelas
associadas.
3083 Não é possível utilizar consulta de relatório interno.
3084 Não é possível inserir dados com a consulta ação.
3085 Função <nome> indefinida na expressão.
3086 Não foi possível excluir das tabelas especificadas.
3087 Expressões em excesso na cláusula GROUP BY.
3088 Expressões em excesso na cláusula ORDER BY.
3089 Expressões em excesso na saída DISTINCT.
3090 A tabela resultante não pode ter mais de um campo AutoNumeração.
3092 Não é possível utilizar a cláusula HAVING na instrução TRANSFORM.
3093 A cláusula ORDER BY <cláusula> entra em conflito com DISTINCT.
3094 A cláusula ORDER BY <cláusula> entra em conflito com a cláusula GROUP BY.
3095 Não é possível ter uma função agregada na expressão <expressão>.
3096 Não é possível ter uma função agregada na cláusula WHERE <cláusula>.
3097 Não é possível ter uma função agregada na cláusula ORDER BY <cláusula>.
3098 Não é possível ter uma função agregada na cláusula GROUP BY <cláusula>.
3099 Não é possível ter uma função agregada na operação JOIN <operação>.
3100 Não é possível definir o campo <nome> na chave de associação como Null.
3101 O mecanismo de banco de dados Microsoft Jet não consegue encontrar um registro na
tabela <nome> com campo(s) <nome> de correspondência de chave.
3102 Referência circular causada pela <referência da consulta>.
3103 Referência circular causada pelo alias <nome> na lista SELECT da definição da
consulta.
3104 Não é possível especificar mais de uma vez o <valor> do título de colunas fixas em
uma consulta de tabela de referência cruzada.
3105 Nome do campo de destino ausente na instrução SELECT INTO <instrução>.
3106 Nome do campo de destino ausente na instrução UPDATE <instrução>.
3107 Registro(s) não pode(m) ser adicionado(s); sem permissão de inserção no <nome>.
3108 Registro(s) não pode(m) ser editado(s); sem permissão de atualização em <nome>.
3109 Registro(s) não pode(m) ser excluídos, sem permissão de exclusão em <nome>.
3110 Não foi possível ler definições; sem permissão de leitura de definições da tabela ou
consulta <nome>.
3111 Não foi possível criar; sem permissão de modificação da estrutura da tabela ou
consulta <nome>.
3112 Registro(s) não pode(m) ser lido(s); sem permissão de leitura em <nome>.

61
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3113 Não é possível atualizar <nome do campo>; campo não atualizável.


3114 Não é possível incluir Memorando ou Objeto OLE quando forem selecionados valores
exclusivos <instrução>.
3115 Não é possível ter campos Memorando ou Objeto OLE no argumento agregado
<instrução>.
3116 Não é possível ter campos Memorando ou Objeto OLE no critério <critério> para a
função agregada.
3117 Não é possível classificar em Memorando ou Objeto OLE <cláusula>.
3118 Não é possível associar em Memorando ou Objeto OLE <nome>.
3119 Não é possível agrupar em Memorando ou Objeto OLE <cláusula>.
3120 Não é possível agrupar em campos selecionados com '*' <nome da tabela>.
3121 Não é possível agrupar em campos selecionados com '*'.
3122 Você tentou executar uma consulta que não inclui a expressão <nome> especificada
como parte de uma função agregada.
3123 Não é possível utilizar '*' em consulta de tabela de referência cruzada.
3124 Não é possível obter a entrada pela consulta de relatório interno <nome>.
3125 O mecanismo de banco de dados não consegue encontrar <nome>. Certifique-se de
que é um nome de parâmetro ou alias válido, que não inclui caracteres nem pontuação
inválida e que o nome não é grande demais.
3126 Colchetes inválidos no nome <nome>.
3127 A instrução INSERT INTO contém o seguinte nome de campo desconhecido: <nome do
campo>. Certifique-se de que você digitou o nome corretamente e tente a operação
novamente.
3128 Especifique a tabela que contém os registros que deseja excluir.
3129 Instrução SQL inválida; era esperado 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT'
ou 'UPDATE'.
3130 Erro de sintaxe na instrução DELETE.
3131 Erro de sintaxe na cláusula FROM.
3132 Erro de sintaxe na cláusula GROUP BY.
3133 Erro de sintaxe na cláusula HAVING.
3134 Erro de sintaxe na instrução INSERT INTO.
3135 Erro de sintaxe na operação JOIN.
3136 A cláusula LEVEL inclui uma palavra ou argumento reservado que está digitado
incorretamente ou está ausente, ou a pontuação está incorreta.
3138 Erro de sintaxe na cláusula ORDER BY.
3139 Erro de sintaxe na cláusula PARAMETER.
3140 Erro de sintaxe na cláusula PROCEDURE.
3141 A instrução SELECT inclui uma palavra ou argumento reservado ou um nome de
argumento que está digitado incorretamente ou está ausente, ou a pontuação está
incorreta.
3143 Erro de sintaxe na instrução TRANSFORM.
3144 Erro de sintaxe na instrução UPDATE.
3145 Erro de sintaxe na cláusula WHERE.
3146 ODBC – a chamada falhou.
3151 ODBC – a conexão a <nome> falhou.
3154 ODBC – não foi possível encontrar DLL <nome>.
3155 ODBC – a inserção em uma tabela vinculada <tabela> falhou.
3156 ODBC – a exclusão em uma tabela vinculada <tabela> falhou.
3157 ODBC – a atualização em uma tabela vinculada <tabela> falhou.
3158 Não foi possível salvar o registro; bloqueado no momento por outro usuário.
3159 Indicador inválido.
3160 A tabela não está aberta.
3161 Não foi possível descriptografar o arquivo.
3162 Você tentou atribuir o valor Null a uma variável que não é um tipo de dados Variant.
3163 O campo é pequeno demais para aceitar a quantidade de dados que você tentou
adicionar. Tente inserir ou colar menos dados.
3164 O campo não pode ser atualizado porque outro usuário ou processo bloqueou o
registro ou tabela correspondente.
3165 Não foi possível abrir o arquivo .inf.
3166 Não é possível localizar o arquivo de memorando Xbase solicitado.

62
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3167 Registro excluído.


3168 Arquivo .inf inválido.
3169 O mecanismo de banco de dados Microsoft Jet não pôde executar a instrução SQL
porque ela contém um campo que possui um tipo de dados inválido.
3170 Não foi possível encontrar o ISAM instalável.
3171 Não foi possível encontrar o caminho da rede ou o nome de usuário.
3172 Não foi possível abrir o Paradox.net.
3173 Não foi possível abrir a tabela 'MSysAccounts' no arquivo de informações do grupo de
trabalho.
3174 Não foi possível abrir a tabela 'MSysGroups' no arquivo de informações do grupo de
trabalho.
3175 A data está fora do intervalo ou está em um formato inválido.
3176 Não foi possível abrir o arquivo <nome>.
3177 Nome de tabela inválido.
3179 Encontrado fim de arquivo inesperado.
3180 Não foi possível gravar no arquivo <nome>.
3181 Intervalo inválido.
3182 Formato de arquivo inválido.
3183 Espaço insuficiente no disco temporário.
3184 Não foi possível executar a consulta; não foi possível encontrar a tabela vinculada.
3185 SELECT INTO em um banco de dados remoto tentou produzir campos demais.
3186 Não foi possível salvar; atualmente bloqueado pelo usuário <nome> na máquina
<nome>.
3187 Não foi possível ler; atualmente bloqueado pelo usuário <nome> na máquina <nome>.
3188 Não foi possível atualizar; atualmente bloqueado por outra sessão nesta máquina.
3189 Tabela <nome> é bloqueada exclusivamente pelo usuário <nome> na máquina
<nome>.
3190 Definidos campos em excesso.
3191 Não é possível definir o campo mais de uma vez.
3192 Não foi possível encontrar a tabela de saída <nome>.
3196 O banco de dados <nome do banco de dados> já está em uso por outra pessoa ou
processo. Quando o banco de dados estiver disponível, tente a operação novamente.
3197 O mecanismo de banco de dados Microsoft Jet parou o processo porque você e outro
usuário estão tentando alterar os mesmos dados ao mesmo tempo.
3198 Não foi possível iniciar a sessão. Já existem sessões em excesso ativas.
3199 Não foi possível encontrar referência.
3200 O registro não pode ser excluído nem alterado porque a tabela <nome> inclui registros
relacionados.
3201 Você não pode adicionar nem alterar um registro porque um registro relacionado é
requerido na tabela <nome>.
3202 Não foi possível salvar; atualmente bloqueado por outro usuário.
3203 Subconsultas não podem ser utilizadas na expressão <expressão>.
3204 O banco de dados já existe.
3205 Títulos de coluna da tabela de referência cruzada <valor> em excesso.
3206 Não é possível criar uma relação entre um campo e ele mesmo.
3207 Operação não suportada em uma tabela do Paradox sem chave primária.
3208 Configuração Deleted inválida na chave Xbase do Registro do Windows.
3210 A seqüência de conexão é longa demais.
3211 O mecanismo de banco de dados não pôde bloquear a tabela <nome> porque ela já
está em uso por outra pessoa ou processo.
3212 Não foi possível bloquear a tabela <nome>; atualmente em uso pelo usuário <nome>
na máquina <nome>.
3213 Configuração Date inválida na chave Xbase do Registro do Windows.
3214 Configuração Mark inválida na chave Xbase do Registro do Windows.
3215 Tarefas Btrieve em excesso.
3216 Parâmetro <nome> especificado onde é requerido um nome de tabela.
3217 Parâmetro <nome> especificado onde é requerido um nome de banco de dados.
3218 Não foi possível atualizar; atualmente bloqueado.
3219 Operação inválida.
3220 Seqüência de agrupamento incorreta.

63
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3221 Configurações inválidas na chave Btrieve do Registro do Windows.


3222 A consulta não pode conter um parâmetro Database.
3223 <Nome do parâmetro> é inválido porque é longo demais ou contém caracteres
inválidos.
3224 Não é possível ler o dicionário de dados do Btrieve.
3225 Encontrado um conflito de proteção de registro durante a execução de uma operação
Btrieve.
3226 Erros encontrados durante a utilização da DLL do Btrieve.
3227 Configuração Century inválida na chave Xbase do Registro do Windows.
3228 Configuração CollatingSequence inválida na chave Paradox do Registro do Windows.
3229 Btrieve – não foi possível alterar o campo.
3230 Arquivo de proteção do Paradox desatualizado.
3231 ODBC – o campo ficaria longo demais; dados truncados.
3232 ODBC – não pôde criar tabela.
3234 ODBC – o tempo limite de consulta remota expirou.
3235 ODBC – tipo de dados não suportado no servidor.
3238 ODBC – dados fora do intervalo.
3239 Usuários ativos em excesso.
3240 Btrieve – mecanismo Btrieve ausente.
3241 Btrieve – sem recursos.
3242 Referência inválida na instrução SELECT.
3243 Nenhum dos nomes de campo de importação corresponde aos campos na tabela
acrescentada.
3244 Não é possível importar planilha protegida por senha.
3245 Não foi possível analisar os nomes de campo da primeira linha da tabela de
importação.
3246 Operação não suportada em transações.
3247 ODBC – a definição da tabela vinculada mudou.
3248 Configuração NetworkAccess inválida no Registro do Windows.
3249 Configuração PageTimeout inválida no Registro do Windows.
3250 Não foi possível construir chave.
3251 A operação não é suportada para esse tipo de objeto.
3252 Não é possível abrir um formulário cuja consulta base contém uma função definida pelo
usuário que tenta definir ou obter a propriedade RecordsetClone do formulário.
3254 ODBC – Não é possível bloquear todos os registros.
3256 Arquivo de índice não encontrado.
3257 Erro de sintaxe na declaração WITH OWNERACCESS OPTION.
3258 A instrução SQL não poderia ser executada porque contém associações externas
ambíguas. Para forçar uma das associações a ser executada primeiro, crie uma
consulta separada que execute a primeira associação e, em seguida, inclua essa
consulta na sua instrução SQL.
3259 Tipo de dados de campo inválido.
3260 Não foi possível atualizar; atualmente bloqueado pelo usuário <nome> na máquina
<nome>.
3261 A tabela <nome> é bloqueada exclusivamente pelo usuário <nome> na máquina
<nome>.
3262 Não foi possível bloquear a tabela <nome>; atualmente em uso pelo usuário <nome>
na máquina <nome>.
3263 Objeto Database inválido.
3264 Sem campo definido – não é possível acrescentar TableDef nem Index.
3265 Item não encontrado nesta coleção.
3266. Não é possível acrescentar um Field que já faça parte de uma coleção Fields.
3267 A propriedade somente pode ser definida quando o Field faz parte da coleção Fields de
um objeto Recordset.
3268 Não é possível definir esta propriedade uma vez que o objeto faz parte de uma
coleção.
3269 Não é possível acrescentar um Index que já faça parte de uma coleção Indexes.
3270 Propriedade não encontrada.
3271 Valor de propriedade inválido.
3272 O objeto não é uma coleção.

64
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3273 Método não aplicável a este objeto.


3274 A tabela externa não está no formato esperado.
3275 Erro inesperado do driver de banco de dados externo <número do erro>.
3276 Referência inválida a objeto de banco de dados.
3277 Não é possível ter mais de 10 campos em um índice.
3278 O mecanismo de banco de dados Microsoft Jet não foi inicializado.
3279 O mecanismo de banco de dados Microsoft Jet já foi inicializado.
3280 Não é possível excluir um campo que faça parte de um índice ou que seja necessário
ao sistema.
3281 Não é possível excluir este índice ou tabela. É o índice atual ou é utilizado em uma
relação.
3282 Operação não suportada em uma tabela que contém dados.
3283 Já existe chave primária.
3284 Já existe índice.
3285 Definição de índice inválida.
3286 O formato do arquivo de memorando não corresponde ao formato do banco de dados
externo especificado.
3287 Não é possível criar o índice no campo fornecido.
3288 O índice do Paradox não é primário.
3289 Erro de sintaxe na cláusula CONSTRAINT.
3290 Erro de sintaxe na instrução CREATE TABLE.

3291 Erro de sintaxe na instrução CREATE INDEX.


3292 Erro de sintaxe na definição do campo.
3293 Erro de sintaxe na instrução ALTER TABLE.
3294 Erro de sintaxe na instrução DROP INDEX.
3295 Erro de sintaxe em DROP TABLE ou DROP INDEX.
3296 Expressão de associação não-suportada.
3297 Não é possível importar tabela nem consulta. Nenhum registro encontrado ou todos os
registros contêm erros.
3298 Há diversas tabelas com este nome. Especifique o proprietário no formato
‘proprietário.tabela’.
3299 Erro de conformidade com a especificação ODBC <mensagem>. Relate este erro ao
profissional da área de desenvolvimento do seu aplicativo.
3300 Não é possível criar uma relação.
3301 Não é possível executar esta operação; os recursos desta versão não estão
disponíveis em bancos de dados com formatos mais antigos.
3302 Não é possível alterar um regra enquanto as regras desta tabela estiverem em uso.
3303 Não é possível excluir este campo. Ele faz parte de uma ou mais relações.
3304 Você deve inserir um identificador pessoal (PID) que consista em no mínimo 4 e no
máximo 20 caracteres e dígitos.
3305 Seqüência de conexão inválida na consulta passagem.
3306 Você gravou uma subconsulta que pode retornar mais de um campo sem utilizar a
palavra reservada EXISTS na cláusula FROM da consulta principal. Altere a instrução
SELECT da subconsulta para solicitar somente um campo.
3307 O número de colunas nas duas tabelas ou consultas selecionadas de uma consulta
união não coincide.
3308 Argumento TOP inválido na consulta seleção.
3309 A configuração da propriedade não pode ter mais de 2K.
3310 Esta propriedade não é suportada em fontes de dados externas ou em bancos de
dados criados com uma versão anterior do Microsoft Jet.
3311 A propriedade especificada já existe.
3312 As regras de validação e os valores padrão não podem ser inseridos em tabelas do
sistema ou vinculadas.
3313 Não é possível inserir esta expressão de validação neste campo.
3314 O campo <nome> não pode conter um valor Null porque a propriedade Required deste
campo está definida como True. Insira um valor neste campo.
3315 O campo <nome> não pode ser uma seqüência de comprimento zero.
3316 <Texto de validação em nível de tabela>.

65
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3317 Um ou mais valores são proibidos pela regra de validação <regra> definida para
<nome>. Insira um valor que a expressão deste campo possa aceitar.
3318 Os valores especificados em uma cláusula TOP não são permitidos em consultas
exclusão e nem em relatórios.
3319 Erro de sintaxe na consulta união.
3320 <Erro> em expressão de validação em nível de tabela.
3321 Sem banco de dados especificado na seqüência de conexão ou cláusula IN.
3322 A consulta de tabela de referência cruzada contém um ou mais títulos fixos e inválidos
de colunas.
3323 A consulta não pode ser utilizada como origem da linha.
3324 A consulta é uma consulta DDL e não pode ser utilizada como origem da linha.
3325 A consulta passagem com a propriedade ReturnsRecords definida como True não
retornou registros.
3326 Este Recordset não é atualizável.
3334 Somente pode estar presente no formato da versão 1.0.
3336 Btrieve: opção IndexDDF inválida na configuração da inicialização.
3337 Opção DataCodePage inválida na configuração da inicialização.
3338 Btrieve: as opções Xtrieve não estão corretas na configuração da inicialização.
3339 Btrieve: opção IndexDeleteRenumber inválida na configuração da inicialização.
3340 A consulta <nome> está corrompida.
3341 O campo atual deve corresponder à chave de associação <nome> na tabela que serve
como lado ‘um’ da relação um-para-muitos. Insira um registro no lado ‘um’ da tabela
com o valor de chave desejado e, em seguida, faça a entrada com a chave de
associação desejada na tabela ‘somente-muitos’.
3342 Memorando ou Objeto OLE inválido na subconsulta <nome>.
3343 Formato de banco de dados <nome do arquivo> não-reconhecido.
3344 O mecanismo de banco de dados não reconhece o campo <nome> em uma expressão
de validação ou o valor padrão na tabela <nome>.
3345 Referência de campo <nome> desconhecida ou inválida.
3346 O número de valores de consulta e de campos de destino não é o mesmo.
3349 Sobrecarga de campo numérico.
3350 O objeto é inválido para a operação.
3351 A expressão ORDER BY <expressão> inclui campos que não são selecionados pela
consulta. Somente os campos solicitados na primeira consulta podem ser incluídos em
uma expressão ORDER BY.
3352 Sem nome de campo de destino na instrução INSERT INTO <instrução>.
3353 Btrieve: não é possível encontrar o arquivo Field.ddf.
3354 No máximo um registro pode ser retornado por esta subconsulta.
3355 Erro de sintaxe no valor padrão.
3356 Você tentou abrir um banco de dados que já está aberto exclusivamente pelo usuário
<nome> na máquina <nome>. Tente novamente quando o banco de dados estiver
disponível.
3357 Esta consulta não é uma consulta definição de dados devidamente formada.
3358 Não é possível abrir o arquivo de informações do grupo de trabalho do mecanismo
Microsoft Jet.
3359 A consulta passagem deve conter pelo menos um caractere.
3360 A consulta é complexa demais.
3361 Uniões não-permitidas em uma subconsulta.
3362 A atualização/exclusão de linha única afetou mais de uma linha de uma tabela
vinculada. O índice exclusivo contém valores duplicados.
3364 Não é possível utilizar o campo Memorando ou Objeto OLE <nome> na cláusula
SELECT de uma consulta união.
3365 Não é possível definir esta propriedade para objetos remotos.
3366 Não é possível acrescentar uma relação sem campos definidos.
3367 Não é possível acrescentar. Já existe na coleção um objeto com este nome.
3368 A relação deve ser no mesmo número de campos com os mesmos tipos de dados.
3370 Não é possível modificar a estrutura da tabela <nome>. Ela está em um banco de
dados somente leitura.
3371 Não é possível encontrar tabela ou restrição.
3372 Não há índice <nome> na tabela <nome>.

66
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3373 Não é possível criar uma relação. A tabela referenciada <nome> não tem uma chave
primária.
3374 Os campos especificados não são indexados exclusivamente na tabela <nome>.
3375 A tabela <nome> já tem um índice chamado <nome>.
3376 A tabela <nome> não existe.
3377 Não há relação <nome> na tabela <nome>.
3378 Já existe uma relação chamada <nome> no banco de dados atual.
3379 Não é possível criar relações para impor integridade referencial. Os dados existentes
na tabela <nome> violam as regras de integridade referencial na tabela <nome>.
3380 O campo <nome> já existe na tabela <nome>.
3381 Não há campo chamado <nome> na tabela <nome>.
3382 O tamanho do campo <nome> é longo demais.
3383 Não é possível excluir o campo <nome>. Ele faz parte de uma ou mais relações.
3384 Não é possível excluir uma propriedade interna.
3385 As propriedades não definidas pelo usuário não suportam um valor Null.
3386 A propriedade <nome> deve ser definida antes de utilizar este método.
3388 Função <nome> desconhecida na expressão de validação ou no valor padrão em
<nome>.
3389 Suporte de consulta não-disponível.
3390 O nome da conta já existe.
3393 Não é possível executar associação, grupo, classificação ou restrição indexada. Um
valor que está sendo procurado ou classificado é longo demais.
3394 Não é possível salvar a propriedade; ela é uma propriedade de esquema.
3396 Não é possível executar a operação em cascata. Como existem registros relacionados
na tabela <nome>, as regras de integridade referencial seriam violadas.
3397 Não é possível executar a operação em cascata. Deve haver um registro relacionado
na tabela <nome>.
3398 Não é possível executar a operação em cascata. Isto resultaria em uma chave nula na
tabela <nome>.
3399 Não é possível executar a operação em cascata. Isto resultaria em uma chave
duplicada na tabela <nome>.
3400 Não é possível executar a operação em cascata. Isto resultaria em duas atualizações
do campo <nome> na tabela <nome>.
3401 Não é possível executar a operação em cascata. Isto transformaria o campo <nome>
em Null, o que não é permitido.
3402 Não é possível executar a operação em cascata. Isto transformaria o campo <nome>
em uma seqüência de comprimento zero, o que não é permitido.
3403 Não é possível executar a operação em cascata: <texto de validação>.
3404 Não é possível executar a operação em cascata. O valor inserido é proibido pela regra
de validação <regra> definida para <nome>.
3405 Erro <texto de erro> na regra de validação.
3406 A expressão que você está tentando utilizar na propriedade DefaultValue é inválida
porque <texto de erro>. Utilize uma expressão válida para definir esta propriedade.
3407 A tabela MSysConf do servidor existe, mas está em um formato incorreto. Entre em
contato com o seu administrador do sistema.
3409 Nome de campo <nome> inválido na definição de índice ou relação.
3411 Entrada inválida. Não é possível executar a operação em cascata na tabela <nome>
porque o valor inserido é grande demais para o campo <nome>.
3412 Não é possível executar a atualização em cascata na tabela porque ela está
atualmente em uso por um outro usuário.
3414 Não é possível executar a operação em cascata na tabela <nome> porque ela está
atualmente em uso.
3415 A seqüência de comprimento zero é válida somente em um campo Texto ou
Memorando.
3416 <alerta de erro reservado>
3417 Uma consulta ação não pode ser utilizada como origem de linha.
3418 Não é possível abrir <nome da tabela>. Outro usuário está com a tabela aberta
utilizando um arquivo de controle de rede ou um estilo de bloqueio diferente.
3419 Não é possível abrir esta tabela do Paradox 4.x ou 5.x porque o ParadoxNetStyle está
definido como 3.x no Registro do Windows.

67
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3420 O objeto é inválido ou não está mais definido.


3421 Erro de conversão do tipo de dados.
3422 Não é possível modificar a estrutura da tabela. Outro usuário está com a tabela aberta.
3423 Você não pode utilizar o ODBC para importar de, exportar para ou vincular uma tabela
de banco de dados externa do Microsoft Jet ou ISAM para o seu banco de dados.
3424 Não é possível criar o banco de dados porque a localidade é inválida.
3428 Ocorreu um problema no seu banco de dados. Corrija-o reparando e compactando o
banco de dados.
3429 Versão incompatível de um ISAM instalável.
3430 Enquanto carregava o ISAM instalável do Microsoft Excel, a OLE não conseguia
inicializar.
3431 Este não é um arquivo do Microsoft Excel 5.0.
3432 Erro na abertura de um arquivo do Microsoft Excel 5.0.
3433 Configuração inválida na chave do Excel da seção Engines do Registro do Windows.
3434 Não é possível expandir intervalo nomeado.
3435 Não é possível excluir células da planilha.
3436 Falha na criação do arquivo.
3437 A planilha está cheia.
3438 Os dados que estão sendo exportados não correspondem ao formato descrito no
arquivo Schema.ini.
3439 Você tentou vincular ou importar um arquivo de mala direta do Microsoft Word. Apesar
de poder exportar esses arquivos, você não pode vinculá-los nem importá-los.
3440 Foi feita uma tentativa de importar ou vincular um arquivo de texto vazio. Para importar
ou vincular um arquivo de texto, o arquivo deve conter dados.
3441 O separador de campo de especificação do arquivo de texto corresponde ao separador
decimal ou delimitador de texto.
3442 Na especificação <nome> do arquivo de texto, a opção <nome> é inválida.
3443 A especificação <nome> de largura fixa não contém larguras de coluna.
3444 Na especificação <nome> de largura fixa, a coluna <coluna> não especifica uma
largura.
3445 Foi encontrada a versão incorreta do arquivo DLL <nome>.
3446 O arquivo VBA do Jet (VBAJET.dll para versões de 16 bits ou VBAJET32.dll para
versões de 32 bits) está ausente. Tente reinstalar o aplicativo que retornou o erro.
3447 O arquivo VBA do Jet (VBAJET.dll para versões de 16 bits ou VBAJET32.dll para
versões de 32 bits) não conseguiu inicializar quando chamado. Tente reinstalar o
aplicativo que retornou o erro.
3448 Uma chamada a uma função do sistema OLE não foi bem-sucedida. Tente reinstalar o
aplicativo que retornou o erro.
3449 Nenhum código de país encontrado na seqüência de conexão.
3452 Você não pode fazer alterações na estrutura do banco de dados nesta réplica.
3453 Você não pode estabelecer ou manter uma relação imposta entre uma tabela replicada
e uma tabela local.
3455 Não é possível tornar o banco de dados replicável.
3456 O objeto chamado <nome> na coleção <nome> não pode se tornar replicável.
3457 Você não pode definir a propriedade KeepLocal para um objeto que já está replicado.
3458 A propriedade KeepLocal não pode ser definida em um banco de dados; ela pode ser
definida somente nos objetos em um banco de dados.
3459 Depois que um banco de dados é replicado, você não pode remover os seus recursos
de replicação.
3460 A operação que você tentou entra em conflito com uma operação existente que envolve
este membro do conjunto de réplicas.
3461 A propriedade de replicação que você está tentando definir ou excluir é somente leitura
e não pode ser alterada.
3462 Não foi possível carregar a DLL.
3463 Não é possível encontrar o .dll <nome>.
3464 Os tipos de dados não correspondem na expressão de critério.
3465 A unidade de disco que você está tentando acessar é ilegível.
3468 O acesso foi negado enquanto acessava a pasta dropbox <nome>.
3469 O disco da pasta dropbox <nome> está cheio.
3470 Falha no disco durante o acesso à pasta dropbox <nome>.

68
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3471 Não foi possível gravar no arquivo de registro Sincronizador.


3472 Disco cheio para caminho <nome>.
3473 Falha no disco durante o acesso ao arquivo de registro <nome>.
3474 Não é possível abrir o arquivo de registro <nome> para gravação.
3475 Violação de compartilhamento durante a tentativa de abrir o arquivo de registro
<nome> no modo Deny Write.
3476 Caminho da dropbox <nome> inválido.
3477 Endereço da dropbox <nome> é sintaticamente inválido.
3478 A réplica não é parcial.
3479 Não é possível designar uma réplica parcial como Estrutura-Mestre para o conjunto de
réplicas.
3480 A relação <nome> na expressão de filtro parcial é inválida.
3481 O nome de tabela <nome> na expressão parcial de filtro é inválido.
3482 A expressão de filtro para a réplica parcial é inválida.
3483 A senha fornecida para a pasta dropbox <nome> é inválida.
3484 A senha utilizada pelo Sincronizador para gravar em uma pasta dropbox de destino é
inválida.
3485 O objeto não pode ser replicado porque o banco de dados não é replicado.
3486 Você não pode adicionar um segundo campo AutoNumeração do Código da
Replicação a uma tabela.
3487 O banco de dados que você está tentando replicar não pode ser convertido.
3488 O valor especificado não é um CódigoDaReplicação para qualquer membro do
conjunto de réplicas.
3489 O objeto especificado não pode ser replicado porque falta nele um recurso necessário.
3490 Não é possível criar uma nova réplica porque o objeto <nome> no recipiente <nome>
não pôde ser replicado.
3491 O banco de dados deve ser aberto no modo exclusivo antes que ele possa ser r
eplicado.
3492 A sincronização falhou porque uma alteração de estrutura não pôde ser aplicada a uma
das réplicas.
3493 Não é possível definir o parâmetro Registro especificado para o Sincronizador.
3494 Não foi possível recuperar o parâmetro Registro especificado para o Sincronizador.
3495 Não há sincronizações agendadas entre os dois Sincronizadores.
3496 O Gerenciador de Replicação não consegue encontrar o CódigoDaTroca na tabela
MSysExchangeLog.
3497 Não foi possível definir uma agenda para o Sincronizador.
3499 Não é possível recuperar as informações completas de caminho para um membro do
conjunto de réplicas.
3500 Não é permitido definir uma troca com o mesmo Sincronizador.
3502 A Estrutura-Mestre ou réplica não está sendo gerenciada por um Sincronizador.
3503 O Registro do Sincronizador não tem valor definido para a chave que você consultou.
3504 O código do Sincronizador não corresponde a um código existente na tabela
MSysTranspAddress.
3506 O Sincronizador é incapaz de abrir o registro do Sincronizador.
3507 Não foi possível gravar no registro do Sincronizador.
3508 Não há transporte ativo para o Sincronizador.
3509 Não foi possível encontrar um transporte válido para este Sincronizador.
3510 O membro do conjunto de réplicas que você está tentando sincronizar está atualmente
sendo utilizado em outra sincronização.
3512 Não foi possível ler a pasta dropbox.
3513 Não foi possível gravar na pasta dropbox.
3514 O Sincronizador não conseguiu encontrar sincronizações agendadas nem a serem
solicitadas para processar.
3515 O mecanismo de banco de dados Microsoft Jet não conseguiu ler o relógio do sistema
no seu computador.
3516 Não foi possível encontrar o endereço de transporte.
3517 O Sincronizador não conseguiu encontrar mensagens para serem processadas.
3518 Não foi possível encontrar o Sincronizador na tabela MSysTranspAddress.
3519 Não foi possível enviar a mensagem.

69
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3520 O nome ou código da réplica não corresponde a um membro atualmente gerenciado do


conjunto de réplicas.
3521 Dois membros do conjunto de réplicas não podem ser sincronizados porque não há um
ponto comum para iniciar a sincronização.
3522 O Sincronizador não consegue encontrar o registro de uma sincronização específica na
tabela MSysExchangeLog.
3523 O Sincronizador não consegue encontrar um número de versão específico na tabela
MSysSchChange.
3524 O histórico de alterações de estrutura na réplica não corresponde ao histórico na
Estrutura-Mestre.
3525 O Sincronizador não conseguiu acessar o banco de dados de mensagens.
3526 O nome selecionado para o objeto do sistema já está em uso.
3527 O Sincronizador ou Gerenciador de Replicação não conseguiu encontrar o objeto do
sistema.
3528 Não há dados novos na memória compartilhada para que o Sincronizador ou
Gerenciador de Replicação os leiam.
3529 O Sincronizador ou Gerenciador de Replicação encontrou dados não lidos na memória
compartilhada. Os dados existentes serão sobrescritos.
3530 O Sincronizador já está servindo um cliente.
3531 O período de espera de um evento se esgotou.
3532 O Sincronizador não conseguiu ser inicializado.
3533 O objeto do sistema utilizado por um processo continua existindo depois que o
processo parou.
3534 O Sincronizador procurou por um evento do sistema, mas não encontrou nenhum para
relatar ao cliente.
3535 O cliente pediu ao Sincronizador que terminasse a operação.
3536 O Sincronizador recebeu uma mensagem inválida para um membro do conjunto de
réplicas que ele gerencia.
3538 Não é possível inicializar o Sincronizador porque há aplicativos demais em execução.
3539 Ocorreu um erro de sistema ou o seu arquivo de troca alcançou seu limite.
3540 Seu arquivo de troca alcançou seu limite ou está corrompido.
3541 O Sincronizador não pôde ser fechado apropriadamente e continua ativo.
3542 O processo parou quando se tentava terminar o cliente do Sincronizador.
3543 O Sincronizador não foi configurado.
3544 O Sincronizador já está sendo executado.
3545 As duas réplicas que você está tentando sincronizar são de diferentes conjuntos de
réplicas.
3546 O tipo de sincronização que você está tentando não é válido.
3547 O Sincronizador não conseguiu encontrar uma réplica do conjunto correto para concluir
a sincronização.
3548 Os GUIDs não correspondem ou o GUID solicitado não pôde ser encontrado.
3549 O nome de arquivo que você forneceu é longo demais.
3550 Não há índice na coluna GUID.
3551 Não foi possível excluir o parâmetro Registro do Sincronizador.
3552 O tamanho do parâmetro Registro excede o máximo permitido.
3553 O GUID não pôde ser criado.
3555 Todos os apelidos das réplicas já estão em uso.
3556 Caminho inválido para a pasta dropbox de destino.
3557 Endereço inválido para a pasta dropbox de destino.
3558 Erro de E/S em disco na pasta dropbox de destino.
3559 Não foi possível gravar porque o disco de destino está cheio.
3560 Os dois membros do conjunto de réplicas que você está tentando sincronizar têm o
mesmo CódigoDaReplicação.
3561 Os dois membros do conjunto de réplicas que você está tentando sincronizar são
ambos Estruturas-Mestre.
3562 Acesso negado na pasta dropbox de destino.
3563 Erro fatal ao acessar uma pasta dropbox local.
3564 O sincronizador não consegue encontrar o arquivo de origem das mensagens.
3565 Há uma violação de compartilhamento na pasta dropbox de origem porque o banco de
dados de mensagens está aberto em outro aplicativo.

70
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3566 Erro de E/S na rede.


3567 A mensagem na pasta dropbox pertence ao Sincronizador errado.
3568 O Sincronizador não conseguiu excluir um arquivo.
3569 Este membro do conjunto de réplicas foi logicamente removido do conjunto e não está
mais disponível.
3571 A tentativa de definir uma coluna em uma réplica parcial violou uma regra que governa
réplicas parciais.
3572 Ocorreu um erro de E/S em disco durante a leitura ou gravação no diretório TEMP.
3574 O CódigoDaReplicação deste membro do conjunto de réplicas foi reatribuído durante
um procedimento de movimentação ou cópia.
3575 A unidade de disco na qual você está tentando gravar está cheia.
3576 O banco de dados que você está tentando abrir já está em uso por outro aplicativo.
3577 Não é possível atualizar a coluna do sistema de replicação.
3578 Não foi possível replicar o banco de dados; não é possível determinar se o banco de
dados está aberto no modo exclusivo.
3581 Não é possível abrir a tabela <nome> do sistema de replicação porque ela já está em
uso.
3583 Não é possível tornar o objeto <nome> no recipiente <nome> replicável.
3584 Memória insuficiente para concluir a operação.
3586 Erro de sintaxe na expressão de filtro parcial na tabela <nome>.
3587 Expressão inválida na propriedade ReplicaFilter.
3588 Erro ao avaliar a expressão de filtro parcial.
3589 A expressão de filtro parcial contém uma função desconhecida.
3592 Você não pode replicar um banco de dados protegido por senha nem definir proteção
por senha em um banco de dados replicado.
3593 Você não pode alterar o atributo-mestre de dados do conjunto de réplicas.
3594 Você não pode alterar o atributo-mestre de dados do conjunto de réplicas. Permite
alterações de dados somente na Estrutura-Mestre.
3595 As tabelas de sistema na sua réplica não são mais confiáveis e não devem ser
utilizadas.
3605 A sincronização com um banco de dados não-replicado não é permitida. O banco de
dados <nome> não é uma Estrutura-Mestre nem uma réplica.
3607 A propriedade de replicação que você está tentando excluir é somente leitura e não
pode ser removida.
3608 O comprimento do registro é longo demais para uma tabela indexada do Paradox.
3609 Nenhum índice exclusivo encontrado para o campo referenciado da tabela primária.
3610 Mesma tabela <tabela> referenciada tanto como origem quanto destino em uma
consulta criar tabela.
3611 Não é possível executar instruções de definição de dados em fontes de dados
vinculadas.
3612 A cláusula GROUP BY de vários níveis não é permitida em uma subconsulta.
3613 Não é possível criar uma relação em tabelas ODBC vinculadas.
3614 GUID não permitido na expressão de critério do método Find.
3615 O tipo não corresponde na expressão JOIN.
3616 A atualização de dados em uma tabela vinculada não é suportada por este ISAM.
3617 A exclusão de dados em uma tabela vinculada não é suportada por este ISAM.
3618 A tabela de exceções não pôde ser criada na importação/exportação.
3619 Os registros não puderam ser adicionados à tabela de exceções.
3620 A conexão para a visualização da sua planilha vinculada do Microsoft Excel foi perdida.
3621 Não é possível alterar a senha em um banco de dados compartilhado aberto.
3622 Você deve utilizar a opção dbSeeChanges com OpenRecordset quando acessar uma
tabela do SQL Server que tenha uma coluna IDENTITY.
3623 Não é possível acessar o arquivo DBF acoplado <nome do arquivo> do FoxPro 3.0.
3624 Não foi possível ler o registro; atualmente bloqueado por outro usuário.
3625 A especificação <nome> do arquivo de texto não existe. Você não pode importar,
exportar e nem vincular utilizando a especificação.
3626 A operação falhou. Há índices demais na tabela <nome>. Exclua alguns dos índices da
tabela e tente a operação novamente.
3627 Não é possível encontrar o arquivo executável do Sincronizador (mstran35.exe).
3628 A réplica do parceiro não é gerenciada por um Sincronizador.

71
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3629 Este Sincronizador e o Sincronizador <nome> têm a mesma dropbox do Sistema de


arquivos – <nome>.
3631 Nome de tabela inválido no filtro.
3632 O Sincronizador remoto não está configurado para sincronização remota.
3633 Não é possível carregar a DLL <nome>.
3634 Não é possível criar uma réplica utilizando uma réplica parcial.
3635 Não é possível criar uma réplica parcial de um arquivo de informações do grupo de
trabalho.
3636 Não é possível preencher a réplica e nem alterar o filtro da réplica porque ela tem
conflitos ou erros de dados.
3637 Não é possível utilizar a tabela de referência cruzada de uma coluna não fixa como
uma subconsulta.
3638 Você não pode criar um banco de dados replicável que esteja sendo utilizado por um
programa que controla a modificação.
3639 Não é possível criar uma réplica de um arquivo de informações do grupo de trabalho.
3640 O buffer de recuperação era pequeno demais para a quantidade de dados que você
solicitou.
3641 Há menos registros restantes no Recordset do que você solicitou.
3642 Foi efetuado um cancelamento na operação.
3643 Um dos registros do Recordset foi excluído por outro processo.
3645 Um dos parâmetros de ligação está incorreto.
3646 O comprimento de linha especificado é menor que a soma dos comprimentos de
coluna.
3647 Uma coluna solicitada não está sendo retornada ao Recordset.
3648 Não é possível sincronizar uma réplica parcial com uma outra réplica parcial.
3649 A página de código do idioma não foi especificada ou não pôde ser encontrada.
3650 A Internet está lenta demais.
3651 Endereço de Internet inválido.
3652 Falha de login da Internet.
3653 Internet não-configurada.
3656 Erro na avaliação de uma expressão parcial.
3660 A troca solicitada falhou porque <descrição>.

72
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Anexo 2
RESUMO DAS FUNÇÕES INTERNAS DO VBA
Funções Matemáticas
Abs Retorna o valor absoluto de um número
Atn Calcula o arco tangente de um número
Cos Calcula o cosseno de um número
Exp Retorna o valor de e elevado a uma potência
Fix Retorna a parte inteira de um número
Int Retorna a parte inteira de um número
Log Calcula o logaritmo natural de um número
Rnd Retorna um número aleatório (randômico)
Sgn Retorna um inteiro conforme o sinal do número
Sin Calcula o seno de um número
Sqr Calcula a raiz quadrada de um número
Tan Calcula a tangente de um número

Funções Financeiras
DDB Calcula a depreciação de um ativo pelo método do Declínio de Balanço
FV Calcula o valor futuro de uma anuidade ou prestação
IPmt Calcula o valor pago a título de juros de uma prestação
IRR Calcula o valor interno de retorno de um fluxo de caixa.
MIRR Calcula o valor interno de retorno modificado de um fluxo de caixa
Nper Retorna o número de períodos de uma anuidade
NPV Calcula o valor presente líquido de um fluxo de caixa
Pmt Retorna o valor das parcelas de uma anuidade
PPmt Retorna o valor principal das parcelas de uma anuidade
PV Calcula o valor presente de uma anuidade
Rate Calcula a taxa de juros por período de uma anuidade
SLN Retorna a depreciação linear de um ativo
SYD Retorna a depreciação de um ativo pelo método da soma dos dígitos dos anos.

Funções de Conversão de Dados


Asc Retorna o código ASCII da primeira letra de uma string
Cbool Converte uma expressão para o tipo de dados Boolean
Cbyte Converte uma expressão para o tipo de dados Byte
Ccur Converte uma expressão para o tipo de dados Currency
Cdate Converte uma expressão para o tipo de dados Date
Cdbl Converte uma expressão para o tipo de dados Double
Chr Retorna o caracter correspondente ao código ASCII informado.
Cint Converte uma expressão para o tipo de dados Inteiro
Clng Converte uma expressão para o tipo de dados Longo
Csng Converte uma expressão para o tipo de dados Single
Cstr Converte uma expressão para o tipo de dados String
Cvar Converte uma expressão para o tipo de dados Variant
CVErr Retorna o número do erro especificado pelo usuário
Hex Retorna uma string representando o valor hexadecimal de um número
Oct Retorna uma string representando o valor octal de um número
Str Retorna uma string representando o valor de um número
Val Retorna os números contidos em uma string

73
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Funções de Data e Hora


Date Retorna a data atual do sistema
DateAdd Retorna a data especificada acrescida do intervalo de tempo informado.
DateDiff Retorna o intervalo de tempo decorrido entre duas datas especificadas
DatePart Retorna a parte especificada de uma determinada data
DateSerial Retorna uma data para o ano, mês e dia especificados
DateValue Retorna uma data a partir de uma data na forma de string
Day Retorna o número do dia de uma data (de 1 a 31)
Format Formata uma expressão de acordo com as instruções definidas pelo usuário
Hour Retorna o número da hora (de 0 a 23) de uma determinada hora especificada.
Minute Retorna o número de minutos da hora especificada (de 0 a 59)
Month Retorna o número do mês de uma determinada data (de 1 a 12)
Now Retorna a data e hora atuais do seu sistema.
Second Retorna a data e hora atuais do seu sistema
Time Retorna a hora atual do sistema
Timer Retorna o número de segundos decorridos desde 0:00h (de 0 a 59)
Weekday Retorna o número do dia da semana (1 - Domingo,..., 7-Sábado)
Year Retorna o número do ano de uma determinada data

Funções de Manipulação de Strings


InStr Retorna a posição da primeira ocorrência de uma string dentro de outra
Lcase Retorna uma string convertida para letras minúsculas
Retorna o número especificado de caracteres a partir do lado esquerdo de uma
Left
string
Retorna o número de caracteres em uma string ou o número de bytes requeridos
Len
para armazenar uma variável.
Retorna uma cópia de uma string eliminando os espaços existentes entre o início
Ltrim
da string e o primeiro caractere.
Mid Retorna o número especificado de caracteres de uma string
Retorna uma string indicando onde um número ocorreu dentro de uma série
Partition
calculada
Retorna o número especificado de caracteres a partir do lado direito de uma
Right
string
Retorna uma cópia de uma string eliminando os espaços existentes entre o
Rtrim
último caractere da string e o fim da mesma.
Space Retorna uma string com o número de espaços em branco definidos pelo usuário
Retorna um valor indicando o resultado de uma comparação de strings (se maior,
StrComp
igual ou menor)
Retorna uma string convertida de acordo com a operação especificada pelo
StrConv
usuário
Retorna uma string com caracteres repetidos no comprimento especificado pelo
String
usuário.
Retorna uma cópia de uma string eliminando os espaços existentes entre o início
Trim
da string e o primeiro caractere, e o último caractere da string e o fim da mesma.
Ucase Retorna uma string convertida para letras maiúsculas.

Funções de Array
Retorna uma variável de memória do tipo de dado Variant contendo o array
Array
especificado pelo usuário
Lbound Retorna o menor elemento da dimensão especificada de um determinado array
Ubound Retorna o maior elemento da dimensão especificada de um determinado array

74
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Funções de Sistema Operacional


Retorna o argumento informado na linha de comando utilizado na
Command inicialização do Visual Basic, ou de um programa executável desenvolvido
pelo mesmo
CreateObject Cria um objeto OLE
CurDir Retorna a pasta (ou diretório) atual
Retorna o nome do(s) arquivo(s) ou diretório(s) que combina(m) com o
Dir
padrão especificado ou atributo de arquivo, ou volume de um drive
Interrompe momentaneamente a execução de seu aplicativo para que o
DoEvents
sistema operacional possa processar outros eventos.
Retorna a string associada a uma variável de ambiente do sistema
Environ
operacional (como Path e Prompt, por exemplo).
Error Retorna a mensagem de erro que corresponde a um dado número de erro.
GetObject Recupera um objeto OLE de um arquivo
Exibe uma caixa de diálogo para que o usuário possa digitar uma resposta
InputBox qualquer. Após escolher um dos botões disponíveis , o VB retorna o valor
digitado.
Carrega uma imagem dentro de um objeto Form object, Controle PictureBox
LoadPicture
ou controle Image.
Exibe uma mensagem em um quadro de diálogo e espera que o usuário
MsgBox escolha um dos botões disponíveis. Após a seleção, o VB retorna um valor
indicando o botão escolhido.
QBColor Retorna o valor da cor RGB correspondente ao número de cor informado
RGB Retorna um número representando uma cor do padrão RGB.
Shell Inicia a execução de um programa qualquer
utilizada com o comando Print # ou com o método Print para posicionar a
Spc
saída de uma expressão qualquer.
Utilizada com o comando Print # ou com o método Print para posicionar a
Tab
saída de uma expressão qualquer.

Funções de Acesso à Arquivos


Eof Retorna um valor que indica se o fim de um arquivo foi alcançado.
Loc Retorna a posição atual de leitura/escrita de um arquivo aberto
Retorna o tamanho em bytes de um arquivo aberto através do comando
Lof
Open
Retorna o modo do arquivo ou o número do handle para arquivos abertos
FileAttr
através do comando Open.
Retorna a data e hora em que o arquivo foi criado ou modificado pela última
FileDateTime
vez.
FileLen Retorna o tamanho de um determinado arquivo em bytes
Retorna o próximo número de arquivo disponível para utilização pelo
FreeFile
comando Open
GetAttr Retorna um número que representa os atributos de um arquivo ou diretório
Input Retorna caracteres de um arquivo seqüencial ou binário aberto.
Retorna a posição atual de leitura / escrita de um arquivo aberto com o
Seek
comando Open.

Funções de Verificação
Choose Seleciona e retorna um valor de uma lista de argumentos existente.
IIF Retorna uma de duas partes, dependendo da avaliação de uma expressão.
IsArray Retorna um valor Boolean indicando se uma determinada variável é um array
Retorna um valor Boolean indicando se uma determinada expressão pode ser
IsDate
convertida para uma data.
Retorna um valor Boolean indicando se uma determinada variável foi
IsEmpty
inicializada ou não.
Retorna um valor Boolean indicando se uma determinada expressão é um
IsError
valor de erro.
IsMissing Retorna um valor Boolean indicando seum argumento opcional foi passado

75
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

para uma procedure ou não.


Retorna um valor Boolean indicando se uma expressão contém dados
IsNull
inválidos (Null)
Retorna um valor Boolean indicando se uma determinada expressão pode ser
IsNumeric
avaliada como um valor numérico
Retorna um valor Boolean indicando se uma determinada expressão faz
IsObject
referência a um objeto OLE válido.
Avalia uma lista de expressões e retorna um valor ou uma expressão
Switch associada com a primeira expressão associada com a primeira expressão da
lista que é verdadeira (coincidente com a entrada).
TypeName Retorna uma string que informa qual é o tipo de dados da variável analisada.
VarType Retorna um valor indicando o subtipo de uma variável.

ESPECIFICAÇÃO DAS FUNÇÕES INTERNAS DO VBA


ABS
Categoria: Função Matemática
Finalidade: Retorna o valor absoluto de um número
Sintaxe: ABS(Número)
Número - Qualquer valor numérico válido. Se número contém Null, o
Onde: valor retornado pela função será Null também. Caso número seja igual
a zero, este será o valor de retorno da função.
Teste = ABS(2.99) ' Teste=2.99
Exemplo:
Teste = ABS(-2.99) ' Teste=2.99
ARRAY
Categoria: Função de Array
Finalidade: Retorna um dado Variant contendo um Array
Sintaxe: ARRAY(Lista de Argumentos)
Lista de Argumentos - Consiste em uma série de argumentos
Onde: separados por vírgulas. Se nenhum argumento for dado à função, será
criado um array de comprimento zero.
MeuArray = Array("Jan","Fev","Mar","Abr") ' MeuArray(2)="Fev"
Exemplo:
MeuArray = Array(1,3,5,7) ' MeuArray(3)=5
ASC
Categoria: Funções de Conversão de Dados
Retorna o código ASCII correspondente do primeiro caractere da string
Finalidade:
indicada
Sintaxe: ASC(String)
String - O argumento é qualquer expressão de caracteres válida. Se o
Onde:
string especificado não contiver caracteres ocorrerá um erro..
Teste = Asc(“A” ) 'Teste=65
Exemplo: Teste = Asc(“a” ) 'Teste=97
Teste = Asc(“ASCII” ) 'Teste=65

ATN
Categoria: Funções Matemáticas
Finalidade: Calcula o Arco Tangente de um número
Sintaxe: ATN(Número)
Número - A função Atn retorna o número de radianos referentes ao arco
Onde:
tangente do ângulo especificado.
Teste=Atn(30) 'Teste = 1.53747533091665
Exemplo:
Teste=Atn(45) 'Teste = 1.54857776146818
CBOOL
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para Boolean (Booleano)
Sintaxe: CBOOL(Expressão)
Expressão - Se o valor da expressão resultante for zero, o valor False
Onde:
será retornado pela função CBool; caso contrário a resposta será True.
Primeiro = 10
Exemplo: Segundo = 10
Valor = 0

76
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Teste = CBool(Primeiro = Segundo) ' Teste = True


Teste2 = CBool(Valor) ' Teste = False
CBYTE
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para Byte
Sintaxe: CBYTE( Expressão)
Expressão - O argumento da função poderá ser qualquer valor
Onde:
numérico válido
Dim Teste As Double
Exemplo: Teste = 222.3322
MeuByte = CByte(Teste) ' MeuByte = 222
CCUR
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para Currency Moeda)
Sintaxe: CCUR(Expressão)
Expressão - O argumento da função poderá ser qualquer valor
Onde:
numérico válido ou expressão string
Dim Dado As Double
Dado = 656.123456
Exemplo:
Dado = Dado*2
MinhaMoeda= CCur(Dado) ' MinhaMoeda = R$1312.2469

CDATE
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para o tipo de dado Date (Data)
Sintaxe: CDATE(Data)
Hoje ="June 18, 2001"
Exemplo:
DataCurta = CDate(Hoje) ' DataCurta=18/06/01
CDBL
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para Double (Número Duplo)
Sintaxe: CDBL(Expressão)
Expressão - O argumento da função poderá ser qualquer valor
Onde:
numérico válido ou expressão string
Dim MinhaMoeda As Currency
Exemplo: MinhaMoeda = 255.123456
Dado = CDbl(MinhaMoeda) ' Dado = 255.1235

CHOOSE
Categoria: Funções de Verificação
Seleciona e retorna um valor de uma lista de argumentos existentes em
Finalidade:
função do índice passado.
Sintaxe: CHOOSE( index, choice-1[, choice-2,...[,choice-n]])
Index - Expressão numérica ou campo que resulta em um valor entre 1
e o número de escolhas disponíveis.
Onde:
Choice - Expressão Variant contendo uma das possíveis escolhas.

Teste = Escolha(2) ' Teste = "Valor2" pois foi o valor retornado pela
função Escolha
Exemplo:
Function Escolha(Indice As Integer)
Escolha = Choose(Indice, “Valor1”,”Valor2”,”Valor3”)
End Function
CHR
Categoria: Funções de Conversão de Dados
Finalidade: Retorna o caractere correspondente ao código ASCII informado
Sintaxe: CHR(Código ASCII)
Teste = Chr(65) ' Teste = A
Exemplo: Teste = Chr(97) ' Teste = a
Teste = Chr(64) ' Teste = @

77
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

CINT
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para o tipo de dados Integer (Número Inteiro)
Sintaxe: CINT(Expressão)
Expressão - O argumento da função poderá ser qualquer valor
Onde:
numérico válido ou expressão string
Dim Duplo As Double
Exemplo: Duplo = 8765.4321
Teste = CInt(Duplo) ' Teste=8765
CLNG
Categoria: Funções de Conversão de Dados
Converte uma expressão para o tipo de dado Long (Número Inteiro
Finalidade:
Longo)
Sintaxe: CLNG(Expressão)
Expressão - O argumento da função poderá ser qualquer valor
Onde:
numérico válido ou expressão string
Dim Dado As Double
Exemplo: Dado = 65432.123
Teste = CLng(Dado) ‘ Teste=65432
COMMAND
Categoria: Funções de Sistema Operacional
Retorna o argumento informado na linha de comando utilizado na
Finalidade:
inicialização do Microsoft Access.
Sintaxe: COMMAND
Crie um módulo onde você testará o argumento passado. Na linha de
Onde: comando adicione , após ao nome do arquivo .mdb, o seguinte texto
/cmd «argumento.
Dim Msg As String
If Command = "" Then
Msg = "Não existe argumento na linha de comando"
Exemplo: Else
Msg = "O argumento da linha de comando é " & Command
End If
MsgBox Msg
COS
Categoria: Funções Matemáticas
Finalidade: Calcula o cosseno de um ângulo.
Sintaxe: COS(Número)
Número - Pode ser qualquer expressão numérica válida que expresse
Onde:
um ângulo em radianos
Const PI = 3.14159265
Exemplo: Teste = Cos(PI) ' Teste = -1
Teste = Cos(PI/2) ' Teste = 1.7948965
CSNG
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para o tipo de dados Single (Número Simples)
Sintaxe: CSNG(Expressão)
Expressão - O argumento da função poderá ser qualquer valor
Onde:
numérico válido ou expressão string
Dim Teste As Double
Exemplo: Teste = 22.12345678
Teste = CSng(Teste) ' Teste = 22.12346
CSTR
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para o tipo de dados String (Texto)
Sintaxe: CSTR(Expressão)
Expressão - O argumento da função poderá ser qualquer valor
Onde:
numérico válido ou expressão string
Dim Dado As Double
Exemplo:
Dado = 555.4321

78
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Teste = CStr(Dado) ' Teste = "555.4321"


CURDIR
Categoria: Funções de Sistema Operacional
Finalidade: Retorna a pasta (ou diretório) atual
Sintaxe: CURDIR[(Drive)]
Drive - Expressão string que especifica uma unidade de disco existente.
Onde: Se a unidade não for especificada ou se a string for de tamanho zero, a
função CurDir retornará o caminho (Path) para o drive atual.
Exemplo: Teste = CurDir ' Teste = C:\Windows\System
CVAR
Categoria: Funções de Conversão de Dados
Finalidade: Converte uma expressão para o tipo de dados Variant
Sintaxe: CVAR(Expressão)
Expressão - O argumento da função poderá ser qualquer valor
Onde:
numérico válido ou expressão string
Dim NumInteiro As Integer
Exemplo: NumInteiro = 2222
Teste = CVar(NumInteiro & "000") ' Teste = "2222000"
DATE
Categoria: Funções de Data e Hora
Finalidade: Retorna a data atual do sistema
Sintaxe: DATE
Exemplo: Teste = Date ' Teste = 15/07/2001
DATEADD
Categoria: Funções de Data e Hora
Retorna um valor Variant contendo a data especificada acrescida do
Finalidade:
intervalo de tempo fornecido à função.
Sintaxe: DATEADD(Intervalo, Número, Data)
Intervalo - Expressão do tipo string indicando o intervalo de tempo a ser
adicionado à data especificada. Pode ser horas, dias, semanas, meses,
anos, etc., conforme especificado na seção Ajustes logo abaixo.

Número - Expressão numérica indicando o número de intervalos de


tempo que você deseja acrescer à data indicada. Ele pode ser positivo
para indicar datas futuras ou mesmo negativo, obtendo datas já
ocorridas.

Data - Data ou nome de variável do tipo Date que será utilizada para o
cálculo da função.

Onde: Ajustes

yyyy - Ano
q - Trimestre
m - mês
y - Dia do Ano
d - Dia
w - Dia da semana
ww - Semana
h - Hora
n - Minuto
s - Segundo

Teste = DateAdd("yyyy",3,#22/06/2001#) ‘ Teste = 22/06/2004


Teste = DateAdd("m",-6,#22/06/2001#) ‘ Teste = 22/12/2000
Exemplo: Teste = DateAdd("ww",1,#22/06/2001#) ‘ Teste = 29/06/2001

79
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

DATEDIFF
Categoria: Funções de Data e Hora
Retorna um intervalo de tempo decorrido entre duas datas de acordo
Finalidade:
com a unidade de tempo especificada.
DATEDIFF( Intervalo, Data1, Data2 [,FirstDayOfWeek[,
Sintaxe:
FirstWeekOfYear]])
Intervalo - Expressão do tipo string indicando o intervalo de tempo que
será calculado entre Data1 e Data2. Pode ser horas, dias, semanas,
meses, anos, etc., conforme especificado na seção Ajustes logo
abaixo.

Data1, Data2 - As duas datas entre as quais será calculado o intervalo


de tempo decorrido.

FirstDayOfWeek - Uma constante que define o primeiro dia da semana.


Caso você não especifique, o domingo será considerado como primeiro
dia.

FirstWeekOfYear - Esta constante define a primeira semana do ano. Se


você não especificar este argumento, será considerada como primeira
semana do ano aquela que ocorre no dia 1 de janeiro.

Ajustes

yyyy - Ano
q - Trimestre
m - mês
y - Dia do Ano
Onde:
d - Dia
w - Dia da semana
ww - Semana
h - Hora
n - Minuto
s - Segundo

Ajustes FirstDayOfWeek
0 - O atual do sistema
1 - Domingo (Padrão)
2 - Segunda
3 - Terça
4 - Quarta
5 - Quinta
6 - Sexta
7 - Sábado

Ajustes FirstWeekOfYear
0 - O atual do sistema (se houver)
1 - A semana em que ocorre dia 1 de janeiro
2 - A primeira semana que tem pelo menos 4 dias do novo ano
3 - A primeira semana que contiver sete dias do novo ano

Dias decorridos de 01/01/2001 a 22/06/2001


Teste = DateDiff("d",#01/01/2001#,#22/06/2001#) ' Teste = 172
Meses decorridos de 01/01/2001 a 22/06/2001
Exemplo:
Teste = DateDiff("m",#01/01/2001#,#22/06/2001#) ' Teste = 5

80
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

DATEPART
Categoria: Funções de Data e Hora
Finalidade: Retorna a parte especificada de uma determinada data
Sintaxe: DATEPART( Intervalo, Data [,FirstDayOfWeek [,FirstWeekOfYear]])
Intervalo - Expressão do tipo string indicando o intervalo de tempo que
será retornado pela função. Veja a seção Ajustes a seguir.

Data - A data a ser avaliada pela função

FirstDayOfWeek - Uma constante que define o primeiro dia da semana.


Caso você não especifique, o domingo será considerado como primeiro
dia.
Onde:
FirstWeekOfYear - Esta constante define a primeira semana do ano. Se
você não especificar este argumento, será considerada como primeira
semana do ano aquela que ocorre no dia 1 de janeiro.

Ajustes
Esta função utiliza os mesmos ajustes da função DateDiff

Calcula a semana atual da data indicada


Exemplo: Teste = DatePart("ww",#22/06/2001#) ' Teste = 25

DATESERIAL
Categoria: Funções de Data e Hora
Finalidade: Retorna a data para o dia, mês e ano especificados.
Sintaxe: DATESERIAL(Ano, Mês, Dia)
Ano - Número entre 100 e 9999 inclusive
Mês - Qualquer expressão numérica entre 1 e 12
Onde:
Dia - Qualquer expressão numérica entre 1 e 31

Retorna a data de 1 de maio de 2001


Exemplo: Teste = DateSerial(2001,5,1) ' Teste = 01/05/2001

DATEVALUE
Categoria: Funções de Data e Hora
Finalidade: Retorna uma data.
Sintaxe: DATEVALUE(Data)
Data - Expressão string representando uma data. O VBA pode
manipular datas que vão de 01/01/100 até 31/12/9999. Você também
Onde:
pode utilizar qualquer expressão que represente data, hora ou ambas.

Teste = DateValue (“6/22/2001”) ' Teste = 22/06/2001


Exemplo:
DAY
Categoria: Funções de Data e Hora
Finalidade: Retorna um número de 1 a 31 representando o dia do mês
Sintaxe: DAY(Data)
Exemplo: Teste = Day(#22/06/2001#) ' Teste = 22
DDB
Categoria: Funções Financeiras
Finalidade: Calcula a depreciação de um ativo pelo método do Declínio de Balanço
Sintaxe: DDB(Cost, Salvage, Life, Period [,Factor])
Cost - Custo Inicial do bem
Salvage - Valor do bem ao final de sua vida útil
Onde: Life - Vida Útil do bem
Period - Período de depreciação
Factor - Taxa de declínio do balanço
Teste = DDB(1000, 100, 5,1) ' Teste = 400
Exemplo:

81
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

DIR
Categoria: Funções de Sistema Operacional
Retorna o nome dos arquivos ou diretórios que combinam com o
Finalidade:
padrão especificado ou atributo de arquivo, ou volume de um drive.
Sintaxe: DIR [(PathName [,Attributes])]
Pathname - Expressão string que especifica o nome do arquivo. Este
string também pode conter o caminho completo (drive e diretório) do
arquivo procurado. Se o caminho não for encontrado, Null será
retornado.

Attributes - Constante ou expressão numérica que indica os atributo do


arquivo selecionado. Se omitido, somente serão retornados os arquivos
normais, ou seja, arquivos ocultos de sistema e diretórios não serão
Onde:
exibidos.
Ajustes:
0 - Normal
2 - Oculto
4 - Sistema
8 - Volume
16 - Diretório

Teste = Dir("C:\WINDOWS\WIN.INI") ' Teste = "WIN.INI"

Teste = Dir("C:\WINDOWS\*.INI")
List1.AddItem Teste
Do While Teste <> Empty
Teste = Dir
List1.AddItem Teste
Exemplo:
Loop

Quando você utiliza caracteres curinga como * e ?, o VBA retorna o


primeiro nome de arquivo que atende às condições de busca indicadas
na função Dir. A partir daí basta chamar a função Dir sem argumentos
para que os próximos arquivos que atendem à condição proposta sejam
exibidos.
DOEVENTS
Categoria: Funções de Sistema Operacional
Interrompe momentaneamente a execução de seu aplicativo para que o
Finalidade:
sistema operacional possa processar outros eventos pendentes.
Sintaxe: DOEVENTS()
For ind = 1 to 30000
If (ind Mod 1000) = 0 Then
DoEvents
End If
Next ind

Quando seu aplicativo realiza tarefas muito demoradas o sistema


operacional deixa de processar a ocorrência de alguns eventos, que
Exemplo: ficam pendentes em uma fila de execução.
É mais ou menos o que ocorre quando você dá dois cliques sobre o
ícone do Access para inicializá-lo. Enquanto o seu micro vai carregando
este aplicativo, as teclas que você está acionando e os cliques de
mouse dados sobre a tela são ignorados pelo Windows. Depois que a
sua aplicação já está carregada é que o Windows processa os eventos
pendentes.
A função DoEvents também retorna o número de formulários abertos no
windows.

82
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

ENVIRON
Categoria: Funções de Sistema Operacional
Retorna o string associado a uma variável de ambiente do sistema
Finalidade:
operacional (como path e prompt, por exemplo)
Sintaxe: ENVIRON( {EnvString | Número })
EnvString - Expressão string contendo o nome da variável de ambiente.
Onde:
Número - Expressão numérica correspondente à ordem da variável na
tabela de variáveis de ambiente.
Teste = Environ(“PATH”)
Exemplo: Teste = Environ(“TEMP”) ' Teste = C:\Windows\TEMP
Teste = Environ(“USER”) ' Teste = U00012
ERROR
Categoria: Funções de Sistema Operacional
Retorna a mensagem de erro que corresponde a um dado número de
Finalidade:
erro.
Sintaxe: ERRO [(ErrorNumber)]
ErrorNumber - Qualquer número de erro válido para o VBA. Um número
de erro corresponde ao valor da propriedade Number do objeto Err, e
seus valores válidos vão de 0 a 65535, inclusive. Quando combinado
com a propriedade Name do objeto Err, este número representa uma
Onde:
mensagem de erro particular. Se ErrorNumber é um número de erro
válido, porém indefinido, a função error retorna a string definida pelo
usuário. Se Errornumber não é um número de erro válido, um erro
ocorre.
Teste = Error(5) ' Teste = Invalid Procedure Call
Exemplo: Teste = Error(6) ' Teste = Overflow
Teste = Error(7) ' Teste = Out of Memory
EXP
Categoria: Funções Matemáticas
Retorna o valor de e (base de um logaritmo natural) elevado a uma
Finalidade:
potência qualquer
Sintaxe: EXP (Número)
Número - Qualquer expressão numérica válida.
Onde:
Teste = Exp(1)
Exemplo:
O valor de e é aproximadamente 2,718282. Se o valor do número for
superior a 709,782712893, ocorrerá um erro de overflow.
FILEDATETIME
Categoria: Funções de Acesso a Arquivos
Retorna a data e hora em que o arquivo foi criado ou modificado pela
Finalidade:
última vez.
Sintaxe: FILEDATETIME(Pathname)
Pathname - Expressão string que especifica o nome do arquivo. Este
Onde: string também pode conter o caminho completo (drive e diretório) do
arquivo procurado.
Teste = FileDateTime(“C:\WINDOWS\WIN.COM”) ' Teste = 24/08/95
Exemplo:
09:50:00
FIX
Categoria: Funções Matemáticas
Finalidade: Retorna a parte inteira de um número
Sintaxe: FIX (Número)
Número - Qualquer expressão numérica válida. Se o número contém
Onde: Null, o valor de retorno será Null também.

Teste = Fix(12.556) ' Teste = 12


Exemplo: Teste = Fix(-12.556) ' Teste =-12
Teste = Fix(1.6) ' Teste = 1

83
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

FORMAT
Categoria: Funções de Data e Hora
Formata uma expressão de acordo com as instruções definidas pelo
Finalidade:
usuário
Sintaxe: FORMAT (Expressão [,Formato[, FirstDayOfWeek [,FirstWeekOfYear]]])
Expressão - Qualquer expressão válida

Formato - Uma expressão de formato definida pelo usuário. Veja na


seção Ajustes os formatos existentes.
FirstDayOfWeek - Uma constante que define o primeiro dia da semana.
Veja na função DateDiff para maiores detalhes.
FirstWeekOfYear - Esta constante define a primeira semana do ano.
Veja a função DateDiff para maiores detalhes.
Ajustes
Números
General Number - Exibe o número como ele é, ou seja, sem
separadores de milhares.
Currency - Exibe o número com separadores de milhares, símbolo de
moeda e quatro
dígitos à direita do ponto decimal.
Fixed - Exibe pelo menos um dígito à esquerda e dois à direita do ponto
decimal
Standard - Exibe o número com separadores de milhares, com pelo
menos um dígito
à esquerda e dois à direita do ponto decimal.
Percent - Exibe o número multiplicado por 100 e com o símbolo de
porcentagem (%)
exibido à direita do número. Sempre exibe duas casas
decimais.
Scientific- Usa a notação científica padrão.
Yes/No - Exibe "No" se o número é zero. Caso contrário exibe "Yes"
True/False - Exibe "False" se o número é zero. Caso contrário exibe
Onde:
"True"
On/Off - Exibe "Off" se o número é zero. Caso contrário exibe "On".

Data e Hora

General Date - Para números reais exibe a data e hora, como em


23/06/2001 08:33 PM. Se o número não possuir nenhuma parte
fracionária, exibe somente a data, como em 23/06/2001. Se não houver
parte inteira, exibe apenas a hora, como em 08:33 PM. A exibição da
data obedece aos ajustes atuais do seu sistema.

Long Date - Exibe a data de acordo com o ajuste atual de seu sistema
para datas longas. Ex: Sábado, 23 de junho de 2001

Medium Date - Exibe a data de acordo com o ajuste atual de seu


sistema para datas médias. Ex: 22-Jun-2001

Short Date - Exibe a data de acordo com o ajuste atual de seu sistema
para datas curtas. Ex: 22/06/2001

Long Time - Exibe a hora de acordo com o ajuste atual de seu sistema
para horas longas. Ex: 20:33:51

Medium Time - Exibe a hora de acordo com o ajuste atual de seu


sistema para horas médias. Ex: 08:33 PM

84
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Short Time - Exibe a hora de acordo com o ajuste atual de seu sistema
para horas curtas. Ex: 20:33

Teste = Format(12345678,”General Number”) ' 12345678


Teste = Format(12345678,”Currency”) ' R$ 12.345.678,0000
Teste = Format(12345678,”Fixed”) ' 12345678.00
Teste = Format(12345678,”Standard”) ' 12.345.678.00
Teste = Format(12345678,”Scientific”) ' 1.23E+07
Teste = Format(12345678,"Yes/No") ' Yes
Teste = Format(#23/6/2001#,”Long Date”) ' Sábado, 23 de Junho
Exemplo: de
2001
Teste = Format(#23/6/2001#,”Medium Date”) ' 23-Jun-2001
Teste = Format(#23/6/2001#,”Short Date”) ' 23/06/2001
Teste = Format(“20:33”,”Long Time”) ' 20:33:00
Teste = Format(“20:33”,”Medium Time”) ' 20:33 PM
Teste = Format(“20:33”,”Short Time”) ' 20:33

FV
Categoria: Funções Financeiras
Finalidade: Calcula o valor futuro de uma anuidade ou prestação
Sintaxe: FV(Rate, Nper, Pmt[, Pv[, Type]])
Rate - Taxa de juros no período

Nper - Número total de pagamentos


Pmt - Pagamento a ser feito em cada período
Onde: Pv - Valor presente de uma série de pagamentos
Type - Número indicando quando os pagamentos serão feitos. Use 0
se os pagamentos ocorrem no fim do período e 1 se os pagamentos
serão feitos antecipadamente. Se omitido, 0 é assumido.

' Quanto obterei se depositar R$100,00 por seis meses a uma taxa de
2% ao mês
Exemplo:
Teste = FV(0.02,6,-100) ' Teste = 630.81
GETATTR
Categoria: Funções de Acesso a Arquivos
Retorna um número que representa os atributos de um arquivo ou
Finalidade:
diretório.
Sintaxe: GETATTR(Pathname)
Pathname - Expressão string que especifica o nome do arquivo. Esse
string também pode conter o caminho completo (drive e diretório) do
arquivo procurado. Se o caminho não for encontrado, Null será
retornado.

Valores de Retorno:
Onde: 0 - Normal
1 - Somente-leitura
2 - Oculto
4 - Sistema
16 - Diretório
32 - O arquivo foi alterado após o último backup

Teste = GetAttr(“C:\IO.SYS”) ' Teste = 7


Exemplo:
Teste = GetAttr(“C:\WINDOWS”) ' Teste = 16
HEX
Categoria: Funções de Conversão de Dados
Finalidade: Retorna um string representando o valor hexadecimal de um número
Sintaxe: Hex(Número)

85
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Número - Qualquer expressão numérica válida.


Onde:
Teste = Hex(15) ' Teste = F
Exemplo: Teste = Hex(5) ' Teste = 5
Teste = Hex(255) ' Teste = FF
HOUR
Categoria: Funções de Data e Hora
Finalidade: Retorna o número da hora (de 0 a 23) especificada
Sintaxe: HOUR(Time)
Time - Qualquer expressão numérica ou string que possa representar
um intervalo de tempo. Se Time contém Null, o valor de retorno da
Onde:
função será Null também.

Exemplo: Teste = Hour(#8:33:17 PM#) ' Teste = 20


IIF
Categoria: Funções de Verificação
Retorna uma de duas partes, dependendo da avaliação de uma
Finalidade:
expressão.
Sintaxe: IIF (Expressão, TruePart, FalsePart)
Expressão - Expressão a ser avaliada
TruePart - Valor ou expressão retornada se a expressão avaliada for
verdadeira
Onde:
FalsePart - Valor ou expressão retornada se a expressão avaliada for
falsa.

intDado = 100
Exemplo: Teste = IIf(intDado>10,"MaiorqueDez","MenorqueDez") ' Teste =
“MaiorqueDez”
INPUTBOX
Categoria: Funções de Sistema Operacional
Exibe uma caixa de diálogo para que o usuário possa digitar uma
Finalidade: resposta qualquer. Após escolher um dos botões disponíveis, o VBA
retorna o valor digitado.
Sintaxe: INPUTBOX(Prompt[, Title][,Default][,Xpos][,Ypos])
Prompt - Expressão string que será exibida como mensagem na caixa
de diálogo. O comprimento máximo da mensagem é de 1024
caracteres. Você pode quebrar a mensagem em várias linhas utilizando
a combinação de caracteres de retorno de carro CHR(13) e mudança
de linha CHR(10), como em (CHR(13) & CHR(10)).

Title - Expressão string que será exibida na barra de título da caixa de


diálogo. Se você omitir este argumento, o nome exibido na barra de
título será o nome de sua aplicação.
Default - Expressão string que será retornada como default caso o
Onde: usuário não digite nenhum dado na caixa de diálogo. Se você omitir
este argumento, a textbox da caixa de diálogo será exibida vazia.
Xpos - Expressão numérica que especifica em twips a distância
horizontal entre a borda esquerda da tela e da caixa de diálogo. Se
você omitir este argumento, a caixa de diálogo será centralizada
horizontalmente.
Ypos - Expressão numérica que especifica em twips a distância vertical
entre a borda superior da caixa de diálogo e o topo da tela. Se você
omitir este argumento a caixa de diálogo será centralizada
verticalmente

86
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

INSTR
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna a posição da primeira ocorrência de um string dentro de outro
Sintaxe: INSTR([Início,]String1,String2[,Compare])
Início - Expressão numérica que indica a posição inicial de cada busca.
Se omitido, a busca começa desde a primeira posição.
String1 - String onde é feita a procura
Onde:
String2 - Expressão string que está sendo procurada
Compare - Especifica o tipo de comparação a ser efetuado entre as
strings.
Teste = InStr("Casa","as") ' Teste = 2
Exemplo: Teste = InStr("Casamento","t") ' Teste = 8
Teste = InStr("Casa","z") ' Teste = 0

INT
Categoria: Funções Matemáticas
Finalidade: Retorna a parte inteira de um número
Sintaxe: INT(Número)
Número - Qualquer expressão numérica válida. Se número contém Null
Onde:
o valor de retorno será Null também.
Exemplo: Idêntico à função Fix
ISARRAY
Categoria: Funções de Verificação
Retorna um valor Boolean indicando se uma determinada variável é um
Finalidade:
Array.
Sintaxe: ISARRAY(Varname)
Onde: Varname - Qualquer variável de memória
Dim MeuArray(2) As Integer, Nome As String
Exemplo:
Teste = IsArray(Nome) ' Teste = False
Teste = IsArray(MeuArray) ' Teste = True
ISDATE
Categoria: Funções de Verificação
Retorna um valor Boolean indicando se uma determinada expressão
Finalidade:
pode ser convertida para uma data.
Sintaxe: ISDATE(Expressão)
Expressão - Qualquer data ou string que possa ser reconhecida como
Onde:
uma data ou hora válida
dtmDado = "23/06/2001"
strMens = "Hoje"
Exemplo:
Teste = IsDate(dtmDado) ' Teste = True
Teste = IsDate(strMens) ' Teste = False
ISEMPTY
Categoria: Funções de Verificação
Retorna um valor Boolean indicando se uma determinada variável foi
Finalidade:
inicializada ou não.
Sintaxe: ISEMPTY(Expressão)
Expressão - Qualquer expressão numérica ou string que possa ser
Onde:
reconhecida como um nome de variável.
Teste = IsEmpty(dtmDado) ' Teste = True
Exemplo: Dado = Null
Teste = IsEmpty(dtmDado) ' Teste = False
ISMISSING
Categoria: Funções de Verificação
Retorna um valor Boolean indicando se um argumento opcional foi
Finalidade:
passado para uma procedure ou não.
Sintaxe: ISMISSING(NomeArgumento)
NomeArgumento - Nome de um argumento opcional em uma
Onde:
procedure. Retorna um valor True se o argumento especificado não foi

87
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

passado à função, caso contrário a resposta será False.


Sub ProcTeste (arg1 as String, arg2 as Integer, arg3 as String)
.....
If IsMissing(arg2) Then
MsgBox "Este argumento é obrigatório para o cálculo."
Exemplo: End If
.....
End Sub

ISNULL
Categoria: Funções de Verificação
Retorna um valor Boolean indicando se uma expressão contém dados
Finalidade:
inválidos (Null).
Sintaxe: ISNULL(Expressão)
Expressão - Qualquer valor numérico ou expressão string. Se a
Onde: expressão avaliada tiver dados inválidos (Null) a função resultará em
True, caso contrário o valor retornado será False.
strDado = ""
Teste = IsNull(strDado) ' Teste = False
Exemplo:
strDado = Null
Teste = IsNull(strDado) ' Teste = True
ISNUMERIC
Categoria: Funções de Verificação
Retorna um valor Boolean indicando se uma determinada expressão
Finalidade:
pode ser avaliada como numérica.
Sintaxe: ISNUMERIC(Expressão)
Onde: Expressão - Qualquer valor numérico ou expressão string
intDado = "100"
Teste = IsNumeric(intDado) ' Teste = True
Exemplo:
strDado = "Cem"
Teste = IsNumeric(strDado) ' Teste = False
LBOUND
Categoria: Funções de Array
Retorna o menor elemento da dimensão especificada de um
Finalidade:
determinado array.
Sintaxe: LBOUND(Arrayname[, Dimensão])
Arrayname - Nome da variável array
Dimensão - Número que indica que a dimensão do array está sendo
Onde:
inspecionada. Utilize 1 para a primeira dimensão, 2 para a segunda e
assim por diante.
Dim Dado (5 to 10)
Exemplo:
Teste = LBound(Dado,1) ' Teste = 5
LCASE
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna uma string convertida para letras minúsculas
Sintaxe: LCASE(string)
String - Qualquer expressão string válida. Somente as letras maiúsculas
Onde: serão convertidas para minúsculas. Os demais caracteres como letras
minúsculas, números e sinais permanecem inalterados.
Dado = "CAIXA ALTA"
Exemplo:
Teste = LCase(Dado) ‘ Teste = "caixa alta"
LEFT
Categoria: Funções de Manipulação de Strings
Retorna o número especificado de caracteres a partir do lado esquerdo
Finalidade:
de uma string.
Sintaxe: LEFT(String, Comprimento)
Onde: String - Expressão string da qual os caracteres serão retornados.

88
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Comprimento - Expressão numérica indicando quantos caracteres


serão retornados. Se igual a 0, uma string de tamanho zero será
retornada. Se o comprimento for maior que o número de caracteres da
string, toda ela será retornada.

Dado = "SENAC Informática"


Teste = Left(Dado,1) ' Teste = "S"
Exemplo:
Teste = Left(Dado,6) ' Teste = "SENAC "
Teste = Left(Dado,10) ' Teste = "SENAC Info"
LOADPICTURE
Categoria: Funções de Sistema Operacional
Carrega uma imagem dentro de um objeto Form object, Controle
Finalidade:
PictureBox ou controle Image
Sintaxe: LOADPICTURE([StringExpression])
StringExpression - Nome do arquivo gráfico a ser carregado.
Alguns formatos de arquivo suportados pelo Visual Basic são os
Onde:
seguintes: Bitmap (BMP), Icon (.ICO), e Metafile (.WMF).

Form1.Picture = LoadPicture(“PARTY.BMP”)
Exemplo: Form1.Icon = LoadPicture(“PHONE01.ICO”)

LOG
Categoria: Funções Matemáticas
Finalidade: Calcula o logaritmo natural de um número
Sintaxe: LOG(Número)
Número - Qualquer expressão numérica válida maior que zero.
Onde:
Teste = Log(0) ' Teste = 1
Exemplo:
Teste = Log(5) ' Teste = 1.6094379124341
LTRIM
Categoria: Funções de Manipulação de Strings
Retorna uma cópia de uma string eliminando os espaços em branco
Finalidade:
existentes entre o início da string e o primeiro caractere.
Sintaxe: LTRIM(String)
String - Qualquer expressão string válida. Se a string contém Null, Null
Onde: é retornado.

Dado = " Casa"


Exemplo:
Teste = LTrim(Dado) ' Teste = "Casa"
MID
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna o número especificado de caracteres de um string.
Sintaxe: MID(String, Start [,Length])
String -Qualquer expressão string válida. Se a string contém Null, Null é
retornado.
Start - Posição inicial a partir da qual os caracteres serão selecionados.
Se a posição inicial for maior que o número de caracteres da string,
Onde: uma string de tamanho zero será retornada.
Length - Número de caracteres que serão selecionados. Se omitido
todos os caracteres desde a posição inicial especificada até o fim da
mesma serão selecionados.

Dado = "Vermelho"
Teste = Mid(Dado,1,3) ' Teste = "Ver"
Exemplo:
Teste = Mid(Dado,4) ' Teste = "melho"
Teste = Mid(Dado,5,4) ' Teste = "elho"

89
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

MINUTE
Categoria: Funções de Data e Hora
Finalidade: Retorna o número de minutos da hora especificada (de 0 à 59)
Sintaxe: MINUTE ( Time )
Time - Qualquer expressão numérica ou string que possa representar
um intervalo de tempo. Se Time contém Null, o valor de retorno da
Onde:
função será Null Também.

Exemplo: Teste = Minute(#8:33:17 PM#) ' Teste = 33


MONTH
Categoria: Funções de Data e Hora
Finalidade: Retorna o número do mês de uma determinada data (de 1 à 12)
Sintaxe: MONTH (Data)
Data - A data a ser avaliada pela função
Onde:
Exemplo: Teste = Month(#23/06/2001#) ' Teste = 6
MSGBOX
Categoria: Funções de Sistema Operacional
Exibe uma mensagem em uma janela de diálogo e espera que o
Finalidade: usuário escolha um dos botões disponíveis. Após a seleção o VBA
retorna um valor indicando o botão escolhido.
Sintaxe: MSGBOX( Prompt [,Buttons][,Title])
Prompt - Expressão string que será exibida como mensagem na caixa
de diálogo. O comprimento máximo da mensagem é de 1024
caracteres. Você pode quebrar a mensagem em várias linhas utilizando
a combinação de caracteres de retorno de carro Chr(13) e mudança de
linha Chr(10), como em (Chr(13) & Chr(10))
Buttons - Expressão numérica que é a soma dos valores que
especificam o número e tipo de botões a serem exibidos. Você também
pode especificar o estilo de ícone a ser usado, o botão default e a
modalidade da caixa de mensagem. Se omitido, o valor default para os
botões é zero.
Title - Expressão string que será exibida na barra de título da caixa de
diálogo. Se você omitir este argumento o nome exibido na barra de
título será o nome de sua aplicação.
Ajustes:
0 - Botão OK (default)
1 - Botões OK e Cancel
2 - Botões Abort, Retry, e Ignore
3 - Botões Yes, No e Cancel
4 - Botões Yes e No
Onde:
5 - Botões Retry e Cancel
16 - Ícone de Parada Crítica.
32 - Ícone de Pergunta
48 - Ícone de Atenção
64 - Ícone de Informação
0 - Primeiro botão é default
256 - Segundo botão é default
512 - Terceiro botão é default
0 - Aplicação Modal; O usuário deve responder à mensagem exibida
antes de prosseguir com a execução da aplicação atual.
4096 - Sistema Modal; Todas as aplicações são suspensas até o
usuário responder a mensagem.
O primeiro grupo de valores descreve o número e o tipo de botões
exibidos. O segundo grupo (16,32,48,64) descreve o estilo do ícone
exibido. O terceiro grupo (0,256,512) determina que botão é o default. O
quarto e último grupo (0,4096) determina a modalidade da caixa de
diálogo. Você deve selecionar um número de cada grupo e somar todos
para obter a aparência desejada para sua Message Box.

90
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Valores de Retorno
1 - OK
2 - Cancel
3 - Abort
4 - Retry
5 - Ignore
6 - Yes
7 - No
' Exibe botões OK e Cancel e Ícone de Parada Crítica
Teste = MsgBox("Teste",17,"MsgBox")
Exemplo:
' Exibe Yes/No numa janela de Atenção com o primeiro botão default
Teste = MsgBox("Teste",68,"MsgBox")
NOW
Categoria: Funções de Data e Hora
Finalidade: Retorna a data e hora atuais do seu sistema
Sintaxe: NOW
Exemplo: Teste = Now ' Teste = 21/05/2001 09:50:25
OCT
Categoria: Funções de Conversão de Dados
Finalidade: Retorna uma string representando o valor octal de um número.
Sintaxe: OCT(Número)
Número - Qualquer expressão numérica ou string válida.
Onde:
Teste = Oct(8) ' Teste = 10
Exemplo:
Teste = Oct(456) ' Teste = 713

QBCOLOR
Categoria: Funções de Sistema Operacional
Finalidade: Retorna o valor da cor RGB correspondente ao número de cor
informado.
Sintaxe: QBCOLOR(cor)
Onde: Cor - Número de 0 à 15 conforme descrito na seção ajustes

00 - Black
01 - Blue
02 - Green
03 - Cyan
04 - Red
05 - Magenta
06 - Yellow
07 - White
08 - Gray
09 - Light Blue
10 - Light Green
11 - Light Cyan
12 - Light Red
13 - Light Magenta
14 - Light Yellow
15 - Bright White

Exemplo: Form1.BackColor = QBColor(cor)


RGB
Categoria: Funções de Sistema Operacional
Finalidade: Retorna um número representando uma cor do padrão RGB
Sintaxe: RGB( Red, Green, Blue)

91
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Onde: Red - Número entre 0 to 255, inclusive, que representa o componente


vermelho de uma cor.
Green - Número entre 0 to 255, inclusive, que representa o
componente verde de uma cor.
Blue - Número entre 0 to 255, inclusive, que representa o componente
azul de uma cor.

Exemplo: CommDialog.Color = RGB(255,0,0)


RIGHT
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna o número especificado de caracteres a partir do lado direito de
uma string
Sintaxe: RIGHT( String, Comprimento)
Onde: String - Expressão string da qual os caracteres serão retornados.
Comprimento - Expressão numérica indicando quantos caracteres
serão retornados. Se igual à 0 uma string de tamanho zero será
retornada. Se o comprimento for maior que o número de caracteres da
string ,toda ela será retornada.

Exemplo: Dado = "SENAC Informática"


Teste = Right(Dado,1) ‘ Teste = "a"
Teste = Right(Dado,6) ‘ Teste = "mática"
Teste = Right(Dado,11) ‘ Teste = "Informática "

RND
Categoria: Funções Matemáticas
Finalidade: Retorna um número aleatório (randômico)
Sintaxe: RND[(Número])
Onde: Número- Qualquer expressão numérica válida.

Exemplo: Teste = Rnd


RTRIM
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna uma cópia de um string eliminando os espaços em branco
existentes entre o último caractere da string e o fim da mesma.
Sintaxe: RTRIM(String)
Onde: String - Qualquer expressão string válida. Se o string contém Null, o
Null é retornado.

Exemplo: Dado = "Casa "


Teste = RTrim(Dado) ' Teste = "Casa"
SECOND
Categoria: Funções de Data e Hora
Finalidade: Retorna o número de segundos da hora especificada (de 0 à 59)
Sintaxe: SECOND(Time)
Onde: Time - Qualquer expressão numérica ou string que possa representar
um intervalo de tempo. Se Time contém Null, o valor de retorno da
função será Null também.
Exemplo: Teste = Second(#8:33:17#) ‘ Teste = 17
SGN
Categoria: Funções Matemáticas
Finalidade: Retorna um intervalo conforme o sinal do número
Sintaxe: SGN(Número)
Onde: Número - Qualquer expressão numérica válida.

Ajustes :
>0 - Retorna 1
=0 - Retorna 0
<0 - Retorna -1
Exemplo: Teste = Sgn(12) ' Teste = 1

92
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Teste = Sgn(-2.4) ' Teste = -1


Teste = Sgn(0) ' Teste = 0

SHELL
Categoria: Funções de Sistema Operacional
Finalidade: Inicia a execução de um programa aplicativo qualquer.
Sintaxe: SHELL( PathName [,WindowsStyle])
Onde: PathName- Nome do programa a ser executado. Pode incluir eventuais
argumentos na linha de comando. Também pode incluir o diretório e
drive onde está localizado o executável. Você também pode informar o
nome do documento se o mesmo tiver sua extensão associada a um
executável no Windows (o arquivo .txt abrir pelo NotePad).
WindowsStyle - Número que corresponde ao estilo da janela em que o
programa será executado. Se omitido o programa será executado
minimizado.
Ajustes:
0 - A janela é oculta e o foco é passado para esta janela.
1 - A janela tem o foco e é restaurada para seu tamanho e posição
original.
2 - A janela é exibida como um ícone com foco.
3 - A janela é maximizada com foco
4 - A janela é restaurada ao seu mais recente tamanho e posição. A
janela corrente permanece ativa.
6 - A janela é exibida como um ícone. A janela corrente permanece
ativa.

Exemplo: Teste = Shell("C:\WINDOWS\CALC.EXE",1)

SIN
Categoria: Funções Matemáticas
Finalidade: Calcula o seno de um número
Sintaxe: SIN(Número)
Onde: Número - Qualquer expressão numérica válida que expresse um ângulo
em radianos .

Exemplo: Teste = Sin(1.25) ' Teste = 0.948984619355586


Teste = Sgn(.79) ' Teste = 0.710353272417608

SPACE
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna um string com o número de espaços em branco especificados
pelo usuário.
Sintaxe: SPACE(Número)
Onde: Número - Quantidade de espaços em branco que você quer incluir no
string.

Exemplo: Dado = "Passo"


Teste = Dado & Space(2) & "Firme" ' Teste = "Passo Firme"
SQR
Categoria: Funções Matemáticas
Finalidade: Calcula a raiz quadrada de um número
Sintaxe: SQR(Número)
Onde: Número - Qualquer expressão numérica válida maior ou igual à zero.

Exemplo: Teste = SQR(16) ' Teste = 4


STR
Categoria: Funções de Conversão de Dados
Finalidade: Retorna um string representando o valor de um número
Sintaxe: STR(Número)

93
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

Onde: Número - Qualquer expressão numérica válida.

Exemplo: Teste = Str(123) ' Teste = "123"


Teste = Str(2001) ' Teste = "2001"

STRCOMP
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna um valor indicando o resultado de uma comparação de strings
(se maior, igual, ou menor)
Sintaxe: StrComp(String1, String2 [,Compare])
Onde: String1 - Qualquer expressão string válida
String2 - Qualquer expressão string válida
Compare - Especifica o tipo de comparação a ser efetuada.

Ajustes:
String1 < String2 - Retorna -1
String1 = String2 - Retorna 0
String1 > String2 - Retorna 1
String1 ou String2 = NULL - Retorna Null

Exemplo: Dado1 = "ABCD"


Dado2 = "abcd"
Teste = StrComp(Dado1,Dado2,1) ' Teste = 0
Teste = StrComp(Dado1,Dado2,0) ' Teste = -1
Teste = StrComp(Dado2,Dado1) ' Teste = 1

STRCONV
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna um string convertido de acordo com a operação especificada
pelo usuário
Sintaxe: STRCONV(String, Conversion)
Onde: String - O string a ser convertido
Conversion - A soma dos valores que especificam o tipo da conversão a
ser feita.

Ajustes:
1 - Retorna o string para caracteres maiúsculos
2 - Converte o string para caracteres minúsculos
3 - Converte a primeira letra de cada palavra do string para maiúscula
String1 > String2 - Retorna 1
String1 ou String2 = NULL - Retorna Null

Exemplo: Dado = “access avançado”


Teste = StrConv(Dado,3) ‘ Teste = “Access Avançado”
STRING
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna um string com caracteres repetidos no comprimento
especificado pelo usuário
Sintaxe: STRING(Número, Caractere )
Onde: Número - Comprimento do string a ser retornado
Caractere - Código do caractere ou expressão string cujo primeiro
caractere será utilizado para construção do novo string.

Exemplo: Teste = String(5,"*") ' Teste = "*****"


Teste = String(5,42) ' Teste = "*****"
Teste = String(10,"ABC") ' Teste = "AAAAAAAAAA"

94
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

TAN
Categoria: Funções Matemáticas
Finalidade: Calcula a tangente de um número
Sintaxe: TAN( Número )
Onde: Número - Qualquer expressão numérica válida que expresse um ângulo
em radianos.

Exemplo: Teste = Tan(.79) ' Teste = 1.00924628838275

TIME
Categoria: Funções de Data e Hora
Finalidade: Retorna a hora atual do sistema
Sintaxe: TIME
Exemplo: Teste = Time ' Teste = 15:43:05

TIMER
Categoria: Funções de Data e Hora
Finalidade: Retorna o número de segundos decorridos desde às 0:00hs (de 0 à 59)
Sintaxe: TIMER
Exemplo: Teste = Timer ' Teste = 855912.6

TRIM
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna uma cópia de um string eliminando os espaços existentes entre
o início do string e o primeiro caractere e o último caractere do string e
o fim do mesmo.
Sintaxe: TRIM(String)
Onde: String - Qualquer expressão string válida. Se o string contém Null, o
Null é retornado.
Exemplo: Dado = " Casa "
Teste = Trim(Dado) ' Teste = "Casa"

UBOUND
Categoria: Funções de Array
Finalidade: Retorna o maior elemento da dimensão especificada de um
determinado array.
Sintaxe: UBOUND(ArrayName [,Dimensão])
Onde: ArrayName - Nome da variável Array
Dimensão - Número que indica que dimensão do array está sendo
inspecionada. Utilize 1 para a primeira dimensão, 2 para a segunda e
assim por diante.

Exemplo: Dim Dado(5 To 10)


Teste = UBound(Dado,1) ' Teste = 10

UCASE
Categoria: Funções de Manipulação de Strings
Finalidade: Retorna uma string convertida para letras maiúsculas
Sintaxe: UCASE (String)
Onde: String - Qualquer expressão string válida. Somente as letras minúsculas
serão convertidas maiúsculas. Os demais caraceteres como números e
sinais permanecem inalterados.
Exemplo: Dado = "caixa alta"
Teste = UCase(Dado) ' Teste = "CAIXA ALTA"

95
ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

VAL
Categoria: Funções de Conversão de Dados
Finalidade: Retorna os números contidos em um string
Sintaxe: VAL(String)
Onde: String - Qualquer expressão string válida.
Exemplo: Teste = Val("2457") ' Teste = 2457
Teste = Val("2 45 7") ' Teste = 2457
Teste = Val("24 and 57") ' Teste = 24

VARTYPE
Categoria: Funções de Verificação
Finalidade: Retorna um valor indicando o subtipo de uma variável
Sintaxe: VARTYPE(VarName)
Onde: VarName - Qualquer variável de memória válida

Ajustes:

00 - Empty
01 - Null
02 - Integer
03 - Long Integer
04 - Single
05 - Double
06 - Currency
07 - Date
08 - String
09 - OLE Automation Object
10 - Error
11 - Boolean
12 - Variant (usada somente com arrays de Variants)
13 - Não OLE Automation Object
17 - Byte
8192 - Array

Exemplo: Dim Dado As Integer


Teste = VarType (Dado) ' Teste = 2

WEEKDAY
Categoria: Funções de Data e Hora
Finalidade: Retorna o número do dia da semana (1 - Domingo, etc)
Sintaxe: WEEKDAY( Data [, Firstdayofweek])
Onde: Data - Expressão string ou numérica representando uma data. Se data
contém Null, Null é retornado
Firstdayofweek - Um constante que define o primeiro dia da semana.
Caso você não especifique, o Domingo será considerado como primeiro
dia. Veja a seção Ajustes da função DateDiff para maiores detalhes.

Exemplo: Teste = WeekDay(#23/06/2001#) ' Teste = 7

YEAR
Categoria: Funções de Data e Hora
Finalidade: Retorna o número do ano de uma determinada data.
Sintaxe: YEAR(Data)
Onde: Data - Expressão string ou numérica representando uma data. Se
Data contém Null, o Null é retornado.
Exemplo: Teste = Year(#23/06/2001#) ' Teste = 2001

96