120387983 programando em vba

96
1 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

Upload: ptalvaro

Post on 28-Dec-2015

231 views

Category:

Documents


48 download

TRANSCRIPT

Page 1: 120387983 Programando Em Vba

1

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

Page 2: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

2

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

Page 3: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

3

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)

Page 4: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

4

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

Page 5: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

5

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

Page 6: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

6

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

Figura 2 - Janela de Código do VBA

Área de código ondeescrevemos os comandos emVBA.

Seleciona o objetodesejado Seleciona o procedimento,

método ou evento doobjeto.

Exibe ajanela depurar

Exibe oexplorador deobjetos

Exibe a janelade inspeção devariáveis

Ativa/Desativa pontos deinterrupçãp

Inicia, pára ouredefine a execuçãodo código

Insere móduloou procedimento na área decódigo

Visualiza somente um outodos procedimentos dajanela

Page 7: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

7

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

Flutuante de 4 bytes -3,402823E38 até -1,401298E-45 para valores negativos 1,401298E-45 até 3,402823E38 para valores positivos

Double Número de Ponto Flutuante de 8 bytes

-1,797693E308 a -4,940656E-324 para valores negativos; 4,940656E-324 até 1,797693E308 para valores positivos

Currency Ponto Decimal fixo com 8 bytes

-922.337.203.685.477,5808 até 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-defined

Número Requerido Cada elemento obedece seu tipo

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.

Page 8: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

8

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 :

Figura 3 - Janela de Módulo

Esta instrução obriga adeclaração de variáveis.

Page 9: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

9

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

Page 10: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

10

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.

Page 11: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

11

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:

Page 12: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

12

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

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

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

5

2

7

3

6

4

Page 13: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

13

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» bloco_de_comandos Loop 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 ]

OBSERVAÇÃO: Note bem que Do Until «condição» é

equivalente a instrução de Do While Not«condição».

Page 14: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

14

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 strNome= txtNome_Cliente If strNome = "Mario Paranhos" Then Exit For End If Next intInd 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

OBSERVAÇÃO: Podemos utilizar estas saídas forçadas:

Exit Do Exit For Exit Function Exit Sub

Page 15: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

15

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)

Page 16: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

16

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.

Page 17: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

17

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.

Page 18: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

18

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.

Page 19: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

19

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 #

Page 20: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

20

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

Page 21: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

21

• 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:

Page 22: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

22

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.

Page 23: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

23

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.

Page 24: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

24

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.

Page 25: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

25

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

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).

[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

Page 26: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

26

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.

Page 27: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

27

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

Page 28: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

28

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.

Page 29: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

29

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.

Figura 16 - Método Err (Erro)

Zera o código de erro retornado

Descrição do código de erro retornado

Valor do código do erro retornado

Page 30: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

30

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:

On Error GoTo Label_X

Ação 1 (Error)

Ação 2

Ação 3 Ret_Erro:

End

Error Handler

Label_X:

Resume

Resume Next

Resume

Start

Page 31: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

31

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:

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.

Este menu de atalho é mostrado quando seclica com o botão direito do mouse emqualquer lugar da área de código.

Inserindo um pontode interrupção.

Page 32: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

32

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

Page 33: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

33

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 ... ... ... 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

Você pode combinar íconese botões somando o valordas constantes.

Page 34: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

34

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

Page 35: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

35

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]

Page 36: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

36

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.

Page 37: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

37

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';

Page 38: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

38

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];

Page 39: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

39

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];

Page 40: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

40

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);"

Page 41: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

41

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;

Page 42: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

42

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';

Page 43: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

43

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.

Page 44: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

44

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

Page 45: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

45

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: conjuntoderegistros.{FindFirst | FindLast | FindNext | FindPrevious} critérios 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.

Uma variável de objeto que representaum objeto Recordset tipo dynaset ousnapshot existente.

Um String usado para localizar o registro. É como acláusula WHERE em uma instrução SQL, mas sem a palavraWHERE.

Page 46: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

46

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.

Page 47: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

47

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.

Page 48: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

48

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.

Page 49: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

49

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

Page 50: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

50

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.

Figura 21 - Referências Utilizadas no Aplicativo

Neste caso, estãoselecionadas as referênciasdo Access, do Word, doExcel e do próprio DAO,além da biblioteca do VBA.

Page 51: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

51

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.

Page 52: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

52

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.

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.

Microsoft WORD

Documents

Windows

Selection

Page 53: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

53

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.

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

APPLICATION

Workbooks

WorkSheets

Charts Document Properties

VBProject

CustomViews

Command Bars

PivotCaches

Styles Borders

Font

Interior Windows

Panels

Names

Routing Slip

Mailer

Add-Int

AutoCorrect

Assistant DBug

Dialogs

WorksheetFunction

RecentFiles

FileSearch

VBE

ODBCErrors

Page 54: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

54

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

Page 55: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

55

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.

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

APPLICATION

References

Forms Controls

Reports Controls

Modules

Screen

Docmd

Page 56: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

56

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.

Page 57: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

57

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.

Page 58: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

58

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.

Page 59: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

59

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.

Page 60: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

60

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.

Page 61: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

61

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>.

Page 62: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

62

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.

Page 63: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

63

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.

Page 64: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

64

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.

Page 65: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

65

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>.

Page 66: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

66

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>.

Page 67: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

67

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.

Page 68: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

68

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>.

Page 69: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

69

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.

Page 70: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

70

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.

Page 71: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

71

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.

Page 72: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

72

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>.

Page 73: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

73

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

Page 74: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

74

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

Left Retorna o número especificado de caracteres a partir do lado esquerdo de uma string

Len Retorna o número de caracteres em uma string ou o número de bytes requeridos para armazenar uma variável.

Ltrim Retorna uma cópia de uma string eliminando os espaços existentes entre o início da string e o primeiro caractere.

Mid Retorna o número especificado de caracteres de uma string

Partition Retorna uma string indicando onde um número ocorreu dentro de uma série calculada

Right Retorna o número especificado de caracteres a partir do lado direito de uma string

Rtrim Retorna uma cópia de uma string eliminando os espaços existentes entre o ú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

StrComp Retorna um valor indicando o resultado de uma comparação de strings (se maior, igual ou menor)

StrConv Retorna uma string convertida de acordo com a operação especificada pelo usuário

String Retorna uma string com caracteres repetidos no comprimento especificado pelo usuário.

Trim Retorna uma cópia de uma string eliminando os espaços existentes entre o início 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

Array Retorna uma variável de memória do tipo de dado Variant contendo o 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

Page 75: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

75

Funções de Sistema Operacional

Command Retorna o argumento informado na linha de comando utilizado na 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

Dir Retorna o nome do(s) arquivo(s) ou diretório(s) que combina(m) com o padrão especificado ou atributo de arquivo, ou volume de um drive

DoEvents Interrompe momentaneamente a execução de seu aplicativo para que o sistema operacional possa processar outros eventos.

Environ Retorna a string associada a uma variável de ambiente do sistema 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

InputBox Exibe uma caixa de diálogo para que o usuário possa digitar uma resposta qualquer. Após escolher um dos botões disponíveis , o VB retorna o valor digitado.

LoadPicture Carrega uma imagem dentro de um objeto Form object, Controle PictureBox ou controle Image.

MsgBox Exibe uma mensagem em um quadro de diálogo e espera que o usuário 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

Spc utilizada com o comando Print # ou com o método Print para posicionar a saída de uma expressão qualquer.

Tab Utilizada com o comando Print # ou com o método Print para posicionar a 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

Lof Retorna o tamanho em bytes de um arquivo aberto através do comando Open

FileAttr Retorna o modo do arquivo ou o número do handle para arquivos abertos através do comando Open.

FileDateTime Retorna a data e hora em que o arquivo foi criado ou modificado pela última vez.

FileLen Retorna o tamanho de um determinado arquivo em bytes

FreeFile Retorna o próximo número de arquivo disponível para utilização pelo 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.

Seek Retorna a posição atual de leitura / escrita de um arquivo aberto com o 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

IsDate Retorna um valor Boolean indicando se uma determinada expressão pode ser convertida para uma data.

IsEmpty Retorna um valor Boolean indicando se uma determinada variável foi inicializada ou não.

IsError Retorna um valor Boolean indicando se uma determinada expressão é um valor de erro.

IsMissing Retorna um valor Boolean indicando seum argumento opcional foi passado

Page 76: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

76

para uma procedure ou não.

IsNull Retorna um valor Boolean indicando se uma expressão contém dados inválidos (Null)

IsNumeric Retorna um valor Boolean indicando se uma determinada expressão pode ser avaliada como um valor numérico

IsObject Retorna um valor Boolean indicando se uma determinada expressão faz referência a um objeto OLE válido.

Switch Avalia uma lista de expressões e retorna um valor ou uma expressão 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)

Onde: Número - Qualquer valor numérico válido. Se número contém Null, o 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.

Exemplo: Teste = ABS(2.99) ' Teste=2.99 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)

Onde: Lista de Argumentos - Consiste em uma série de argumentos separados por vírgulas. Se nenhum argumento for dado à função, será criado um array de comprimento zero.

Exemplo: MeuArray = Array("Jan","Fev","Mar","Abr") ' MeuArray(2)="Fev" MeuArray = Array(1,3,5,7) ' MeuArray(3)=5

ASC Categoria: Funções de Conversão de Dados

Finalidade: Retorna o código ASCII correspondente do primeiro caractere da string indicada

Sintaxe: ASC(String)

Onde: String - O argumento é qualquer expressão de caracteres válida. Se o string especificado não contiver caracteres ocorrerá um erro..

Exemplo: Teste = Asc(“A” ) 'Teste=65 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)

Onde: Número - A função Atn retorna o número de radianos referentes ao arco tangente do ângulo especificado.

Exemplo: Teste=Atn(30) 'Teste = 1.53747533091665 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)

Onde: Expressão - Se o valor da expressão resultante for zero, o valor False será retornado pela função CBool; caso contrário a resposta será True.

Exemplo: Primeiro = 10 Segundo = 10 Valor = 0

Page 77: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

77

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)

Onde: Expressão - O argumento da função poderá ser qualquer valor numérico válido

Exemplo: Dim Teste As Double 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)

Onde: Expressão - O argumento da função poderá ser qualquer valor numérico válido ou expressão string

Exemplo: Dim Dado As Double Dado = 656.123456 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)

Exemplo: Hoje ="June 18, 2001" 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)

Onde: Expressão - O argumento da função poderá ser qualquer valor numérico válido ou expressão string

Exemplo: Dim MinhaMoeda As Currency MinhaMoeda = 255.123456 Dado = CDbl(MinhaMoeda) ' Dado = 255.1235

CHOOSE

Categoria: Funções de Verificação

Finalidade: Seleciona e retorna um valor de uma lista de argumentos existentes em função do índice passado.

Sintaxe: CHOOSE( index, choice-1[, choice-2,...[,choice-n]])

Onde: Index - Expressão numérica ou campo que resulta em um valor entre 1 e o número de escolhas disponíveis. Choice - Expressão Variant contendo uma das possíveis escolhas.

Exemplo:

Teste = Escolha(2) ' Teste = "Valor2" pois foi o valor retornado pela função Escolha 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)

Exemplo: Teste = Chr(65) ' Teste = A Teste = Chr(97) ' Teste = a Teste = Chr(64) ' Teste = @

Page 78: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

78

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)

Onde: Expressão - O argumento da função poderá ser qualquer valor numérico válido ou expressão string

Exemplo: Dim Duplo As Double Duplo = 8765.4321 Teste = CInt(Duplo) ' Teste=8765

CLNG Categoria: Funções de Conversão de Dados

Finalidade: Converte uma expressão para o tipo de dado Long (Número Inteiro Longo)

Sintaxe: CLNG(Expressão)

Onde: Expressão - O argumento da função poderá ser qualquer valor numérico válido ou expressão string

Exemplo: Dim Dado As Double Dado = 65432.123 Teste = CLng(Dado) ‘ Teste=65432

COMMAND Categoria: Funções de Sistema Operacional

Finalidade: Retorna o argumento informado na linha de comando utilizado na inicialização do Microsoft Access.

Sintaxe: COMMAND

Onde: Crie um módulo onde você testará o argumento passado. Na linha de comando adicione , após ao nome do arquivo .mdb, o seguinte texto /cmd «argumento.

Exemplo:

Dim Msg As String If Command = "" Then Msg = "Não existe argumento na linha de comando" 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)

Onde: Número - Pode ser qualquer expressão numérica válida que expresse um ângulo em radianos

Exemplo: Const PI = 3.14159265 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)

Onde: Expressão - O argumento da função poderá ser qualquer valor numérico válido ou expressão string

Exemplo: Dim Teste As Double 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)

Onde: Expressão - O argumento da função poderá ser qualquer valor numérico válido ou expressão string

Exemplo: Dim Dado As Double Dado = 555.4321

Page 79: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

79

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

Categoria: Funções de Sistema Operacional Finalidade: Retorna a pasta (ou diretório) atual Sintaxe: CURDIR[(Drive)]

Onde: Drive - Expressão string que especifica uma unidade de disco existente. 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)

Onde: Expressão - O argumento da função poderá ser qualquer valor numérico válido ou expressão string

Exemplo: Dim NumInteiro As Integer 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

Finalidade: Retorna um valor Variant contendo a data especificada acrescida do intervalo de tempo fornecido à função.

Sintaxe: DATEADD(Intervalo, Número, Data)

Onde:

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. 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

Exemplo:

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

Page 80: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

80

DATEDIFF Categoria: Funções de Data e Hora

Finalidade: Retorna um intervalo de tempo decorrido entre duas datas de acordo com a unidade de tempo especificada.

Sintaxe: DATEDIFF( Intervalo, Data1, Data2 [,FirstDayOfWeek[, FirstWeekOfYear]])

Onde:

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 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

Exemplo:

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 Teste = DateDiff("m",#01/01/2001#,#22/06/2001#) ' Teste = 5

Page 81: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

81

DATEPART Categoria: Funções de Data e Hora Finalidade: Retorna a parte especificada de uma determinada data Sintaxe: DATEPART( Intervalo, Data [,FirstDayOfWeek [,FirstWeekOfYear]])

Onde:

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. 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

Exemplo: Calcula a semana atual da data indicada 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)

Onde: Ano - Número entre 100 e 9999 inclusive Mês - Qualquer expressão numérica entre 1 e 12 Dia - Qualquer expressão numérica entre 1 e 31

Exemplo: Retorna a data de 1 de maio de 2001 Teste = DateSerial(2001,5,1) ' Teste = 01/05/2001

DATEVALUE Categoria: Funções de Data e Hora Finalidade: Retorna uma data. Sintaxe: DATEVALUE(Data)

Onde: 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 pode utilizar qualquer expressão que represente data, hora ou ambas.

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

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])

Onde:

Cost - Custo Inicial do bem Salvage - Valor do bem ao final de sua vida útil Life - Vida Útil do bem Period - Período de depreciação Factor - Taxa de declínio do balanço

Exemplo: Teste = DDB(1000, 100, 5,1) ' Teste = 400

Page 82: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

82

DIR Categoria: Funções de Sistema Operacional

Finalidade: Retorna o nome dos arquivos ou diretórios que combinam com o padrão especificado ou atributo de arquivo, ou volume de um drive.

Sintaxe: DIR [(PathName [,Attributes])]

Onde:

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 exibidos. Ajustes: 0 - Normal 2 - Oculto 4 - Sistema 8 - Volume 16 - Diretório

Exemplo:

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 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

Finalidade: Interrompe momentaneamente a execução de seu aplicativo para que o sistema operacional possa processar outros eventos pendentes.

Sintaxe: DOEVENTS()

Exemplo:

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 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.

Page 83: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

83

ENVIRON Categoria: Funções de Sistema Operacional

Finalidade: Retorna o string associado a uma variável de ambiente do sistema operacional (como path e prompt, por exemplo)

Sintaxe: ENVIRON( {EnvString | Número })

Onde: EnvString - Expressão string contendo o nome da variável de ambiente. Número - Expressão numérica correspondente à ordem da variável na tabela de variáveis de ambiente.

Exemplo: Teste = Environ(“PATH”) Teste = Environ(“TEMP”) ' Teste = C:\Windows\TEMP Teste = Environ(“USER”) ' Teste = U00012

ERROR Categoria: Funções de Sistema Operacional

Finalidade: Retorna a mensagem de erro que corresponde a um dado número de erro.

Sintaxe: ERRO [(ErrorNumber)]

Onde:

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 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.

Exemplo: Teste = Error(5) ' Teste = Invalid Procedure Call Teste = Error(6) ' Teste = Overflow Teste = Error(7) ' Teste = Out of Memory

EXP Categoria: Funções Matemáticas

Finalidade: Retorna o valor de e (base de um logaritmo natural) elevado a uma potência qualquer

Sintaxe: EXP (Número)

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

Exemplo: Teste = Exp(1) 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

Finalidade: Retorna a data e hora em que o arquivo foi criado ou modificado pela última vez.

Sintaxe: FILEDATETIME(Pathname)

Onde: 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.

Exemplo: Teste = FileDateTime(“C:\WINDOWS\WIN.COM”) ' Teste = 24/08/95 09:50:00

FIX Categoria: Funções Matemáticas Finalidade: Retorna a parte inteira de um número Sintaxe: FIX (Número)

Onde: Número - Qualquer expressão numérica válida. Se o número contém Null, o valor de retorno será Null também.

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

Page 84: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

84

FORMAT

Categoria: Funções de Data e Hora

Finalidade: Formata uma expressão de acordo com as instruções definidas pelo usuário

Sintaxe: FORMAT (Expressão [,Formato[, FirstDayOfWeek [,FirstWeekOfYear]]])

Onde:

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 "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

Page 85: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

85

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

Exemplo:

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 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]])

Onde:

Rate - Taxa de juros no período Nper - Número total de pagamentos Pmt - Pagamento a ser feito em cada período 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.

Exemplo: ' Quanto obterei se depositar R$100,00 por seis meses a uma taxa de 2% ao mês Teste = FV(0.02,6,-100) ' Teste = 630.81

GETATTR Categoria: Funções de Acesso a Arquivos

Finalidade: Retorna um número que representa os atributos de um arquivo ou diretório.

Sintaxe: GETATTR(Pathname)

Onde:

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: 0 - Normal 1 - Somente-leitura 2 - Oculto 4 - Sistema 16 - Diretório 32 - O arquivo foi alterado após o último backup

Exemplo: Teste = GetAttr(“C:\IO.SYS”) ' Teste = 7 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)

Page 86: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

86

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

Exemplo: Teste = Hex(15) ' Teste = F 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)

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 = Hour(#8:33:17 PM#) ' Teste = 20 IIF

Categoria: Funções de Verificação

Finalidade: Retorna uma de duas partes, dependendo da avaliação de uma expressão.

Sintaxe: IIF (Expressão, TruePart, FalsePart)

Onde:

Expressão - Expressão a ser avaliada TruePart - Valor ou expressão retornada se a expressão avaliada for verdadeira FalsePart - Valor ou expressão retornada se a expressão avaliada for falsa.

Exemplo: intDado = 100 Teste = IIf(intDado>10,"MaiorqueDez","MenorqueDez") ' Teste = “MaiorqueDez”

INPUTBOX Categoria: Funções de Sistema Operacional

Finalidade: Exibe uma caixa de diálogo para que o usuário possa digitar uma resposta qualquer. Após escolher um dos botões disponíveis, o VBA retorna o valor digitado.

Sintaxe: INPUTBOX(Prompt[, Title][,Default][,Xpos][,Ypos])

Onde:

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 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

Page 87: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

87

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])

Onde:

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 String2 - Expressão string que está sendo procurada Compare - Especifica o tipo de comparação a ser efetuado entre as strings.

Exemplo: Teste = InStr("Casa","as") ' Teste = 2 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)

Onde: Número - Qualquer expressão numérica válida. Se número contém Null o valor de retorno será Null também.

Exemplo: Idêntico à função Fix ISARRAY

Categoria: Funções de Verificação

Finalidade: Retorna um valor Boolean indicando se uma determinada variável é um Array.

Sintaxe: ISARRAY(Varname) Onde: Varname - Qualquer variável de memória

Exemplo: Dim MeuArray(2) As Integer, Nome As String Teste = IsArray(Nome) ' Teste = False Teste = IsArray(MeuArray) ' Teste = True

ISDATE Categoria: Funções de Verificação

Finalidade: Retorna um valor Boolean indicando se uma determinada expressão pode ser convertida para uma data.

Sintaxe: ISDATE(Expressão)

Onde: Expressão - Qualquer data ou string que possa ser reconhecida como uma data ou hora válida

Exemplo: dtmDado = "23/06/2001" strMens = "Hoje" Teste = IsDate(dtmDado) ' Teste = True Teste = IsDate(strMens) ' Teste = False

ISEMPTY Categoria: Funções de Verificação

Finalidade: Retorna um valor Boolean indicando se uma determinada variável foi inicializada ou não.

Sintaxe: ISEMPTY(Expressão)

Onde: Expressão - Qualquer expressão numérica ou string que possa ser reconhecida como um nome de variável.

Exemplo: Teste = IsEmpty(dtmDado) ' Teste = True Dado = Null Teste = IsEmpty(dtmDado) ' Teste = False

ISMISSING Categoria: Funções de Verificação

Finalidade: Retorna um valor Boolean indicando se um argumento opcional foi passado para uma procedure ou não.

Sintaxe: ISMISSING(NomeArgumento)

Onde: NomeArgumento - Nome de um argumento opcional em uma procedure. Retorna um valor True se o argumento especificado não foi

Page 88: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

88

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

Exemplo:

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

ISNULL Categoria: Funções de Verificação

Finalidade: Retorna um valor Boolean indicando se uma expressão contém dados inválidos (Null).

Sintaxe: ISNULL(Expressão)

Onde: Expressão - Qualquer valor numérico ou expressão string. Se a expressão avaliada tiver dados inválidos (Null) a função resultará em True, caso contrário o valor retornado será False.

Exemplo:

strDado = "" Teste = IsNull(strDado) ' Teste = False strDado = Null Teste = IsNull(strDado) ' Teste = True

ISNUMERIC Categoria: Funções de Verificação

Finalidade: Retorna um valor Boolean indicando se uma determinada expressão pode ser avaliada como numérica.

Sintaxe: ISNUMERIC(Expressão) Onde: Expressão - Qualquer valor numérico ou expressão string

Exemplo:

intDado = "100" Teste = IsNumeric(intDado) ' Teste = True strDado = "Cem" Teste = IsNumeric(strDado) ' Teste = False

LBOUND Categoria: Funções de Array

Finalidade: Retorna o menor elemento da dimensão especificada de um determinado array.

Sintaxe: LBOUND(Arrayname[, Dimensão])

Onde: Arrayname - Nome da variável array Dimensão - Número que indica que a 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 = 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)

Onde: String - Qualquer expressão string válida. Somente as letras maiúsculas serão convertidas para minúsculas. Os demais caracteres como letras minúsculas, números e sinais permanecem inalterados.

Exemplo: Dado = "CAIXA ALTA" Teste = LCase(Dado) ‘ Teste = "caixa alta"

LEFT Categoria: Funções de Manipulação de Strings

Finalidade: Retorna o número especificado de caracteres a partir do lado esquerdo de uma string.

Sintaxe: LEFT(String, Comprimento) Onde: String - Expressão string da qual os caracteres serão retornados.

Page 89: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

89

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.

Exemplo: Dado = "SENAC Informática" Teste = Left(Dado,1) ' Teste = "S" Teste = Left(Dado,6) ' Teste = "SENAC " Teste = Left(Dado,10) ' Teste = "SENAC Info"

LOADPICTURE Categoria: Funções de Sistema Operacional

Finalidade: Carrega uma imagem dentro de um objeto Form object, Controle PictureBox ou controle Image

Sintaxe: LOADPICTURE([StringExpression])

Onde: StringExpression - Nome do arquivo gráfico a ser carregado. Alguns formatos de arquivo suportados pelo Visual Basic são os seguintes: Bitmap (BMP), Icon (.ICO), e Metafile (.WMF).

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

LOG

Categoria: Funções Matemáticas Finalidade: Calcula o logaritmo natural de um número Sintaxe: LOG(Número)

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

Exemplo: Teste = Log(0) ' Teste = 1 Teste = Log(5) ' Teste = 1.6094379124341

LTRIM Categoria: Funções de Manipulação de Strings

Finalidade: Retorna uma cópia de uma string eliminando os espaços em branco existentes entre o início da string e o primeiro caractere.

Sintaxe: LTRIM(String)

Onde: String - Qualquer expressão string válida. Se a string contém Null, Null é retornado.

Exemplo: Dado = " Casa" 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])

Onde:

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, 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.

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

Page 90: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

90

MINUTE Categoria: Funções de Data e Hora Finalidade: Retorna o número de minutos da hora especificada (de 0 à 59) Sintaxe: MINUTE ( 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 = 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)

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

Exemplo: Teste = Month(#23/06/2001#) ' Teste = 6 MSGBOX

Categoria: Funções de Sistema Operacional

Finalidade: Exibe uma mensagem em uma janela de diálogo e espera que o 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])

Onde:

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 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.

Page 91: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

91

Valores de Retorno 1 - OK 2 - Cancel 3 - Abort 4 - Retry 5 - Ignore 6 - Yes 7 - No

Exemplo:

' Exibe botões OK e Cancel e Ícone de Parada Crítica Teste = MsgBox("Teste",17,"MsgBox") ' 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)

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

Exemplo: Teste = Oct(8) ' Teste = 10 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)

Page 92: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

92

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

Page 93: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

93

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)

Page 94: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

94

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"

Page 95: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

95

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"

Page 96: 120387983 Programando Em Vba

ACCESS 2000 PROGRAMAÇÃO EM VBA SENAC-RS

96

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