Você está na página 1de 151

Microsoft Access Avanado

Microsoft Access Avanado



INDICE


Reproduo proibida

1. INTRODUO.................................................................................................................... 6
1.1. ARQUITETURA DE UMA APLICAO MS ACCESS............................................... 7
EXERCCIOS DE FIXAO INTRODUO............ERRO! INDICADOR NO DEFINIDO.
2. PROGRAMAO NO MS ACCESS ................................................................................ 9
2.1. MACRO X MDULO.......................................................................................................... 9
2.2. MDULOS....................................................................................................................... 11
2.3. QUANDO USAR PROGRAMAO ...................................................................................... 12
2.4. MDULO PADRO........................................................................................................... 13
2.5. MDULO DE CLASSE EM FORMULRIOS E RELATRIOS................................................... 13
2.6. MDULO DE CLASSE ....................................................................................................... 14
2.7. SEO DE DECLARAES................................................................................................ 15
2.8. SEO DE PROCEDIMENTOS ............................................................................................ 15
2.9. O EDITOR DE CDIGO...................................................................................................... 16
2.9.1. Cores de cdigo...................................................................................................... 17
2.9.2. Opes de codificao............................................................................................ 17
2.9.3. Configuraes da janela......................................................................................... 18
2.10. JANELAS DO EDITOR DE CDIGO DO ACCESS................................................................. 18
2.10.1. Janela de Cdigo.................................................................................................. 19
2.10.2. Janela Depurar..................................................................................................... 19
2.10.3. Janela Pesquisador de Objetos ............................................................................ 21
PRTICA 2 PROGRAMAO NO MS ACCESS .......................................................... 23
EXERCCIO 1 Criando um mdulo padro.................................................................. 23
EXERCCIO 2 Criando um mdulo de classe em formulrio....................................... 23
EXERCCIOS DE FIXAO PROGRAMAO NO MS ACCESS .. ERRO! INDICADOR
NO DEFINIDO.
3. PROCEDIMENTOS EM MDULO PADRO............................................................. 24
3.1. COMPILAO DE MDULO .............................................................................................. 26
3.2. TESTE DE EXECUO DE PROCEDIMENTO EM MDULO PADRO...................................... 27
3.3. EXECUO PASSO-A-PASSO............................................................................................ 27
3.4. INSPEO DE VARIVEIS................................................................................................. 28
3.5. PONTO DE INTERRUPO ................................................................................................ 29
3.6. CHAMADA DE PROCEDIMENTOS...................................................................................... 30
3.6.1. Passagem de Argumentos....................................................................................... 31
3.6.2. Retorno de Valor .................................................................................................... 31
3.6.3. Passagem de Argumentos por Valor e por Referncia........................................... 33
PRTICA 3 CRIAO DE MDULO PADRO.......ERRO! INDICADOR NO DEFINIDO.
EXERCCIO 1 Criando um procedimento para clculo de fatorialErro! Indicador no
definido.
EXERCCIOS DE FIXAO CRIAO DE MDULO PADRO.... ERRO! INDICADOR
NO DEFINIDO.
4. MDULO DE CLASSE EM FORMULRIO/RELATRIO...................................... 35
Microsoft Access Avanado

INDICE


Reproduo proibida

4.1. COLEES E OBJETOS DE FORMULRIO/RELATRIO...................................................... 36
4.2. PROPRIEDADES E MTODOS............................................................................................ 38
4.3. COLEO PADRO E PROPRIEDADE PADRO................................................................... 39
4.4. PROPRIEDADES DE COLEO.......................................................................................... 39
4.5. SEES DE FORMULRIO/RELATRIO ............................................................................ 40
4.6. EVENTOS DE FORMULRIO ............................................................................................. 40
EXERCCIOS DE FIXAO MDULO DE CLASSE EM
FORMULRIO/RELATRIO........................................ERRO! INDICADOR NO DEFINIDO.
5. ELEMENTOS DE PROGRAMAO............................................................................ 42
5.1. VARIVEIS.................................................................................................................. 42
5.1.1. Declarao ............................................................................................................. 42
5.1.2. Atribuio de valores variveis........................................................................... 44
5.2. CONSTANTES ............................................................................................................. 45
5.2.1. Constantes Simblicas............................................................................................ 45
5.2.2. Constantes Intrnsecas............................................................................................ 45
5.2.3. Constantes Definidas pelo Sistema......................................................................... 46
5.3. VETORES E MATRIZES ............................................................................................. 47
5.4. TIPOS DEFINIDOS PELO USURIO......................................................................... 48
5.5. ESTRUTURA DE REPETIO................................................................................... 48
5.5.1. For..Next ................................................................................................................. 48
5.5.2. Do..Loop................................................................................................................. 49
5.5.3. While..Wend............................................................................................................ 50
5.5.4. For Each..Next........................................................................................................ 50
5.6. ESTRUTURA CONDICIONAL ................................................................................... 51
5.6.1. If...Then...Else......................................................................................................... 51
5.6.2. Select Case.............................................................................................................. 52
5.7. ENTRADA E SADA DE DADOS ............................................................................... 53
5.7.1. Funes do VBA para entrada e sada................................................................... 54
5.7.2. Outros dispositivos de entrada e sada................................................................... 55
5.8. COMENTRIOS........................................................................................................... 56
5.9. FUNES ..................................................................................................................... 56
5.10. ESCOPO DE IDENTIFICADORES............................................................................ 57
5.11. OBJETO DOCMD......................................................................................................... 58
6. LINGUAGEM SQL............................................................................................................ 59
6.1. EXPRESSO SQL........................................................................................................ 60
6.2. INSTRUES BSICAS SQL..................................................................................... 61
6.2.1. CONSULTA SELEO ................................................................................................... 61
6.2.1.1. Argumento Predicado.......................................................................................... 63
6.2.1.2. Expresses na lista de campos ............................................................................ 65
6.2.1.3. Argumento Expressodetabela............................................................................ 66
6.2.1.4. Tabelas em banco de dados externos .................................................................. 68
6.2.1.5. Clusula Where ................................................................................................... 68
Microsoft Access Avanado

INDICE


Reproduo proibida

7. FORMULRIOS AVANADOS ..................................................................................... 74
7.1. FORMULRIO DE MANUTENO DE TABELAS................................................. 74
7.1.1. Botes de Navegao Personalizados.................................................................... 74
7.2. CAIXA DE DILOGO.................................................................................................. 76
7.2.1. Passagem De Parmetros Para Procedimento...................................................... 77
7.2.2. Passagem De Parmetros Para Consulta Parametrizada..................................... 77
7.2.3. Passagem De Parmetros Para Relatrio ............................................................. 78
7.2.4. Passagem De Parmetros Para Formulrio.......................................................... 81
7.3. FORMULRIO DE CONSULTA................................................................................. 83
7.4. CAIXA DE MENSAGEM............................................................................................. 87
8. ACESSO A BANCO DE DADOS ..................................................................................... 89
8.1. HIERARQUIA DO OBJETOS DAO ..................................................................................... 89
8.2. SINTAXE PARA REFERENCIAR OBJETOS EM COLEO .................................................... 90
8.3. COLEO PADRO.......................................................................................................... 91
8.4. REFERNCIA A OBJETOS POR MEIO DE VARIVEIS.......................................................... 91
8.5. PROPRIEDADES E MTODOS............................................................................................ 91
8.6. ACESSO A BANCO DE DADOS ACCESS ............................................................................ 93
8.7. ACESSO A BANCOS DE DADOS EXTERNOS ...................................................................... 96
8.7.1. Vinculao de Tabelas Externas ............................................................................ 96
8.7.2. Abertura Direta de Tabelas Externas................................................................... 100
9. ACESSO A ARQUIVOS E IMPRESSORA .................................................................. 103
10. TRATAMENTO DE ERRO.......................................................................................... 105
10.1. DESVIO PARA ROTINA DE TRATAMENTO DE ERRO ....................................................... 106
10.1.1. Tratar o erro e terminar o programa................................................................. 106
10.1.2. Tratar o erro e voltar execuo na mesma linha do erro ............................... 106
10.1.3. Tratar o erro e voltar execuo na linha seguinte linha de erro ................. 107
10.1.4. Tratar o erro e desviar a execuo para outro rtulo. ...................................... 107
10.1.5. Prosseguir o programa aps erro ...................................................................... 108
10.1.6. Evento Erro......................................................................................................... 108
10.2. DEPURAO DO PROGRAMA....................................................................................... 109
11. AUTOMAO............................................................................................................... 111
11.1. AUTOMAO COM O MICROSOFT WORD ................................................................... 112
Hierarquia dos Objetos do Microsoft Word .................................................................. 113
11.2. AUTOMAO COM O MICROSOFT EXCEL .................................................................. 113
Hierarquia do Objetos do Microsoft Excel ................................................................... 113
Detalhamento do Objeto Worksheets ............................................................................. 114
Detalhamento do Objeto Charts..................................................................................... 115
Detalhamento do Objeto Chartgroups ........................................................................... 115
11.3. AUTOMAO COM MICROSOFT PROJECT ................................................................... 121
Hierarquia dos Objetos do Microsoft Project ............................................................... 121
Microsoft Access Avanado

INDICE


Reproduo proibida

11.4. AUTOMAO COM SCHEDULE+ ................................................................................. 122
Hierarquia dos Objetos do Schedule.............................................................................. 123
11.5. REFERNCIA BIBLIOTECA DE OBJETOS ...................................................... 123
12. CHAMADA API DO WINDOWS 95 ....................................................................... 126
13. SEGURANA................................................................................................................. 132
13.1. SENHA DE BANCO DE DADOS ............................................................................ 132
13.1.1. DEFININDO UMA SENHA PARA O BANCO DE DADOS ............................. 132
13.1.2. ABRINDO UM BANCO DE DADOS PROTEGIDO POR SENHA.................... 133
13.1.3. REMOVENDO SENHA DE BANCO DE DADOS ............................................. 133
13.1.4. DEFININDO SENHA POR CDIGO VBA........................................................ 133
13.1.5. ABRINDO UM BANCO DE DADOS PROTEGIDO VIA CDIGO VBA.......... 134
13.1.6. ALTERANDO A SENHA VIA CDIGO VBA..................................................... 134
13.2. CRIAO DE ARQUIVO MDE .............................................................................. 135
13.3. CRIPTOGRAFIA DE BANCO DE DADOS............................................................. 137
13.3.1. CRIANDO UM ARQUIVO CRITPTOGRAFADO.............................................. 138
13.3.2. REVERTENDO A CRITPTOGRAFIA................................................................ 138
13.3.2. CRIPTOGRAFIA POR CDIGO VBA............................................................... 138
13.4. SEGURANA EM NVEL DE USURIO............................................................... 138
13.4.1. PROPRIEDADE SOBRE O BANCO DE DADOS E OBJETOS ........................ 139
13.4.2. IMPLEMENTANDO SEGURANA EM NVEL DE USURIO........................ 139
13.4.2. LOGON POR CDIGO VBA............................................................................. 144
13.4.3. TROCA DE SENHA VIA CDIGO VBA............................................................ 144
13.4.4. RETIRAR PEMISSO DE CRIAR NOVOS BANCOS DE DADOS ................... 146
13.4.5. RETIRAR PEMISSO DE CRIAR NOVAS TABELAS E CONSULTAS............. 146
ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE
APLICAES COM PRODUTOS MICROSOFT .......................................................... 147
MICROSOFT ACCESS ..................................................................................................... 148
Hierarquia dos objetos do Access .................................................................................. 148
Tags para objetos da janela de banco de dados do ACCESS ........................................ 148
Tags para objetos controles do ACCESS ....................................................................... 148
Tags para variveis do ACCESS.................................................................................... 149
DATA ACCESS OBJECTS - DAO.................................................................................... 149
Hierarquia dos objetos DAO para Microsoft Jet Workspaces....................................... 149
Hierarquia dos objetos DAO para ODBCDirect Workspaces....................................... 150
Tags para Data Access Objects - DAO.......................................................................... 150
MICROSOFT VISUAL BASIC 5.0 ................................................................................... 151
Tags para controles do Visual Basic.............................................................................. 151
MICROSOFT VISUAL BASIC FOR APPLICATION - VBA.......................................... 151
Tags para variveis do Visual Basic for Application..................................................... 151
Microsoft Access Avanado


6

1. INTRODUO

No MS Access, voc armazena dados em tabelas e recupera informaes por meio de
consultas, de forma interativa diretamente na janela de Banco de Dados. Esta forma de
trabalhar exige do usurio final um alto nvel de conhecimento do MS Access.
Em vez de acessar diretamente as tabelas e consultas, voc pode construir uma
interface com formulrios e relatrios. No curso bsico, voc usa inicialmente os Assistentes
e depois pode construir os formulrios e relatrios manualmente no modo Estrutura. Esta
forma de criar aplicativos atende a problemas simples de cadastramento e recuperao de
dados e exige que o usurio final tenha apena um conhecimento superficial do MS Access.
Com o tempo, voc sente necessidade de o aplicativo dar maior controle no tratamento
dos dados e que a interface seja mais segura e simples de usar, no exigindo que o usurio
final tenha de saber o MS Access para operar o aplicativo. Torna-se necessrio ento
desenvolver aplicaes usando programao dentro do MS Access.
Este curso ensinar a programao do MS Access , utilizando a linguagem Visual
Basic for Application VBA, para que voc desenvolva aplicativos completos no MS Access.
A Microsoft dispe de trs edies da linguagem Visual Basic:
Visual Basic - VB
Visual Basic for Application VBA
Visual Basic Scripting VBScript

A primeira a linguagem completa, feita para desenvolver aplicativos profissionais.
Ela gera um programa executvel que pode ser instalado em qualquer PC com Windows, sem
a necessidade de o Visual Basic estar instalado. Alguns dos recursos que s existem no VB
a possibilidade de desenvolver aplicativos cliente/servidor que acessa bancos de dados
relacionais, como o Microsoft SQL Server ou Oracle, e a criao de componentes ActiveX,
atualmente chamados de componentes COM (Component Object Model). A linguagem
Visual Basic suportada no software Microsoft Visual Basic.
O VBA possui alguns recursos a menos que o VB, mas a sintaxe idntica. O VBA
uma linguagem embutida nos aplicativos Microsoft Office (exceto o Outlook) e no Microsoft
Project 98. No possvel gerar um programa executvel. Ela uma linguagem interpretada
que depende do Microsoft Office instalado ou o Microsoft Project 98.
A linguagem Visual Basic o recurso que integra as melhores caractersticas de cada
aplicativo do MS Office. Por meio de programao, VB, VBA ou VBScript, possvel
construir uma interface nica em um nico aplicativo, como por exemplo o Access, e acessar
todos os recursos especializados dos demais integrantes do pacote Office ou mesmo do Back
Office. Esta tcnica conhecida como Automao, que veremos neste curso.
O VBScript a verso mais simples do Visual Basic usado principalmente na
confeco de pginas WEB. Ele suportado nos seguintes produtos:
MS Outlook
MS SQL Server
Windows Scripting Host
MS Internet Explorer 3 ou superior

Microsoft Access Avanado


7
Vrios softwares no Microsoft tambm suportam o VBScript para automatizar tarefas.

1.1. ARQUITETURA DE UMA APLICAO MS ACCESS
Um banco de dados MS Access um conjunto de componentes do tipo Tabela,
Consulta, Formulrio, Relatrio, Macro e Mdulo. A tendncia natural ao se desenvolver uma
aplicao no MS Access criar todos os componentes em um s banco de dados, ou seja, ter
um nico arquivo .MDB.
O fato de ter tudo em um conveniente, pois voc instala apenas um arquivo no
computador e pode transport-lo facilmente para qualquer outro computador, sem se
preocupar em que disco ou pasta ele ser gravado.
Aplicaes profissionais, entretanto, no possuem esta arquitetura tudo-em-um. Um
sistema de informao composto por dois pilares bsicos: os dados e os processos.
Mesmo na era do CA-Clipper havia distintamente dois tipos de arquivos: o executvel
(.EXE) representanto os processos e os arquivos de dados de extenso .DBF. Neste caso,
ambos fazem parte de um mesmo software e atendem a um mesmo padro, o xBase.
Com a evoluo da informtica, processos e dados tiveram softwares e padres
distintos. Voc pode escrever seus processos (programar) em um software e armazenar os
dados em outro formato, gerenciado por outro software. Um exemplo disto o MS Visual
Basic e o MS SQL Server. O programa escrito e compilado no MS Visual Basic enquanto os
dados podem ficar armazenados no e ser gerenciados pelo MS SQL Server. Atualmente, voc
pode ter vrios fornecedores diferentes para criar processos e armazenar dados. Voc pode
escrever programas no MS Visual Basic ou Delphi e utilizar gerenciadores de banco de dados
como MS SQL Server, Oracle, Interbase ou MS Access.
Apesar de o MS Access se tudo-em-um, recomendvel separar dados de processos.
Voc deve criar a aplicao um arquivo .MDB com consultas, formulrios, relatrios, macros
e mdulos e ter outro (ou outros) arquivos somente com tabelas. Por que isto?
Os dados so a parte mais estvel de uma aplicao. Voc pode ter um processo em
que os descontos variem de acordo com a poltica da empresa ou a poca do ano, mas os
dados tero uma estrutura mais perene. No difcil encontrar empresas com cadastro de
clientes de anos atrs, mas que j tiveram vrias formas de processar faturas, descontos e
promoes. Mudar processos no causa grande impacto na aplicao, mas quando se altera a
estrutura dos dados o trabalho colossal, porque a alterao na estrutura deve preservar os
dados e h a necessidade de se revisar e alterar os programas que acessam estes dados. Um
bom exemplo o que aconteceu com o chamado Bug do Ano 2000. O problema,
aparentemente simples, era acrescentar dois dgitos no ano, mas a soluo demandou muito
tempo e dinheiro, envolvendo o mundo inteiro e no somente sistemas de computador.
Alm do mais, os dados normalmente so corporativos mas ficam agrupados por rea
funcional. H dados da rea de pessoal, da rea de transporte, da rea de engenharia, etc.
comum estes dados ficarem fisicamente distribudos vrios computadores e em formatos
distintos.
Portanto, uma aplicao em Access deve considerar que os dados esto distribudos e
em formatos distintos. Mesmo que seja uma aplicao simples, uma boa prtica separar
dados de processos.
Microsoft Access Avanado


8
O MS Access pode acessar dados em formatos dBase, texto, Excel, Paradox, FoxPro e
HTML via ISAM Indexed Sequential Access Method e bancos de dados SQL Server,
Oracle e outros via ODBC Open Database Connectivity. Para tanto, voc deve ter instalado
os drivers apropriados no computador onde a aplicao rodar.

Como dados esto separados, o MS Access prov formas de acess-lo:
Vinculao de tabela
Consulta de passagem (pass-through)
Expresso SQL com a clusula IN.
Programao com DAO
Programao com ODBC-API
Programao com objetos de acesso a dados, como o RDO e ADO.

No modo interativo voc vincula tabelas pelo menu Arquivo|Obter dados
externos|Vincular tabela. Esta a forma mais simples de se trabalhar, pois tudo funciona
como se as tabelas estivessem no mesmo banco de dados e voc pode acessar qualquer
formato suportado pelos drivers ISAM ou ODBC instalados no seu computador. possvel
abrir tabelas vinculadas normalmente e criar consultas, formulrio e relatrios baseados em
tabelas vinculadas. Voc ver neste curso como vincular tabelas via programao do DAO.
A consulta de passagem usada para obter dados provenientes de bancos de dados
como o SQL Server. O Access interage diretamente com o servidor SQL Server, sem utilizar
ODBC nem o mecanismo Jet. Este tipo de consulta no pode ser usada como origem de
registro de formulrio e relatrio.
Expresses SQL com clusula IN se aplica criar consultas ou expresses SQL que
acessam tabelas externas em formato Access, dBase, Excel, Parados, e outros formatos
ISAM. No pode ser usada como origem de registro de formulrio e relatrio.
O DAO Data Access Object um objeto de acesso a dados utilizado na programao
do MS Acccess e suportado tambm pelo MS Visual Basic. Veremos neste curso a sua
programao.
A programao ODBC-API, como o nome sugere, s possvel acessar dados em
servidor de banco de dados por meio de programao em mdulo. Neste tipo de programao,
o Access despreza o seu mecanismo de acesso a dados, o Jet Engine, e interage diretamente
com o gerenciador ODBC. Este assunto no faz parte deste curso.
Programar diretamente via ODBC-API trabalhoso. O RDO Remote Data Object
uma camada entre o Access e o ODBC-API que torna a compreenso dos comandos mais
fcil. Este curso no tratar deste assunto.
ODBC-API e RDO so tecnologias em desuso. A ltima palavra em acesso a dados
o ADO- ActiveX Data Object, da Microsoft. Ele pode acessar vrios formatos de dados,
desde que voc tenha um OLE-DB Provider. O MS Access suporta o ADO via programao
em mdulo, desde que voc tenha este objeto instalado no seu computador o o OLE-DB
Provider apropriado para o formato desejado. A vantagem que o ADO acessa diretamente a
fonte de dados, sem passar pelo mecanismo Jet nem por gerenciador ODBC. No veremos o
ADO neste curso.
Microsoft Access Avanado


9
2. PROGRAMAO NO MS ACCESS
2.1. Macro x Mdulo
No MS Access, o termo macro designa aes pr-definidas dispostas sequencialmente.
Para no-programadores, as macros podem ser usadas para operaes simples, como abrir um
formulrio ou relatrio, executar uma consulta ou acionar um item de menu.
A chamada de macros por botes de comando em formulrios e menus fornece ao
aplicativo uma interface com certo grau de controle de navegao pelas telas e automao.
Isto tambm restringe o acesso do usurio a recursos crticos do MS Access, tal como alterar
a estrutura de uma tabela, e no exige do usurio um alto nvel de conhecimento sobre o MS
Access.
Voc pode criar botes de comando em formulrios e associar macros que realizam
aes pr-definidas. Por exemplo, o boto de comando cuja legenda Cadastrar Livros
invoca a macro Macro1. Na Macro1 existe uma ao AbrirFormulrio que abre o
formulrio chamado frmCadastra_Livros.


A estrutura do formulrio mostra que o evento do boto cmdCadastraLivros invoca a
macro Macro1 atravs do evento Ao clicar.
Microsoft Access Avanado


10


A manuteno de aplicativos baseados em macros difcil, pois existem objetos
distintos: o formulrio e a macro. Para cada controle que possui evento associado haveria a
necessidade de uma macro. A quantidade de objetos para gerenciar tornaria difcil a
compreenso do fluxo de execuo.
Alm disso, as macros no oferecem um bom controle de fluxo, pois no possuem
estruturas de controle sofisticados como If..Then..Else e estruturas de repetio como Do
While.
A construo de aplicativos usando programao reduz a complexidade do fluxo
porque a ao codificada na prpria estrutura do formulrio. Os eventos de cada controle
apontam para procedimentos escritos em um linguagem de programao poderosa o Visual
Basic for Application que permite a criao de rotinas complexas e estruturadas.
No exemplo a seguir, os dois controles invocam os procedimentos de evento
cmdConsultaAutores_Click e cmdCadastraLivros_Click. Estes controles so botes de
comando, cujas propriedades Ao clicar apontam para o cdigo que se encontra na prpria
estrutura do formulrio.
Microsoft Access Avanado


11


A programao no MS Access torna o uso de macros obsoleta, pois tudo que as
macros fazem a programao consegue fazer com maior grau de controle sobre o fluxo de
execuo. Portanto, no faz sentido neste curso ensinar como se constri macros.
2.2. Mdulos
A programao no MS Access feita nos mdulos.
Um mdulo uma coleo de declaraes e procedimentos armazenados
conjuntamente, formando uma unidade. As declaraes so instrues que direcionam o
comportamento dos procedimentos em todo um mdulo.Um procedimento uma unidade de
cdigo VBA que realiza uma operao especfica. Por exemplo, o clculo dos dgito
verificador do CPF um procedimento e o clculo do fatorial de um nmero outro.
Os mdulos podem estar alojados em trs lugares:
Na guia Mdulos da janela de Banco de Dados do MS Access. Nela existem dois tipos de
mdulos: mdulo padro e mdulo de classe.
Embutido em um formulrio do Access. Contm mdulo de classe.
Embutido em um relatrio do Access. Contm mdulo de classe.

Cada mdulo na guia Mdulos recebe um nome nico dentro do aplicativo (no
mesmo arquivo .mdb). O nome deve seguir uma regra de nomenclatura:
Pode conter at 64 caracteres, entre letras e nmeros
Aceita espaos e caracteres especiais, exceto ponto, exclamao, acento grave, colchetes e
caracteres de controle (cdigo ASCII de 0 a 31).
Aceita letras maisculas e minsculas indistintamente.
No pode conter espaos no incio do nome

Microsoft Access Avanado


12
recomendvel no usar espaos nem caracteres especiais e evitar nomes muito
longos. O Anexo A sugere uma conveno de nomes a ser adotada no desenvolvimento de
aplicativos com produtos Microsoft.
Os mdulos de classe em formulrios e relatrios no recebem nomes, pois so
gravados juntamente com o formulrio ou relatrio aos quais esto relacionados.
O cdigo de um mdulo composto por:
Instrues, funes e palavras-chave do VBA
Nomes de variveis, constantes ou procedimentos fornecidos pelo desenvolvedor
Instrues e clusulas da linguagem SQL
Propriedades e mtodos de objetos

As instrues, funes, palavras-chave, clusulas, propriedades e mtodos so
palavras reservadas, ou seja, voc no as pode usar como nome de procedimento ou nome de
varivel ou constante.
2.3. Quando usar programao
No MS Access, usa-se programao em VBA:
Para efetuar um processamento complexo, que no pode ser atendido com a utilizao de
consultas, nem macros. Exemplo: O clculo de faturamento exige ler todos os servios
prestados em um perodo, computar para, cada fatura, os descontos, multas, juros,
impostos e taxas.

Para criar funes definidas pelo usurio UDF (User Defined Functions), por exemplo,
o clculo dos dgitos verificadores do CGC.

Para percorrer um registro de cada vez. As consultas de seleo e de refer6encia cruzada
retornam um conjunto de registros de uma vez s, mas s vezes necessrio processar
cada registro, seja de uma tabela ou de uma consulta.

Sempre que se necessitar de usar estruturas de repetio e condio complexa (do tipo Do
While e If...Then...Else).

Para substituir macros por cdigo VBA equivalente. As macros ficam armazenadas em
pastas de macro (a quinta guia da janela Banco de Dados), mas podem ser chamadas de
qualquer parte do Access. s vezes pode ficar difcil entender o emaranhado de chamadas
a elas. Os mdulos, por formarem uma unidade, so mais compreensveis, podendo ainda
ser impressas. Assim, o aplicativo pode ser construdo de forma modular e concisa,
melhorando assim a sua legibilidade e documentao.

Para manipular objetos de outros softwares, como o Word e Excel, atravs da automao.

Para realizar operaes de DDE (troca dinmica de dados), como por exemplo ler uma
tela do Plenus (um emulador de terminal Unisys TB-27).

Para efetuar transaes com COMMIT e ROLLBACK.

Microsoft Access Avanado


13
2.4. Mdulo padro
Usa-se cdigo em mdulo padro para criar procedimentos globais, isto , aqueles que
sero usados por todo o aplicativo. Por exemplo, uma funo para transformar um nmero em
extenso pode ser chamada em qualquer do aplicativo..
Os procedimentos armazenados em Mdulo Padro so do tipo Function (aquele que
retorna um valor, por exemplo o fatorial de um nmero) ou Sub (aquele que no retorna
valor, por exemplo, uma rotina para tratar e imprimir mensagens de erro na tela).
Uma janela de cdigo em mdulo padro possui as caractersticas mostradas abaixo.



2.5. Mdulo de classe em formulrios e relatrios
Os mdulos embutidos em formulrio e relatrios so do tipo Mdulo de Classe. So
mdulos que residem na estrutura dos formulrios e relatrios, assim como os objetos de
controle. Por ficarem atrs dos formulrios e relatrios, so tambm chamados de code
behind form. Os mdulos de classe em formulrio e relatrio contm procedimentos de
evento, que respondem a eventos de formulrio, relatrio ou controle neles inseridos. Os
procedimentos de evento em mdulo de formulrio respondem a eventos (tais como o clicar
do mouse) do prprio formulrio, de suas sees (cabealho, detalhe, rodap) e dos controles.
Os procedimentos de evento em mdulo de relatrio respondem a eventos do prprio relatrio
e de suas sees somente.
Se se deseja que um evento em um formulrio ou relatrio acione um procedimento
Function ou Sub de um mdulo padro, preciso que o procedimento de evento dentro do
mdulo de formulrio/relatrio faa a chamada. O cdigo abaixo um procedimento de
evento ligado ao controle cmdOkButton que chama um procedimento Sub armazenado em
mdulo padro.
Microsoft Access Avanado


14

Private Sub cmdOkButton_Click()
CalculaRateio()
End Sub

Uma janela de cdigo em mdulo de classe embutido em formulrio/relatrio tem as
caractersticas mostradas abaixo.

O mdulo de classe em formulrio ou de relatrio tambm pode conter procedimentos
Sub ou Function.
2.6. Mdulo de classe
O mdulo de classe criado na guia Mdulos da janela de Banco de Dados do Access
tem como objetivo implementar as classes de objetos definidas pelo desenvolvedor,
permitindo uma certa reusabilidade de cdigo. Os formulrios e relatrios so classes de
objetos pr-definidos, que possuem seus prprios mtodos e propriedades. Ao construir um
mdulo de classe na janela de mdulo, voc cria uma nova classe de objetos.
Os procedimentos Sub e Function tornam-se os mtodos do novo objeto e os
procedimentos Property Let, Property Get e Property Set tornam-se as propriedades do
objeto.
A programao de classes de objetos mais efetiva no Visual Basic, pois voc pode
construir um objeto totalmente encapsulado em um arquivo DLL, EXE ou OCX e pode us-lo
em qualquer outra linguagem que suporte a arquitetura COM (Componente Object Model).
Microsoft Access Avanado


15

2.7. Seo de declaraes
A janela de cdigo de mdulo, seja padro ou de classe, possui a seo de
declaraes e a seo de procedimentos.
Na seo de declaraes encontram-se as instrues de escopo de mdulo, ou sejam,
as instrues da seo de declaraes afetam todos os procedimentos daquele mdulo. As
variveis declaradas nesta seo tambm so de nvel de mdulo, o que quer dizer que todos
os procedimentos do mdulo podem acessar e alterar o contedo destas variveis.
Por padro, a seo de declarao de mdulo no Access vem com as instrues
Option Compare Database e Option Explicit.
A instruo Option Compare define a ordem em que os caracteres so comparados.
Se Option Compare no for definido, o padro Option Compare Binary, que define a
ordem de classificao de acordo com a pgina de cdigo utilizado no Windows.
Tipicamente, comparao binria segue a seqncia:
A < B < E < Z < a < b < e < z < < < < < <

Com a opo Database, a comparao segue o que estiver definido nas opes do
Access (menu Ferramentas|Opes..., guia Geral, na caixa Nova Ordem de classificao do
banco de dados).
A instruo Option Explicit obriga que todas as variveis sejam declaradas
explicitamente, ou seja, usando as instrues de declarao de variveis (Dim, Redim,
Private, Public ou Static). altamente recomendvel que as variveis sejam declaradas
explicitamente para que no haja conflitos de nomes de variveis.
2.8. Seo de procedimentos
Na seo de procedimentos voc escreve seus procedimentos. Os procedimentos de
um mdulo padro pode ser do tipo Sub ou Function, ou procedimentos de evento (no caso
de mdulo de classe de formulrio e relatrio) ou procedimentos Property Let, Property Get
e Property Set (no caso de mdulo de classe).
Microsoft Access Avanado


16
Todo procedimento deve ter um nome nico em todo aplicativo e seguir as regras de
nomenclatura:
Podem ter at 255 caracteres.
Precisam comear com uma letra.
Podem incluir letras, nmeros ou caracteres sublinhados (_).
No podem incluir caracteres de pontuao ou espaos.
No podem ser uma palavra reservada do Visual Basic.
Podem ser escritos com letras maisculas ou minsculas,sem distino.

Os procedimentos Sub comeam com a instruo Sub, seguido do nome do
procedimento, e terminam com End Sub. Entre Sub e End Sub fica o cdigo que realizar a
operao desejada. O procedimento Function comeam com a instruo Function, seguida no
nome do procedimento, e termina com End Function.
Os procedimentos de um mdulo de classe de formulrios e relatrios podem ser do
tipo Sub ou Function, mas o usual que contenham procedimentos de evento.
2.9. O editor de cdigo
A digitao do cdigo em VBA feita no prprio MS Access, na janela de cdigo de
um mdulo (seja mdulo padro, mdulo de classe ou mdulo de classe de
formulrio/relatrio). Para facilitar a edio e visualizao do cdigo, o editor de cdigo
possui opes configurveis, na qual pode-se escolher cores, fontes, tabulao e outros
recursos.


Figura 1: Opes do editor de cdigo do Access
Microsoft Access Avanado


17
2.9.1. Cores de cdigo
Por padro, todo o texto do cdigo escrito usando a fonte Courier New tamanho 10.
A cor depende do tipo do texto. A cor definida para o primeiro plano, para o segundo plano
e para o indicador de margem. Indicador margem um cone que aparece na margem
esquerda (margin indicator) do cdigo, que serve para fornecer dicas visuais durante a
edio ou execuo do cdigo.
Os valores padro para as opes de Caixa de texto, primeiro plano, segundo plano e
indicador so:
rea de texto 1
o
plano 2 plano Indicador
Texto normal Preta Branca
Texto de seleo Preta Azul
Texto de erro de sintaxe Vermelha Branca
Texto de ponto de execuo Preta Amarela Amarela
Texto de ponto de interrupo Branca Marron Marron
Texto de comentrio Verde Branca
Texto de palavra-chave Azul Branca
Texto de identificador Preta Branca
Texto de indicador Preta Branca Azul claro
Texto de retorno de chamada Preta Branca Verde claro

Para cada valor de rea de texto voc pode especificar o tipo de fonte e o tamanho nas
caixas Fonte e Tamanho.
Os cones de indicadores de margem so:
cone Nome do Indicador
de margem
Descrio

Ponto de interrupo Indica que voc definiu um ponto de interrupo usando o
comando Ativar/desativar ponto de interrupo no menu
Depurar. Voc pode ativar/desativar o ponto de interrupo
colocando o ponteiro do mouse na regio do indicador de
margem e clicando nele.

Linha de execuo
atual
Indica a linha de cdigo que ser executada a seguir. Voc
pode arrastar esse indicador de margem para um novo local
dentro de qualquer mdulo de cdigo em execuo. Caso
arraste o indicador de margem da Linha de execuo atual
para uma linha ou regio invlida, nada acontecer e o
indicador retornar para o local original.

Indicador Indica o local de um indicador definido usando o comando
Alternar indicador no menu Editar.

Marcador de Pilha de
chamadas
Indica as linhas que esto atualmente na pilha de chamadas. O
indicador Marcador de pilha de chamadas aparece apenas no
modo de interrupo.

2.9.2. Opes de codificao
Autorecuar Permite que voc tabule at a primeira linha de cdigo; todas as linhas
subseqentes iniciaro nesse local da guia.
Microsoft Access Avanado


18
Verificao de sintaxe automtica Determina se o Visual Basic deve verificar
automaticamente a sintaxe correta depois que voc inserir uma linha de cdigo.
Solicitar declarao de varivel Determina se declaraes de varivel explcitas so
exigidas nos mdulos. Esta seleo adiciona a instruo Option Explicit s declaraes
gerais de todo mdulo novo.
Compilar ao ser solicitado Determina se um projeto est totalmente compilado antes
que ele seja iniciado ou se o cdigo est compilado conforme o necessrio, permitindo
que o aplicativo inicie logo.
Listar membros automaticamente Exibe uma lista que contm informaes que
concluiriam logicamente a instruo no ponto de insero atual. Exemplo.

Informao rpida automtica Exibe informaes sobre funes e seus parmetros
medida que voc digita. Exemplo:

Dicas de dados automticas Exibe o valor da varivel sobre a qual o seu cursor est
posicionado. Disponvel somente no modo de interrupo. Exemplo:

Largura da tabulao Define a largura da guia, que pode variar de 1 a 32 espaos; o
padro 4 espaos.

2.9.3. Configuraes da janela
Visualizar mdulo completo Define o estado padro dos novos mdulos para permitir
que voc observe os procedimentos na janela Cdigo como uma lista rolvel simples ou
somente um procedimento de cada vez. No altera o modo de exibio dos mdulos
atualmente abertos.
Separador de procedimento Permite que voc exiba ou oculte as barras separadoras que
aparecem no fim de cada procedimento na janela Cdigo.
Arrastar-e-soltar edio de texto Permite que voc arraste e solte elementos dentro do
cdigo atual e da janela Cdigo para as janelas Imediata ou Inspeo de variveis.
Janela depurar visvel Mantm a janela Depurar aberta.
Barra do indicador de margem Exibe a margem de indicador.

2.10. Janelas do editor de cdigo do Access
A parte de programao do MS Access possui apenas trs janelas:
Janela de Cdigo
Janela Depurar
Janela do Pesquisador de Objetos.
Microsoft Access Avanado


19

2.10.1. Janela de Cdigo
A janela de cdigo contm as sees de declarao e a seo de procedimentos e
onde se digita o cdigo.

A janela de cdigo aberta nas seguintes situaes:
Na guia Mdulos da janela de Banco de Dados clique em Novo para criar um nvo mdulo
ou em Estrutura para abrir um mdulo existente.
Na estrutura de formulrio ou relatrio, acione o menu Exibir|Cdigo, ou clique no cone
da barra de ferramentas, ou acione o construtor de cdigo nas propriedades do objeto.

2.10.2. Janela Depurar
A janela Depurar consiste de trs painis: Imediato, Locais e Inspecionar. Para
visualizar a janela Depurar, abra um mdulo e clique no cone na barra de ferramentas.
Voc tambm pode abrir a janela Depurar acionando o menu Exibir| Janela Depurar. Voc
pode tambm pressionar Ctrl-G a qualquer momento dentro do Access.

Microsoft Access Avanado


20


Voc pode alternar entre o painel Locais e o painel Inspecionar clicando na guia
Locais ou na guia Inspecionar da janela Depurar. O painel Imediato permanece visvel,
independentemente de qual guia clicada.

2.10.2.1. O Painel Locais
O painel Locais exibe uma lista de variveis em trs colunas: Expresso, Valor e Tipo.
Algumas variveis, como tipos definidos por usurios, matrizes e objetos, podem conter
informaes hierrquicas. Estas variveis tm um boto para expandir/reduzir esquerda dos
nomes de varivel para controlar a exibio de informaes hierrquicas. Quando o painel
Locais est visvel, ele atualizado automaticamente quando o modo de execuo muda do
modo de execuo para o modo interrupo. Isto acontece quando a execuo atinge um
ponto de interrupo ou quando voc comea a depurar o cdigo.
A primeira varivel da lista uma varivel especial de mdulo. Para um mdulo
classe, esta a varivel Me definida pelo sistema. Esta uma referncia de objeto instncia
atual da classe definida pelo mdulo atual. J que esta varivel uma referncia de objeto, ela
pode ser expandida para mostrar todas as propriedades e os membros de dados da instncia de
classe atual. Para mdulos padres, a primeira varivel o nome do mdulo atual e tambm
pode ser expandida para exibir todas as variveis no nvel de mdulo no mdulo atual. Voc
pode alterar o valor de uma varivel do painel Locais, mas no pode alterar suas definies de
Expresso ou Tipo.

2.10.2.2. O Painel Inspecionar
O painel Inspecionar permite que voc visualize o valor de uma expresso ou uma
varivel enquanto o cdigo estiver em execuo. Para definir uma expresso de inspeo,
clique no menu Depurar|Adicionar inspeo de variveis. O painel Inspecionar proporciona
as seguintes capacidades:
Microsoft Access Avanado


21
Expandir/reduzir informaes hierrquicas.
Redimensionar cabealhos de coluna.
Editar valores in loco.

2.10.2.3. O Painel Imediato
No painel Imediato, voc pode:
Executar qualquer procedimento Sub ou Function, inclusive procedimentos de evento.
Executar uma expresso qualquer, inclusive usando variveis do procedimento em
execuo.
Visualizar a sada de valores enviados pelo mtodo Print do objeto Debug.

Para executar um procedimento definido dentro de um mdulo classe a partir do
painel Imediato, voc precisa qualificar o procedimento com o nome do mdulo classe, a
menos que voc esteja no modo de interrupo dentro daquele mdulo. Se voc estiver no
modo interrupo, no necessrio qualificar o procedimento pois esse mdulo est
atualmente no escopo.
O exemplo seguinte, quando digitado no painel Imediato da janela Depurar, executa
um procedimento ListarNomes que est definido no mdulo classe associado a um formulrio
Funcionrios:
Form_Funcionrios.ListarNomes

O prximo exemplo executa o procedimento do evento Click para um boto de
comando chamado InformaesPessoais em um formulrio Funcionrios:
Form_Funcionrios.InformaesPessoais_Click

Para executar uma expresso, use o sinal ? seguido da expresso desejada. Por
exemplo, o comando abaixo ir calcular o nmero inteiro de uma diviso.
? Int(345/7)

2.10.2.4. Outros Recursos da Janela Depurar
A nova janela Depurar proporciona automaticamente informaes de status sobre seu
cdigo. Quando nenhum cdigo est sendo executado, a barra de status no topo da janela
Depurar mostra "<Pronto>". Uma vez iniciada a execuo do cdigo, a barra de status mostra
o nome do banco de dados atual, o mdulo no qual reside o procedimento em execuo, e o
nome do prprio procedimento.
Voc tambm pode visualizar a janela Chamadas a partir da janela Depurar clicando
no boto Construir .
2.10.3. Janela Pesquisador de Objetos

A janela Pesquisador de Objetos aberta pelo menu Exibir|Pesquisador de Objetos
ou pela tecla F2.
O Pesquisador de Objetos uma caixa de dilogo que exibe informaes sobre
objetos, propriedades, mtodos e constantes do banco de dados atual e em bibliotecas de
objetos referenciados. Voc pode utilizar o Pesquisador de Objeto para pesquisar um
Microsoft Access Avanado


22
elemento especfico, visualizar suas definies, obter ajuda sobre ele ou col-lo em um
mdulo.


* * * * *
Microsoft Access Avanado


23
PRTICA 2 PROGRAMAO NO MS ACCESS
EXERCCIO 1 Criando um mdulo padro

Crie um mdulo basDemonstracao contendo o procedimento Welcome.

1. Abra o MS Access .
2. Crie um banco de dados vazio chamado dbWelcome.mdb.
3. Selecione a guia Mdulos na janela de Banco de Dados.
4. Clique em Novo.
5. Digite o seguinte procedimento:

Sub Welcome()
MsgBox "Bem-vindo ao curso MS Access Avanado", vbOKOnly, "teste"
End Sub

Perceba como o Access diferencia cores para instrues e texto de usurio e como o editor de
cdigo fornece dicas da sintaxe da instruo MsgBox.

6. Clique no menu Arquivo|Salvar.
7. Informe o nome basDemonstracao e clique OK..
8. Posisione o cursor em qualquer parte do cdigo.
9. Tecle F5. Ser mostrada uma caixa de mensagem chamada Teste com o texto "Bem-vindo
ao curso MS Access Avanado"
10. Clique no boto OK da caixa de mensagem.
11. Feche a janela de mdulo e veja o nome do mdulo basDemonstracao gravado na guia
Mdulos da janela de Banco de Dados.

EXERCCIO 2 Criando um mdulo de classe em formulrio
Crie um formulrio chamado frmDemonstracao.

1. Clique na guia Formulrios da janela de Banco de Dados.
2. Clique em Novo.
3. Escolha Modo estrutura e clique em OK.
4. Desligue o Assistentes de controle da barra de ferramentas Caixa de ferramentas.
5. Crie um boto de comando.
6. Abra as propriedades do boto de controle e selecione a guia Todas.
7. Atribua as seguintes propriedades:

Nome: cmdOK
Legenda: &Ok
Ao clicar: [Procedimento de Evento]

8. Clique no boto do construtor de cdigo em frente propriedade Ao clicar. Ser
aberta a janela de mdulo de classe.
9. Digite o cdigo a seguir:

Private Sub cmdOk_Click()
Microsoft Access Avanado


24

MsgBox "Isto um procedimento de evento do controle cmdOk"
End Sub

10. Feche a janela de mdulo.
11. Salve o formulrio como frmDemonstracao.
12. Alterne para o Modo Formulrio.
13. Clique no controle Ok. Surgir uma caixa de mensagem com o texto "Isto um
procedimento de evento do controle cmdOk"
14. Feche o formulrio.

3. PROCEDIMENTOS EM MDULO PADRO

Procedimento uma unidade de cdigo VBA que contm instrues e mtodos
sequencia e logicamente ordenados que ao final de algum tempo de execuo realizar uma
tarefa especfica, previamente planejada no algoritmo.
Por exemplo, podemos querer determinar as razes de uma equao do segundo grau
por meio de um procedimento. Ao final, podemos ter como resultado um valor, dois valores
ou nenhum.
A equao do 2 grau possui a forma geral: ax
2
+ bx + c = 0
A resoluo do problema consiste em receber trs valores da equao do 2 grau,
normalmente chamados de a, b e c e determinar os valores de x. Os valores de x so
determinados pela frmula de bskara, que consiste em:
2a
4 b b
2
ac
x

=

O algorimo para implementar a frmula de Bskara :
Algoritmo Baskara
Declare a, b, c, Delta, x1, x2 numrico
Leia a
Leia b
Leia c
{Calcule Delta}
Delta b
2
4 x a x c
Se Delta = 0 ento
x1 -b 2 x a
Escreva x1
SenoSe Delta > 0 ento
x1 (-b + Delta ) (2 x a)
x2 (-b - Delta ) (2 x a)
Escreva x1
Escreva x2
Seno
Escreva "No h soluo"
Fim Se
Fim algoritmo



Microsoft Access Avanado


25

Este algoritmo tem uma finalidade geral e portanto adequado usar mdulo padro.
Mdulos padro so criados na guia Mdulos da janela de Banco de Dados. Selecione a guia
Mdulos na janela de Banco de Dados e clique no boto Novo. aberta uma janela de cdigo
para criao de procedimentos em mdulo padro.
Cada mdulo pode conter um ou mais procedimentos do tipo Sub (procedimento sem
retorno de valor, ou simplesmente procedimento) e Function (procedimento com retorno de
valor, ou simplesmente, funo).
Abaixo da seo de declaraes, digite a palavra reservada Sub ou Function seguido
do nome do procedimento.
Aps teclar Enter, uma seo de procedimento ser criada, iniciando com a declarao
do procedimento e terminando com a palavra reservada End Sub ou End Function.
Option Compare Database
Option Explicit

Sub MeuProcedimento()
[ instrues ]
End Sub

Function MinhaFuncao()
[ instrues ]
End Function

Na rea entre a declarao do procedimento e o seu fim voc deve digitar o seu cdigo
VBA. Comece sempre com a declarao das variveis e constantes que sero utilizados pelo
seu cdigo.
Criemos um primeiro cdigo para implementar o algoritmo de Bskara.
Sub Baskara()
Dim sngA As Single
Dim sngB As Single
Dim sngC As Single
Dim dblDelta As Double
Dim sngX1 As Single
Dim sngX2 As Single

sngA = InputBox("Valor de A")
sngB = InputBox("Valor de B")
sngC = InputBox("Valor de C")
' Clculo de Delta
dblDelta = sngB ^ 2 - 4 * sngA * sngC
If dblDelta = 0 Then
sngX1 = -sngB / (2 * sngA)
MsgBox sngX1
ElseIf dblDelta > 0 Then
sngX1 = (-sngB + Sqr(dblDelta)) / (2 * sngA)
sngX1 = (-sngB - Sqr(dblDelta)) / (2 * sngA)
MsgBox sngX1
MsgBox sngX2
Else
MsgBox "No h soluo"
End If
End Sub
Microsoft Access Avanado


26

Os parnteses aps o nome do procedimento serve para receber argumentos (tambm
chamado de parmetros). Veremos a passagem e recebimento de argumentos mais adiante.
Dentro do mesmo mdulo, podemos ter mais de um procedimento Sub ou Function.
Criaremos um procedimento para clculo de fatorial de um nmero.
Sub Fatorial()
Dim lngNumero As Long
Dim dblFatorial As Double
Dim lngContador As Long

lngNumero = InputBox("Entre com um nmero")
dblFatorial = 1
lngContador = 2
If lngNumero = 0 Or lngNumero = 1 Then
MsgBox "O fatorial 1"
Else
Do While lngContador <= lngNumero
dblFatorial = dblFatorial * lngContador
lngContador = lngContador + 1
Loop
MsgBox "O fatorial " + str(dblFatorial)
End If
End Sub

3.1. Compilao de mdulo
Na maioria da linguagens de programao o termo compilao significa gerar um
arquivo executvel a partir do programa fonte. Compilar no MS Access significa verificar a
sintaxe das instrues e a verificao de variveis e constantes no declaradas (caso Option
Explicit esteja ativado).
Ao terminar a digitao do cdigo, voc deve compilar o mdulo. A compilao
feita no menu Depurar|Compilar mdulos carregados na janela de mdulo. A compilao
abrange todos os mdulos abertos (seja padro, de classe ou de formulrio/relatrio) e no
somente o mdulo que est sendo editado.
Se houve erro de sintaxe ou varivel no declarada, uma caixa de mensagem
informar o erro e o texto onde o erro ocorreu ser selecionado. Por exemplo, o cdigo abaixo
apresentar erro, pois estamos usando uma varivel no declarada.

Option Compare Database
Option Explicit

Sub Teste()
Dim intNumero As Integer
intNumero = intDesconto * 42
MsgBox intNumero
End Sub

Ao compilar, ser mostrada uma caixa de dilogo com o erro Varivel no definida.



Microsoft Access Avanado


27



Ao clicar OK, a janela do cdigo onde ocorreu o erro ser aberta e o local do erro
ficar marcado.
Caso no haja erros de sintaxe, verifique erros de lgica, para que o programa no
trave o computador. Se tudo estiver correto, salve o mdulo e fornea um nome. A gravao
do mdulo feita pelo menu Arquivo|Salvar.
3.2. Teste de execuo de procedimento em mdulo padro
Os procedimentos em mdulos padro, desde que no recebam argumentos, podem
ser executados, para fins de teste, a partir da janela de cdigo do mdulo que est sendo
editado.
Dentro de um mesmo mdulo podem ser escritos vrios procedimentos. Para executar
um deles, voc deve posicionar o cursor em qualquer parte do procedimento desejado e teclar
F5 ou acionar o menu Executar|Ir para/continuar ou ainda teclar o cone .
3.3. Execuo passo-a-passo
Voc pode executar o procedimento passo-a-passo, uma linha de cada vez, para
acompanhar o fluxo de execuo, depurar eventuais erros de lgica ou visualizar o contedo
de variveis.
A execuo passo-a-passo acionada pela tecla F8 ou pelo cone na barra de
ferramentas da janela de mdulo ou pelo menu Depurar|Depurao total. Durante a
execuo passo-a-passo, o texto da linha de cdigo que est sendo executada ficar na cor
definida por Texto de ponto de execuo definido nas opes do editor de cdigo (menu
Ferramentas|Opes, guia Mdulo) e o indicador surgir na barra Indicador de Margem.
A qualquer momento, voc pode decidir pela execuo total, teclando-se F5. Durante
a execuo passo-a-passo voc pode abortar a execuo acionando o menu Executar|Fim ou
clicar no cone na barra de ferramentas. Este cone s est ativado se algum procedimento
estiver sendo executado. Ao editar o cdigo, preste ateno neste cone e lembre-se de
terminar a execuo antes de fazer qualquer alterao em seu cdigo ou na estrutura de
tabelas, consultas, formulrios e relatrios.





Microsoft Access Avanado


28


3.4. Inspeo de variveis
Durante a execuo passo-a-passo voc pode posicionar o mouse sobre uma varivel e
verificar o valor nela contida naquele momento da execuo.

Microsoft Access Avanado


29

Lembre-se que este recurso de inspeo de variveis durante a execuo do
procedimento s est disponvel se a opo Dicas de dados automticas estiver ativada nas
opes do editor de cdigo.
Voc pode inspecionar todas as variveis no painel Locais da janela Depurar.

3.5. Ponto de interrupo
Para depurar uma aplicao no necessrio executar passo-a-passo todos os cdigos.
Normalmente, voc quer estudar algumas partes do cdigo mais suceptveis a falhas. Voc
pode estabelecer pontos de interrupo nas linhas em que voc quer comear a execuo
passo-a-passo.
Para isto, v at a linha onde se deseja interromper a execuo e tecle F9 ou o cone
na barra de ferramentas ou acione o menu Depurar|Ativar/Desativar pontos de
interrupo. O indicador de margem apresentar o cone e o texto da linha ficar na cor
marrom em segundo plano.
Ao executar o procedimento com F5, o cdigo ser executado completamente e parar
no ponto de interrupo. A partir da, pode-se prosseguir com F8 para execuo passo-a-passo
ou F5 para continuar a execuo completa. Um novo F9 na linha do ponto de interrupo
desativar o ponto de interrupo.
Os pontos de interrupo servem para testar o aplicativo. Voc deve lembrar de
desativar todos os pontos de interrupo antes de salvar o mdulo (ou formulrio ou relatrio)
para ser distribudo. Pressionando Control+Shift+F9 desativa todos os pontos de interrupo
de todos os mdulos, estejam estes salvos ou no.
Microsoft Access Avanado


30
3.6. Chamada de Procedimentos
Os procedimentos anteriores so duas unidades de cdigo independentes entre si. Cada
um deles executado ao teclar F5.
Usamos a tecla F5 apenas para testar cada um dos procedimentos. Naturalmente,
quando construir um aplicativo em Access, ele no funcionar base de tecla F5. Haver uma
interface grfica, normalmente um formulrio, com opes para executar os procedimentos
que voc criou. Veremos em outro captulo como chamar um procedimento a partir de um
formulrio.
Agora, precisamos saber como um procedimento pode chamar outro e como eles se
relacionam.
Suponha que voc escreva um procedimento para calcular a combinao de n nmeros
tomados p a p. A frmula da combinao :

Cn p
n
p n p
,
!
!( )!
=



Note que para resolver este problema preciso calcular trs fatorias. Ora, j vimos um
procedimento para calcular fatoriais. No bastaria escrever trs vezes o cdigo dentro do
procedimento de combinao?
No nada produtivo ter que rescrever o mesmo algoritmo vrias vezes. O que
podemos fazer fazer com que o procedimento de combinao chame o procedimento de
fatorial todas as vezes que for necessrio.
Qualquer procedimento pode chamar outro procedimento apenas colocando-se o nome
do procedimento como se fosse uma instruo do VBA.

Sub Combinacao()
.
.
Fatorial
.
End Sub
Esquematicamente, a chamada de um procedimento por outro funciona assim:


Entretanto, o procedimento Fatorial exige que um valor seja informado. No caso,
informamos o valor com a funo InputBox do VBA. O procedimento Fatorial tambm
fornece a resposta por meio da funo MsgBox. Da forma como o procedimento foi escrito
ele um procedimento completo e independente.
Microsoft Access Avanado


31

Para que o procedimento de combinao possa utilizar o procedimento Fatorial, de
forma a ambos funcionarem em conjunto, devemos modificar o procedimento Fatorial.
A primeira coisa a fazer retirar a funo InputBox do procedimento Fatorial. O
nmero para o qual se deseja calcular o fatorial deve ser passado como um argumento.
3.6.1. Passagem de Argumentos
Os parnteses frente do nome do procedimento servem para receber argumentos
vindos de outro procedimento que o chamou. Argumentos so variveis que recebero
valores, constituindo-se assim a entrada de dados para o procedimento.

Sub Fatorial(lngNumero As Long)
Dim dblFatorial As Double
Dim lngContador As Long

dblFatorial = 1
lngContador = 2
If lngNumero = 0 Or lngNumero = 1 Then
MsgBox "O fatorial 1"
Else
Do While lngContador <= lngNumero
dblFatorial = dblFatorial * lngContador
lngContador = lngContador + 1
Loop
MsgBox "O fatorial " + str(dblFatorial)
End If
End Sub

Para um procedimento chamar outro passando argumentos, basta escrever o seu nome
e enviar a varivel ou valor frente do nome. No caso abaixo, o procedimento Combinacao
ir chamar o procedimento Fatorial, passando o valor 4 como argumento.

Sub Combinacao()
.
.
Fatorial(4)
.
End Sub

O outro problema do procedimento Fatorial que o resultado escrito na tela e no
pode ser usado pelo procedimento Combinacao. Devemos, portanto, transformar o
procedimento Fatorial de Sub para Function, de forma que ele possa retornar o resultado para
o procedimento que o chamou.
3.6.2. Retorno de Valor
Somente procedimentos do tipo Function podem retornar valor para o procedimento
que o chamou.
Para retornar um valor, usa-se o prprio nome do procedimento para retornar o valor.
Como procedimento do tipo Function retornam valor, eles precisam ter um tipo definido.
Microsoft Access Avanado


32

Function Fatorial(lngNumero As Long) As Double
Dim dblFatorial As Double
Dim lngContador As Long

dblFatorial = 1
lngContador = 2
If lngNumero = 0 Or lngNumero = 1 Then
Fatorial = 1
Else
Do While lngContador <= lngNumero
dblFatorial = dblFatorial * lngContador
lngContador = lngContador + 1
Loop
Fatorial = dblFatorial
End If
End Sub

Note que em Fatorial = 1, Fatorial no uma varivel e sim o nome do procedimento.
1 o valor a ser retornado. Note tambm que o procedimento Fatorial, que agora do tipo
Function, tem o mesmo tipo de dado que a varivel dblFatorial.
Agora, o procedimento Combinacao pode chamar a function Fatorial e armazenar o
valor de retorna em uma de suas variveis.
Sub Combinacao()
Dim N As Integer
Dim P As Integer
Dim dblFatN As Double
Dim dblFatP As Double
Dim dblFatNP As Double
Dim dblResultado As Double


N = InputBox("Entre com o valor de N")
P = InputBox("Entre com o valor de P")

dblFatN = Fatorial(N)
dblFatP = Fatorial(P)
dblFatNP = Fatorial(N - P)

dblResultado = dblFatN / (dblFatP * dblFatNP)
MsgBox dblResultado
End Sub
O procedimento Combinacao um cdigo completo, mas dependente da existncia do
procedimento Fatorial. O procedimento Combinacao pode ser executado com F5, mas o
procedimento Fatorial no pode mais, por depender da passagem de um argumento.
Como a combinao um cdigo de uso geral, podemos transform-lo tambm em
uma funo, para que outro procedimento o chame. Neste caso, so necessrios dois
argumentos.
Function Combinacao(intN As Integer, intP As Integer) As Double
Dim dblFatN As Double
Dim dblFatP As Double
Dim dblFatNP As Double

dblFatN = Fatorial(intN)
dblFatP = Fatorial(intP)
Microsoft Access Avanado


33
dblFatNP = Fatorial(intN - intP)

Combinacao = dblFatN / (dblFatP * dblFatNP)
End Sub

Podemos testar a funo Combinacao chamando-a de um outro procedimento, pois,
agora que ela recebe argumentos, ela no pode mais ser executada com F5.
Sub TestaCombinacao()
Dim N As Integer, P As Integer
N = 3
P = 2
MsgBox Combinacao(N,P)
End Sub
3.6.3. Passagem de Argumentos por Valor e por Referncia
Os argumentos passados de um procedimento para outro podem ser por valor ou por
referncia.
A passagem por valor indica que a varivel enviada e a varivel definida como
argumento so duas posies de memria distintas. Elas podem at ter os mesmos nomes.
Sub Teste1()
Dim X As Integer
X = 10
MsgBox X ' Ser escrito 10
Teste2(X)
MsgBox X ' Ainda ser escrito 10
End Sub

Sub Teste2(X As Integer)
MsgBox X ' Ser escrito 10
X = 20
MsgBox X ' Ser escrito 20
End Sub

No exemplo acima, a varivel X do procedimento Teste1 contm o valor 10, e
passado como argumento para o procedimento Teste2. Em Teste2, o valor alterado para 20,
mas esta varivel no tem nada a ver com o X de Teste1. Apenas o valor de X em Teste1 foi
passado para a varivel X de Teste2. Ao retornar para Teste1, a varivel X continua a ter o
valor original.
Em suma, a passagem de argumentos por valor equivale a copiar o valor para outra
varivel.
Na passagem por referncia, as alteraes na alterao do argumento afetam o
contedo da varivel que foi passada como argumento. Na passagem por referncia, o
endereo de memria que passado para o procedimento. Assim, ambas as variveis so na
realidade a mesma varivel, mesmo que tenham nomes distintos
Sub Teste1()
Dim X As Integer
X = 10
MsgBox X ' Ser escrito 10
Teste2 X
MsgBox X ' Ser escrito 20
End Sub

Microsoft Access Avanado


34

Sub Teste2(ByRef G As Integer)
MsgBox G ' Ser escrito 10
G = 20
MsgBox G ' Ser escrito 20
End Sub

As palavras-chave ByRef e ByVal definem o tipo de passagem de argumento. O
padro no VBA ByRef, ou seja, se voc no especificar nada, assume a passagem por
referncia.
Entretanto, ByVal e ByRef sozinhos no garantem que os argumentos sejam passados
por valor e pro referncia, respectivamente. O modo de chamada tambm define o tipo de
passagem.
Se na chamada do procedimento os argumentos forem passados entre parnteses,
ento a passagem por valor, independentemente de ByRef e ByVal.
Sub Teste1()
Dim X As Integer
X = 10
MsgBox X ' Ser escrito 10
Teste2(X) ' Os parnteses definem que a passagem por valor
MsgBox X ' Ser escrito 10
End Sub

Sub Teste2(ByRef G As Integer)
MsgBox G ' Ser escrito 10
G = 20
MsgBox G ' Ser escrito 20
End Sub

Se na chamada do procedimento os argumentos no forem passados entre parnteses,
ento o tipo de passagem ser definido por ByRef e ByVal. Lembrando que ByRef o padro
do VBA.
Sub Teste1()
Dim X As Integer
X = 10
MsgBox X ' Ser escrito 10
Teste2 X ' O tipo de passagem depender de ByRef ou ByVal
MsgBox X ' Ser escrito 10
End Sub

Sub Teste2(ByVal G As Integer)
MsgBox G ' Ser escrito 10
G = 20
MsgBox G ' Ser escrito 20
End Sub


* * * * *
Microsoft Access Avanado



35

4. MDULO DE CLASSE EM FORMULRIO/RELATRIO

Cada formulrio e relatrio pode conter apenas um mdulo. Este mdulo do tipo
mdulo de classe. Este mdulo no aparece como um objeto na guia de Mdulos, pois fica
embutido no formulrio/relatrio. Por isso, ele era chamado Code Behind Form.
Os procedimentos esto relacionados a eventos do formulrio, do relatrio ou dos
controles do formulrio (controles de relatrio no geram evento). Os procedimentos so
criados no modo estrutura do formulrio/relatrio. No modo estrutura, com um objeto
selecionado, por exemplo o boto de comando cmdOk, na guia Eventos da janela de
propriedades seleciona-se o evento ao qual o procedimento estar associado. O evento pode
chamar uma macro ou um procedimento em cdigo VBA.


Escolhendo [Procedimento de evento] e clicando-se no boto do Construtor de
Cdigo, uma janela de mdulo, semelhante a uma janela de mdulo padro, ir se abrir.
O nome do procedimento gerado automaticamente. Ele formado pelo nome do
objeto e pelo evento, separado por um sublinhado ( _ ). Por exemplo, para o controle
cmdCancel e evento Clicar o nome do procedimento cmdCancel_Click.
Um cdigo comum associado ao clicar sobre o boto Cancel o do fechamento do
formulrio corrente.

Private Sub cmdCancel_Click(Cancel As Integer)
Microsoft Access Avanado



36
DoCmd.Close
End Sub

O procedimento de mdulo de formulrio ou de relatrio s executado quando o
evento do objeto associado ao procedimento ocorrer.
Como os procedimentos de evento recebem o nome do controle e do evento,
extremamente recomendvel no usar os nomes padro fornecido pelo Access (Texto1,
Comando2, ect). Deve-se nomear os controles com um nome significativo na guia Outra da
janela de Propriedades.
Algumas das caractersticas vistas no mdulo padro se aplicam tambm no mdulo
de classe, dentre elas: Compilao, execuo passo-a-passo, ponto de interrupo e inspeo
de variveis.

4.1. Colees e Objetos de Formulrio/Relatrio

Formulrios, relatrios e controles so objetos do Access e, portanto, possuem
propriedades, mtodos e eventos. As propriedades e os eventos so acessveis no modo
estrutura do formulrio/relatrio, na janela de Propriedades. Alterando-se as propriedades no
modo estrutura, os valores tornam-se estticos. Por exemplo, se se define a Legenda do
formulrio como Menu Principal, ela s pode ser alterada novamente no modo estrutura

NOTA: Controles de relatrios no possuem eventos.

Via programao, podemos ter acesso s propriedades dos objetos. Os valores das
propriedades podem ser alterados dinamicamente, durante a execuo do cdigo. A
programao permite tambm que os mtodos dos objetos sejam invocados, algo que no
possvel no modo estrutura.
Todos os formulrios do banco de dados formam a coleo de formulrios. Todos os
relatrios do banco de dados formam a coleo de relatrios. Uma coleo um objeto que
contm objetos de um mesmo tipo. Eis as colees do Access.
Coleo Descrio
Forms Coleo de formulrios abertos
Reports Coleo de relatrios abertos
Controls Coleo de controles em formulrios ou relatrios abertos
Modules Coleo de mdulos padro e mdulose de classe (inclusive mdulos de classe
de formulrio e de relatrio)

A hierarquia completa dos objetos do Access mostrada na figura abaixo:



Microsoft Access Avanado



37









Por ser um objeto, cada coleo possui tambm propriedades e mtodos.
Para referenciar um objeto especfico de uma coleo, pode-se usar quatro formas
diferentes:
Coleo(nmero do item)
Coleo(Nome do item)
Coleo![Nome do item]
Coleo.Item(nmero do item]

A primeira e a ltima forma tm a desvantagem de ter que saber qual o nmero do
item dentro da coleo. Se existem vrios formulrios num banco de dados, cada um deles
recebe um nmero sequencial, comeando do zero (0). Na ltima forma, Item uma
propriedade da coleo.
As duas outras formas so mais compreeensveis e mais fceis de usar porque j
sabemos o nome do item.
Por exemplo, para referir a um formulrio especfico chamado frmPedidos, use a
expresso:
Forms![frmPedidos] ou Forms(frmPedidos)
Para referir-se a um relatrios chamado rptLista_de_Produtos, use a expresso:
Reports![rptLista_de_Produtos] ou Reports(rptLista_de_Produtos)
Para referir-se a um controle chamado txtPreoUnitrio, no formulrio frmPedidos,
use a expresso:
Forms![frmPedidos]![txtPreoUnitrio]
Microsoft Access Avanado



38
Se o cdigo estiver sendo escrito atrs do formulrio frmPedidos, no necessrio
referir-se a ele mesmo como Forms![frmPedidos], mas simplesmente como Me!. Assim, a
referncia ao controle txtPreoUnitrio pode ser simplificado para Me![txtPreoUnitrio].
NOTA: O objeto Form referencia formulrios abertos. Formulrios fechados so
referenciados pelo objeto Document da hierarquia de objetos do DAO Data Access Objects.


4.2. Propriedades e Mtodos
Se em vez de querer acessar um controle do formulrio voc quiser acessar suas
propriedades ou invocar seus mtodos, use a expresso:
Forms![frmPedidos].Caption
ou simplesmente
Me.Caption
Para acessar uma propriedade de um controle ou invocar um de seus mtodos, use a
expresso:
Forms![frmPedidos]![txtPreoUnitrio].BackColor
ou simplemente
Me![txtPreoUnitrio].BackColor
O caracter ! usado para indicar que o prximo elemento um item definido pelo
usurio e o ponto indica que o prximo elemento uma propriedade ou mtodo. Voc pode
usar o ponto para substituir a !, se quiser. Portanto, Forms![frmPedidos] equivale a
Forms.[frmPedidos].
Ao escrever um cdigo VBA, se a opo Listar membros automaticamente do editor
de cdigo estivar acionada, ser exibida uma lista das propriedades e mtodos do objeto e os
controles do objeto.


Algumas propriedades so somente para leitura, isto , voc no pode alterar o seu
valor, somente recur-lo. Por exemplo, a propriedade Name tipicamente uma propriedade
para somente leitura, j que o nome fornecido ao salvar a estrutura de um objeto.
Mtodo
Propriedade
Controle
Microsoft Access Avanado



39
Todas as propriedades visveis na janela de propriedades na estrutura de um
formulrio so acessveis via programao. Entretanto, existem vrias propriedades que so
acessveis somente no modo programado e no podem ser acessados no modo estrtutura. Por
exemplo, a propriedade Hwnd de um formulrio est disponvel somente no modo
programado.
4.3. Coleo padro e propriedade padro
Um objeto pode conter colees. Um objeto formulrio, por exemplo, contm a
coleo Controls. rigor, a referncia a um controle de um formulrio deveria ser:
Forms![frmPedidos].Controls![txtPreoUnitrio]

Mas como a coleo Controls a coleo padro do objeto Form, no necessrio
mencion-lo.
Os objetos possuem vrias propriedades, mas uma delas a propriedade padro. Por
exemplo, o controle caixa de texto possui a propriedade Text (o contedo da caixa de texto)
como padro. Assim, pode-se omitir esta propriedade.
Forms![frmPedidos]![txtPreoUnitrio].Text = 3.00
equivale a
Forms![frmPedidos]![txtPreoUnitrio] = 3.00
4.4. Propriedades de Coleo
As colees Forms, Reports e Controls possuem apenas propriedades, mas no
mtodos. As propriedades so:
Application Retorna o objeto Application, no caso, o Microsoft Access. Somente
leitura. Como o retorno um objeto, deve ser usado como Set obj =
object.Application

Sub ApplicationProperty( )
Dim obj As Object
Set obj = Forms.Application ' Retorna o objeto
Microsoft Access
End Sub

Count Retorna a quantidade de objetos da coleo. Somente leitura.
Sub CountProperty( )
Dim intForms As Integer
IntForms = Forms.Count
End Sub

Item Retorna o objeto em uma determinada posio ou ndice dentro da coleo.
Somente leitura.
Sub ItemProperty( )
Dim obj As Object
Microsoft Access Avanado



40
Set obj = Forms.Item(0) ' Retorna o primeiro objeto
form aberto
End Sub

Parent Retorna o objeto superior. Somente leitura. Como o retorno um objeto,
deve ser usado como Set obj = object.Parent.
Sub ApplicationProperty( )
Dim obj As Object
Set obj = Me.Controls(txtCodigo).Parent ' Retorna o
objeto form atual
End Sub




4.5. Sees de Formulrio/Relatrio
As sees dos formulrios e relatrios so objetos, da mesma forma que controles. As
sees possuem propriedades e eventos, mas no mtodos.
Deve-se tomar cuidado, pois, assim como os controles, o nome destes objetos dado
automaticamente pelo Access, entretanto, no se justifica alter-los. Na verso em ingls, os
nomes padro so: FormHeader, FormFooter, Detail, PageHeader e PageFooter.
As propriedades e mtodos das sees podem ser acessadas via programao,
entretanto, as sees PageHeader e PageFooter de relatrios no possuem propriedades nem
eventos que possam ser acessados via programao.

4.6. Eventos de Formulrio

Eis alguns dos eventos de formulrio para os quais pode-se definir cdigo:
Evento Descrio
NoAtual (OnCurrent) O evento NoAtual ocorre quando o foco movido para um registro,
tornando-o o registro atual, ou quando o formulrio aberto ou atualizado
ou quando sua consulta repetida.

O Microsoft Access executa a macro ou procedimento de evento Current
antes de o primeiro ou prximo registro ser exibido.
Ao executar uma macro ou procedimento de evento quando ocorre o evento
Current de um formulrio, possvel exibir uma mensagem ou sincronizar
registros em um outro formulrio relacionado ao registro atual. Por
exemplo, quando o registro de um cliente torna-se o atual, voc pode exibir
o pedido anterior do cliente. Quando o registro de um fornecedor torna-se o
atual, possvel exibir os produtos fabricados pelo fornecedor em um
formulrio Fornecedores. Voc tambm pode efetuar clculos com base no
registro atual ou alterar o formulrio em resposta aos dados desse registro.

Microsoft Access Avanado



41
Se a sua macro ou procedimento de evento executar uma ao
IrParaControle ou IrParaRegistro ou o mtodo correspondente do objeto
DoCmd em resposta a um evento Open, ocorrer o evento Current.
O evento Current tambm ocorre quando voc atualiza um formulrio ou
repete a tabela ou consulta base do formulrio por exemplo, quando
voc clica em Remover Filtro/Classificao no menu Registros ou utiliza a
ao RepetirConsulta em uma macro ou o mtodo Requery em cdigo do
Visual Basic.

Quando voc abre um formulrio pela primeira vez, os eventos ocorrem na
ordem a seguir:

Open Load Resize Activate Current
Antes de Inserir (BeforeInsert) Ocorre quando o usurio digita o primeiro caractere de um novo registro,
mas antes de realmente o registro ser gravado. A ordem dos eventos :
BeforeInsert BeforeUpdate AfterUpdate AfterInsert
Aps Inserir (AfterInsert) Ocorre quando o registro passa a ser um novo registro.
Antes de Atualizar
(BeforeUpdate)
Ocorre quando o usurio atualiza o registro
Aps Atualizar (AfterUpdate) Ocorre quando o registro atualizado
Ao Excluir (OnDelete) Ocorre quando o usurio tecla DEL em um ou mais registros.
Confirmar Antes de Excluir
(BeforeDelConfirm)
Ocorre antes de o registro ser efetivametne excludo, quando o MS Access
apresenta a mensagem de confirmao da excluso
Aps Confirmar Excluso
(AfterDelConfirm)
Ocorre aps a confirmao da excluso do registro.
Ao Abrir (OnOpen) Ocorre ao abrir o formulrio. A ordem dos eventos :
Open Load Resize Activate Current
Ao Carregar (OnLoad) Ocorre aps o formulrio ser aberto e carregar os dados para exibio.
Ao Redimensionar (OnResize) Ocorre ao redimensionar a janela do formulrio.
Ao Descarregar (OnUnload) Ocorre antes de o formulrio ser fechado, mas antes de ele ser removido da
tela. A ordem dos eventos :
Unload Deactivate Close
Ao Fechar (OnClose) Ocorre ao fechar o formulrio.
Ao Ativar (OnActivate) Ocorre quando a janela torna-se ativa, mas antes dela receber foco.
Ao Desativar (OnDeactivate) Ocorre antes de a janela perder o foco.
Ao Receber Foco (OnGotFocus) Ocorre aps a janela se tornar ativa.
Ao Perder Foco (OnLostFocus) Ocorre ao perde o foco da janela.
Ao Clicar (OnClick) Ocorre ao clicar o boto esquerdo do mouse sobre o formulrio.
Microsoft Access Avanado



42
5. ELEMENTOS DE PROGRAMAO

Como qualquer outra linguagem de programao, o VBA implementa:
Variveis (simples e compostas)
Constantes
Vetores e matrizes
Comentrios
Instrues de controle de estrutura de repetio
Instrues de controle de estrutura condicional
Instrues de entrada
Instrues de sada
Funes

O VBA permite ainda utilizar-se de objetos e colees do prprio MS Access
(Application, Forms/Form, Reports/Report, Controls/Control, Modules/Module, Screen e
DoCmd) ou de outras aplicaes que suportem a automao (como os aplicativos do MS
Office) ou de controles ActiveX (atualmente chamados de COM Component Object
Model).
5.1. VARIVEIS
Varivel um local da memria RAM do computador que armazena um valor at que
um novo valor seja armazenado ou at que a rotina se encerre. A posio de memria
referida por um identificador, que nada mais que um nome que aponta para o endereo de
memria.
5.1.1. Declarao

Em algoritmo, a declarao das variveis segue a sintaxe:

Declare nome_da_varivel tipo

Onde, declare uma instruo, nome_da_varivel o nome que referencia a posio
de memria onde ser armazenada um dado e tipo o tipo de dado, podendo ser literal,
numrico ou lgico.
No VBA, a principal instruo para declarao de variveis a Dim, seguindo a
sintaxe:

Dim {nome_da_varivel} As {tipo}

Os tipos de dados aceitos no VBA so:

Microsoft Access Avanado



43
Tipo de dados Tamanho de
Armazename
nto
Intervalo
Byte 1 byte 0 a 255
Boolean 2 bytes True ou False
Integer 2 bytes -32.768 a 32.767
Long(inteiro longo) 4 bytes -2.147.483.648 a 2.147.483.647
Single (vrgula flutuante de
preciso simples)
4 bytes -3,402823E38 a -1,401298E-45 para
valores negativos; 1,401298E-45 a
3,402823E38 para valores positivos
Double (vrgula flutuante
de preciso dupla)
8 bytes -1,769313486232E308 a -
4,94065645841247E-324 para valores
negativos; 4,94065645841247E-324 a
1,769313486232E308 para valores
positivos
Currency (inteiro escalado) 8 bytes -922.337.203.685.477,5808 a
922.337.203.685.477,5807
Decimal 14 bytes +/-
79.228.162.514.264.337.593.543.950.335
sem ponto decimal; +/-
7,9228162514264337593543950335 com
28 casas decimais direita; o menor
nmero diferente de zero +/-
0,0000000000000000000000000001.
Date 8 bytes De 1 de Janeiro de 100 at 31 de
Dezembro de 9999
Object 4 bytes Qualquer referncia a Object
String (comprimento da
varivel)
10 bytes +
comprimento
da seqncia
de caracteres
De 0 at aproximadamente 2 bilhes
String(comprimento fixo) Comprimento
da seqncia
de caracteres
De 1 at aproximadamente 65.400
Variant(com nmeros) 16 bytes Qualquer valor numrico at o intervalo de
um Double
Variant(com caracteres) 22 bytes +
comprimento
da seqncia
de caracteres
O mesmo intervalo que String de
comprimento varivel
Definido pelo usurio
(usando Type)
Nmero
requerido por
elementos
O intervalo de cada elemento o mesmo
que o intervalo do seu tipo de dados.

Microsoft Access Avanado



44
Recomenda-se que os nomes das variveis sigam o padro de nomenclatura LNC (ver
Apndice A). Os nomes de variveis, assim como o de constantes e procedimentos:
Podem ter at 255 caracteres.
Precisam comear com uma letra.
Podem incluir letras, nmeros ou caracteres sublinhados (_).
No podem incluir caracteres de pontuao ou espaos.
No podem ser uma palavra reservada do Visual Basic.

Uma palavra reservada uma palavra que o Visual Basic utiliza como parte de sua
linguagem. Isso inclui instrues (como If e Loop), funes (como Len e Abs), operadores
(como Or e Mod), palavras-chave, clusulas SQL e propriedades e mtodos de objetos.
Exemplos:
Dim strNomeEmpregado As String
Dim intIdade As Integer
Dim dblValorFatura As Double
5.1.2. Atribuio de valores variveis

Em algoritmo, a atribuio de valor a uma varivel :
nome_da_varivel {valor}

No VBA, a atribuio feita pelo sinal =.
Exemplos:

strNomeEmpregado = CARLOS KOGA
intIdade = 25
curPreco = 45.76

Se o tipo da varivel for um objeto, a atribuio deve ser precedida pela instruo Set.

Dim dbsBanco As Database ' Objeto Database do DAO
Set dbsBanco = DBEngine.WorkSpaces(0).Databases(0)


O valor atribudo tem que ser coerente com o tipo de dado da varivel. Assim, se
intIdade do tipo inteiro, ocorrer um erro se for atribudo um valor fracionrio ou um valor
fora do intervalo de valores permitidos.

intIdade = 25.5 ' Erro! O tipo inteiro
intNmeroNatural = 32768 ' Erro! O valor maior que 32767


Microsoft Access Avanado



45
5.2. CONSTANTES

As constantes podem ser de trs tipos:
Constantes simblicas, que voc cria utilizando a instruo Const e utiliza em mdulos.
Constantes intrnsecas, que fazem parte do Microsoft Access ou de uma biblioteca
referenciada.
Constantes definidas pelo sistema: True, False e Null.

5.2.1. Constantes Simblicas

Freqentemente, voc ter que utilizar os mesmos valores repetidamente no seu
cdigo ou descobrir que o cdigo depende de certos nmeros que no tm significado bvio.
Nesses casos, voc pode tornar o cdigo bem mais fcil de ler e de manter utilizando
constantes simblicas (tambm chamadas de constantes definidas pelo usurio), que permitem
que voc utilize um nome significativo no lugar de um nmero ou seqncia.
Uma vez que voc tenha criado uma constante utilizando a instruo Const, voc no
poder modific-la ou atribuir um novo valor a ela. Voc no pode tambm criar uma
constante que tenha o mesmo nome que uma constante intrnseca.
Os exemplos a seguir mostram algumas das maneiras pelas quais voc pode utilizar a
instruo Const para declarar constantes numricas e de seqncia:

Const conPI = 3.14159265 ' Pi igual a este nmero.
Const conPI2 = conPI * 2 ' Uma constante para criar outra.
Const conVerso = "Verso 7.0" ' Uma constante de seqncia.


5.2.2. Constantes Intrnsecas

Alm das constantes que voc declara com a instruo Const, o Microsoft Access
declara automaticamente vrias constantes intrnsecas e oferece acesso s constantes do VBA
e s constantes de objetos referenciados no cdigo.
Qualquer constante intrnseca pode ser utilizada em uma macro ou no Visual Basic.
Essas constantes esto disponveis o tempo todo.
As constantes intrnsecas tm um prefixo de duas letras identificando a biblioteca de
objetos que define a constante. As constantes da biblioteca Microsoft Access so iniciadas
com "ac"; as constantes da biblioteca DAO so iniciadas com "db" e as constantes da
biblioteca VBA so iniciadas com "vb". Por exemplo:

acForm
dbAppendOnly
vbCurrency
Microsoft Access Avanado



46

Observao: Como os valores representados pelas constantes intrnsecas podero ser
alterados em verses futuras do Microsoft Access, voc deve utilizar as constantes em vez de
seus valores reais.
Voc pode utilizar constantes intrnsecas sempre que puder utilizar constantes
simblicas, inclusive em expresses. O exemplo a seguir mostra como voc poderia utilizar a
constante intrnseca vbCurrency para determinar se varNm do tipo Variant para a qual a
funo VarType retorna 6 (tipo Currency):

Dim varNm As Variant
If VarType(varNm) = vbCurrency Then
Debug.Print "varNm contm dados do tipo Currency."
Else
Debug.Print "varNm no contm dados do tipo Currency."
End If

Existem vrias categorias de constantes intrnsecas. Para ver uma lista de constantes
intrnsecas em uma determina categoria. Consulte no Help do Access os tpicos abaixo:

As constantes de ao (do objeto DoCmd)
As constantes DAO (Data Access Object)
As constantes de procedimento de evento
As constantes de Cdigo de Tecla
As constantes diversas
As constantes do mtodo RunCommand (constituem um subconjunto das constantes de
ao)
As constantes de segurana
As constantes do Visual Basic
As constantes da funo VarType


5.2.3. Constantes Definidas pelo Sistema

As constantes definidas pelo sistema so os valores lgicos True e False e a ausncia
de valor Null. Assim como as constrantes intrnsecas, elas tambm no precisam ser
declaradas com a instruo Const.
Voc pode usar estas constantes em qualquer lugar do Access, tais como em consultas,
macros, variveis e propriedades de objetos.




Microsoft Access Avanado



47
5.3. VETORES E MATRIZES

As matrizes suportam de 1 at 60 dimenses. A matriz de apenas uma dimenso
chamada de vetor.
A declarao das dimenses e dos intervalos de cada dimenso feita com a instruo
Dim, seguindo a sintaxe:

Dim nomedavarivel([ [LimiteInferior To] [LimiteSuperior] [,LimiteInferior To] Limite
Superior] ....] ) As tipo

' Matriz de uma dimenso (vetor) com 5 elementos
Dim intMatriz1( 1 To 5) As Integer

' Matriz de duas dimenses. A primeira com 10 e a segunda com 6 elementos
' O tamanho da string de cada elemento varivel.
Dim strMatriz2( 1 To 10, 1 To 6) as String

' Matriz de 3 dimenses. O nmero de elementos depende da instruo Option
Base na seo de declaraes. O tamanho da string de cada elemento 50.
Dim strMatriz3( 5, 4 , 3) As String * 50

Se o limite inferior de uma dimenso no for explicitada, assume o valor padro
declarado pela instruo Option Base. Option Base colocada na seo de declaraes do
mdulo. Se Option Base for omitido, o limite inferior 0. Para iniciar em 1, declara-se Option
Base 1. Para explicitar o incio em 0, declara-se Option Base 0.
Uma das caractersticas do VBA a declarao de matrizes dinmicas, ou seja, o
intervalo dos subscritos e o nmero de dimenses podem ser alterados conforme a
necessidade que surgir durante o processamento.
Matriz dinmica declarada sem especificar as dimenses, nem limites.

Dim intDinamica() As Integer

O redimensionamento feito instruo Redim.
Redim intDinamica( 1 To 5, 1 To 10)
Redim intDinamica(8, 7, 4)

Voc pode tambm declarar uma matriz dinmica com Redim, mas neste caso, exige-
se que os subscritos tenham sido definidos. Este tipo de matriz pode ter seus intervalos
alterados (para maior ou menor), mas no se pode alterar o nmero de dimenses.

Redim A( ) As Integer ' Erro
Redim B(5, 2) As Integer ' OK
Redim B(3, 1) ' Ok
Redim B(5, 6, 10) ' Erro
Redim B(100) ' Erro
Redim B(100, 100) ' Ok
Microsoft Access Avanado



48
5.4. TIPOS DEFINIDOS PELO USURIO

A instruo Type define um tipo de dado a partir dos tipos bsicos. Seu emprego
normalmente se aplica a um registro. Veja o exemplo.

Type RegistroDePessoal
strMatricula As String * 8
strNome As String * 35
strCodOrgao As String * 8
strCodCargo As String * 4
dtaDataNasc As Date
End Type

Dim MeuRegistro As RegistroDePessoal

MeuRegistro.strMatricula = 80106650
MeuRegistro.strNome = CARLOS KOGA
MeuRegistro.dtaDataNasc = #06/10/1964#

5.5. ESTRUTURA DE REPETIO

O VBA possui as seguintes instrues de repetio:
For...Next
Do...Loop
While...Wend
For Each...Next
5.5.1. For..Next

A estrutura For...Next suportada por vrias linguagens, e no apresenta diferenas. A
sua sintaxe :

For {contador} = {incio}To {fim} [Step {passo}]
[instrues]
[Exit For]
[instrues]
Next [contador]




Microsoft Access Avanado



49
5.5.2. Do..Loop

A estrutura Do...Loop implementa uma repetio enquanto uma condio for
verdadeira (while) ou at uma condio se tornar verdadeira (until). Tambm implementa as
sadas tanto de incio quanto de final.
Na repetio enquanto uma condio for verdadeira, acrescenta-se a clusula WHILE
{condio} aps o DO (se for sada no incio) ou aps o LOOP (se for sada no final).

Sub WhileSadaNoIncio()
contador = 0
meuNmero = 20
Do While meuNmero > 10
meuNmero = meuNmero - 1
contador = contador + 1
Loop
MsgBox "O loop concluiu " & contador & " repeties."
End Sub

Sub WhileSadaNoFinal()
contador = 0
meuNmero = 9
Do
meuNmero = meuNmero - 1
contador = contador + 1
Loop While meuNmero > 10
MsgBox "O loop concluiu " & contador & " repeties."
End Sub

Na repetio at que uma condio se torne verdadeira, acrescenta-se o UNTIL
{condio} aps o DO (se for sada no incio) ou aps o LOOP (se for sada no final).

Sub UntilSadaNoIncio()
contador = 0
meuNmero = 20
Do Until meuNmero = 10
meuNmero = meuNmero - 1
contador = contador + 1
Loop
MsgBox "O loop concluiu " & contador & " repeties."
End Sub

Sub UntilSadaNoFinal()
contador = 0
meuNmero = 1
Do
meuNmero = meuNmero + 1
contador = contador + 1
Loop Until meuNmero = 10
MsgBox "O loop concluiu " & contador & " repeties."
End Sub
Microsoft Access Avanado



50
A sada da repetio pode ser forada com a instruo Exit Do.

intContador = 0
Do While True
intContador = intContador + 1
if intContador > 10 Then
Exit Do
Endif
Loop

5.5.3. While..Wend

A estrutura While...Wend implementa somente a repetio enquanto uma condio for
verdadeira e no admite sada forada. Pontanto, melhor substitu-la pela Do...Loop.

While {condio}
[instrues]
Wend

5.5.4. For Each..Next

A instruo For Each...Next uma variao do For..Next especfica para elementos
dentro de matrizes ou de colees de objetos.

Dim varNomesMeses As Variant
Dim strMes As String

varNomesMeses = Array("Janeiro", "Fevereiro", "Maro", "Abril", _
"Maio", "Junho", "Julho", "Agosto", _
"Setembro", "Outubro", "Novembro", "Dezembro")
For Each strMes In varNomesMeses
Debug.Print strMes
Next

Neste outro exemplo, a coleo TableDefs possui vrios objetos do tipo TableDef.
Cada objeto de definio de tabela possui a propriedade Name. A instruo For Each...Next
pode ser usada para listar todas as tabelas do banco de dados corrente.

Dim tdfsTabelas As TableDefs
Dim tdfTabela As TableDef

Set tbfsTabelas = CurrentDb.TableDefs

For Each tdfTabela In tdfsTabelas
Debug.Print tdfTabela.Name
Next

Microsoft Access Avanado



51
Uma construo similar pode ser obtida com somente a instruo For...Next.

Dim tdfsTabelas As TableDefs
Dim tdfTabela As TableDef
Dim intContador As Integer

Set tbfsTabelas = CurrentDb.TableDefs

For intContador = 0 To tbfsTabelas.Count
Debug.Print tdfTabela(intContador).Name
Next



5.6. ESTRUTURA CONDICIONAL

If...Then...Else
Select Case
On...Goto
On..GoSub

As instrues On..Goto e On..GoSub no sero mostradas porque Select Case pode
substitu-las, gerando um cdigo mais estruturado e flexvel.

5.6.1. If...Then...Else

A estrutura condicional mais simples :

If { condio } Then
[ instrues]
End If

Uma estrutura composta contm a clusula Else:

If { condio } Then
[ instrues]
Else
[ instrues]
End If


A instruo IF..Then..Else admite ElseIfs aninhados.

If { condio } Then
[ instrues]
Microsoft Access Avanado



52
Elseif { condio 2} Then
[ instrues]
Elseif { condio 3} Then
[ instrues]
Elseif { condio 4} Then
[ instrues]
Else
[ instrues]
End If

Dim Nmero, Dgitos, MinhaSeqncia
Nmero = 53 ' Inicializa a varivel.
If Nmero < 10 Then
Dgitos = 1
ElseIf Nmero < 100 Then
' A condio avalia como True, ento a prxima instruo executada.
Dgitos = 2
Else
Dgitos = 3
End If


5.6.2. Select Case

O Select Case semelhante aos ElseIfs aninhados.

Select Case expressodeteste
[Case listadeexpresses-n
[instrues-n]] ...
[Case Else
[instrueselse]]
End Select


Dim Nmero As Integer
Nmero = 8 ' Inicializa a varivel.
Select Case Nmero ' Avalia Nmero.
Case 1 To 5 ' Nmero entre 1 e 5.
Debug.Print "Entre 1 e 5"
' A seguinte a nica clusula Case que avalia como True.
Case 6, 7, 8 ' Nmero entre 6 e 8.
Debug.Print "Entre 6 e 8"
Case Is > 8 And Nmero < 11 ' Nmero 9 ou 10.
Debug.Print "Maior que 8"
Case Else ' Outros valores.
Debug.Print "No entre 1 e 10"
End Select

Microsoft Access Avanado



53
5.7. ENTRADA E SADA DE DADOS

Para fazer a leitura de dados via teclado em algoritmo voc usa a instruo Leia . Em
Clipper usa-se o comando @..GET para a sua implementao. Para a sada, o algoritmo usa a
instruo Escreva, a qual implementada no Clipper com @..SAY.
No Clipper, tanto para entrada de dados quanto para a sada, usam-se os dois
comandos para construir uma tela para posicionar os campos na tela, de forma a criar uma
interface agradvel e compreensvel. No Access, h uma maneira mais fcil de efetuar a
entrada e sada de dados, sem programao: o objeto formulrio.
Tomemos por exemplo a funo Extenso( ), cujo cdigo apresentado mais adiante. A
maioria das funes requer argumentos de entrada, neste caso, um valor monetrio. Como
toda funo, esta retorna o valor por extenso do valor informado. Tanto o argumento (entrada)
quanto o retorno da funo (sada) podem ser colocados em um formulrio.
O exemplo a seguir um formulrio simples, sem nenhuma fonte de dados. Por isso,
em suas propriedades esto desativados o seletor de registros, os botes de navegao e as
barras de rolagem.
H dois controles caixa de texto: txtValor e txtExtenso. O primeiro um controle no
acoplado, que receber um valor monetrio, e, por isso, est formatado com o tipo Moeda. O
segundo um controle calculado que contm o dado Extenso([txtValor]). Quando este
receber o foco, chamar a funo, levando o argumento txtValor e retornar uma string com o
valor por extenso.




Microsoft Access Avanado



54


Este exemplo simples mostra claramente que um formulrio pode ser usado como
entrada e sada, substituindo com vantagens os tradicionais comando de entrada via teclado e
de sada na tela.


5.7.1. Funes do VBA para entrada e sada

s vezes voc no quer usar um formulrio para entrada e sada de dados. Voc quer
usar instrues no VBA para receber um nico campo e enviar uma mensagem na tela. Para
isto h a funo InputBox e a funo/instruo MsgBox.

Dim curValor As Currency
curValor = InputBox("Entre com o valor", "Valor monetrio")
MsgBox Extenso(curValor), vbOKOnly, "Valor por Extenso"

A execuo deste fragmento de cdigo resulta em duas janelas, mostradas abaixo.




Microsoft Access Avanado



55


Se se quer capturar a resposta do usurio, usa-se a funo MsgBox em vez da
instruo. A sintaxe a mesma, somente acrescenta-se a varivel que receber a resposta.

intResposta = MsgBox(Extenso(curValor), vbOKOnly, "Valor por Extenso")

InputBox e MsgBox no so sofisticados quanto um formulrio. InputBox no pode
consistir um dado, usando por exemplo, um cdigo VBA em mdulo de formulrio, nem
formatar (usando a propriedade Formato do controle Caixa de Texto).

5.7.2. Outros dispositivos de entrada e sada

Nem sempre a entrada de dados via teclado. Pode ser via leitura de arquivo. A
entrada e gravao de dados em formato de tabela so tratados no tpico Acesso a Dados,
mais adiante. A leitura de dados de arquivos seqenciais, randmicos e binrios ser vista
tambm em outro tpico (Acesso a Arquivos e Impressora).
Da mesma forma, a sada nem sempre a tela de vdeo. O tpico Acesso a Arquivos e
Impressora mostrar como direcionar a sada para arquivos em disco ou para a impressora
local.
H um outro local para onde a sada pode ser direcionada: a Janela Depurar. Esta
janela recebe a sada, a qual visualizada quando a janela aberta. A janela depurar serve
testar e depurar a lgica de um programa.
A sada para a janela depurar feita pelo objeto Debug, do VBA, utilizando-se seu
nico mtodo: o Print. A janela depurar aberta com Control-G.

Dim curValor As Currency
curValor = InputBox("Entre com o valor", "Valor monetrio")
Debug.Print Extenso(curValor)

Microsoft Access Avanado



56

5.8. COMENTRIOS
Um comentrio so textos no executveis, ou seja, no so entendidos como um
cdigo de programao. Comentrios servem para documentar e esclarecer uma rotina
complexas.
Uma linha de cdigo torna-se um comentrio se ela vier precedida de uma aspa
simples. No necessrio que toda a linha seja um comentrio; voc acrescentar um
comentrio aps uma instruo.
' Toda esta linha um comentrio.
MsgBox "Teste" ' A partir daqui tudo que for escrito comentrio.

Todo comentrio escrito na cor verde por padro. Voc pode alterar a cor nas opes
do MS Access.
5.9. FUNES
O MS Access possui um rol muito grande de funes prontas. Como voc j deve
saber, uma funo uma rotina que retorna um valor quando chamada. A funo pode
receber nenhum, um ou mais argumentos de entrada. A lista de argumentos passada entre
parnteses aps o nome da funo. A funo retorna somente um valor de um determinado
tipo, e portanto, toda chamada de funo deve ser atribuda a uma varivel. Exemplos:
Dim dtaDataDeHoje As Date
Dim intAscii As Integer
dtaData = Date()
intAscii = Char(A)
Existem funes do Visual Basic for Applications, do DAO Data Access Object e
funes agregadas SQL. Apesar de todas poderem ser usadas no cdigo VBA de uma
aplicao em MS Access, importante saber a origem das funes, pois voc no pode us-
las em qualquer aplicativo. Por exemplo, se a funo do DAO, voc s pode chamar a
funo de estiver com o objeto DAO carregado. As funes do VBA podem ser usadas em
qualquer aplicao VBA, seja no MS Access, no MS Excel, MS Word, no MS PowerPoint ou
no MS Project.
As funes do VBA so classificadas segundo o finalidade. Os grupamentos so:
Funes literais
Funes matemticas
Funes financeiras
Funes de data
Funes de converso

Voc no deve confundir funo com instruo. Normalmente, as instrues so da
cor azul e as funes aparecem na cor preta.
Funes do VBA podem ser usadas na construo de expresses SQL. Por exemplo:
Microsoft Access Avanado



57
Dim strSql As String
strSql = "SELECT NmeroDoPedido, DataDoPedido, DataDeEntrega, "
strSql = strSql + "DateDiff('d', [DataDoPedido], [DataDeEntrega] As Prazo "
strSql = strSql + "FROM Pedidos"
Me.RecordSource = strSql

Consulte a ajuda do MS Access para saber mais sobre funes.
5.10. ESCOPO DE IDENTIFICADORES

O escopo refere-se a disponibilidade dos identificadores (variveis, constantes e
procedimentos) para uso por outros procedimentos. O escopo definido quando se declara os
identificadores.
Existem dois nveis de escopo e dois de visibilidade que determinam onde e quando
um identificador reconhecido (visvel),

Nveis de escopo
Nvel de procedimento
Nivel de mdulo

Nveis de visibilidade
Private
Public

Escopo Private Public
Nvel de procedimento Todas as variveis e
contantes declaradas em nvel
de procedimento so Private,
ou seja, somente podem ser
acessadas dentro do
procedimento em que foram
declaradas. Estas variveis
so tambm chamadas
variveis locais

Sub Teste( )
Dim intK As Integer

No se aplica.
Nvel de mdulo Todas as variveis e
constantes declaradas na
seo de Declaraes podem
ser acessadas por todos os
procedimentos daquele
mdulo.

Todas as variveis e
constantes declaradas com a
instruo Public na seo de
Declaraes de um mdulo
podem ser acessadas por
qualquer procedimento do
banco de dado.
Microsoft Access Avanado



58
Option Compare Database
Option Explicit
Dim intK As Integer

Option Compare Database
Option Explicit
Public intK As Integer

Quanto aos identificadores de procedimento, o escopo .

Tipo de mdulo Escopo
Mdulo de formulrio/relatrio Todos os procedimentos so Private, mesmo
que sejam usadas as instrues Private ou
Public. Isto tem lgica, j que so
procedimentos de evento, os quais devem
responder a somente os eventos dos objetos
formulrio, relatrio ou controle.
Mdulo padro Todos os procedimentos so Public, a no ser
que seja colocada a instruo Private antes da
declarao do procedimento.

Private Sub Teste()

5.11. OBJETO DoCmd

O objeto DoCmd exclusivo do MS Access , portanto, voc s pode utiliz-lo em
programao VBA dentro do MS Access . Este objeto no possui nenhuma propriedade nem
eventos, somente mtodos. Os mtodos executam aes do MS Access, tais como abrir um
formulrio, executar uma macro, alterar o formato do cursor, etc.
Muitos dos mtodos do objeto DoCmd requerem argumentos, alguns obrigatrios,
outros opcionais.
Consulte a ajuda do MS Access para saber os mais sobre o objeto DoCmd.

Microsoft Access Avanado



59
6. LINGUAGEM SQL
As consultas criadas na guia Consultas da janela de Banco de Dados nada mais so
que instrues em linguagem SQL. A SQL Structured Query Language (Linguagem
Estruturada de Consulta) foi desenvolvida pela IBM em meados da dcada de 10 e
padronizada pela ANSI (o padro SQL ANSI-92). Fornecedores de software de banco de
dados costumam ter variaes do padro ANSI. A SQL do Microsoft SQL Server o
Transact-SQL e o da Oracle o PL/SQL. O Access utiliza uma variao da SQL ANSI,
chamada Microsoft Jet Database Engine SQL.
O Microsoft Jet Database Engine SQL suportado no Microsoft Access e no
Microsoft Visual Basic.
A criao de consultas no MS Access facilitada pela existncia do modo Estrutura,
uma espcie de editor grfico que torna a tarefa mais intuitiva e fcil.


Voc pode criar consultas no modo SQL, escrevendo diretamente as instrues SQL.
Se voc no tem conhecimento da linguagem SQL, poder se familiarizar com ela criando
consultas no modo Estrutura e visualizando-a no modo SQL.


Tendo uma consulta criada na guia Consultas, voc pode abr-la interativamente pelo
boto Abrir da janela de Banco de Dados. O termo executar mais apropriado que abrir. Via
programao, a consulta pode ser executada pelo mtodo OpenQuery do objeto DoCmd.
Microsoft Access Avanado



60
A compreenso da linguagem SQL permite desenvolver aplicaes sofisticadas. Na
realidade, voc pode construir uma aplicao inteira sem nenhuma consulta ter sido criada na
guia Consultas, porque:
A propriedade Origem do Registro (RecordSource) de formulrios e relatrios pode ter
como valor uma tabela ou uma instruo SQL (criada pelo construtor de consultas),
definidos em tempo de desenvolvimento (no modo Estrutura).
O valor propriedade Origem do Registro de formulrios e relatrios pode ser construdo
em tempo de execuo, passado-o na forma de uma expresso SQL para a propriedade
RecordSource do formulrio ou relatrio.
Voc pode substituir consultas de ao por expresses SQL criadas em tempo de
execuo e execut-las pelo mtodo RunSQL do objeto DoCmd.
Voc pode construir expresses SQL em tempo de execuo e visualizar os dados por
meio de um formulrio de consulta.
Voc pode construir expresses SQL em tempo de execuo e acessar os dados pelo
mtodo OpenRecordset do objeto Database do DAO.

Alm do mais, o conhecimento da linguagem SQL imprescindvel para a criao de
consultas especficas SQL (Unio, Passagem e Definio de dados) e til para desenvolver
programas para acessar dados em bancos de dados cliente/servidor como o MS SQL Server e
Oracle.
6.1. EXPRESSO SQL
Uma expresso SQL uma cadeia de caracteres (string) contendo instrues SQL.
Sendo uma cadeia de caracteres, voc pode constru-la em tempo de desenvolvimento ou de
execuo e atribu-la a uma varivel do tipo String. A varivel pode ser usada como
argumento ou ser atribuda propriedade RecordSource de relatrio ou formulrio. Veja
alguns exemplos de expresso SQL.
Dim strSql As String
strSql = "DELET * FROM [Detalhes do Pedido]"
DoCmd.RunSql strSql

Dim strSql As String
Dim intNumeroPedido As Integer
IntNumeroPedido = InputBox("Qual o nmero do pedido?")
strSql = "SELECT NmeroDoPedido, CdigoDoCliente, DataDoPedido, "
strSql = strSql & "DataDeEntrega, DataDeEnvio "
strSql = strSql & "FROM Pedidos WHERE NmeroDoPedido " & intNumeroPedido
Me.RecordSource = strSql

No primeiro exemplo, a expresso atribuda varivel strSql e passada como
argumento do mtodo RunSql do objeto DoCmd. Trata-se de uma consulta de ao que
excluir todos os registros da tabela Detalhes do Pedido. O nome da tabela est entre
colchetes porque possui espaos em seu nome.
No segundo exemplo, uma expresso construda com o nmero do pedido sendo
informado em tempo de execuo. A expresso ento atribuda propriedade RecordSource
do formulrio/relatrio ao qual o mdulo de classe pertence. Note os espaos no final de cada
atribuio de valor varivel strSql. Isto necessrio para que a sintaxe da instruo SQL
seja correta, seno ocorreria uma expresso como DataDeEntrega, DataDeEnvioFROM, o que
causaria um erro em tempo de execuo.
Microsoft Access Avanado



61
Apesar de mais trabalhoso, o uso de expresses SQL em programao em vez de criar
consultas na guia Consultas mais seguro. Suponha que voc cie uma consulta de ao que
exclua todos os registros de uma tabela. Qualquer pessoa pode abrir o banco de dados e
execut-la.
claro que voc poderia evitar isto definindo permisso em nvel de usurio. De
qualquer forma, usar expresses SQL em programao dar mais flexibilidade e segurana a
sua aplicao.
NOTA: Toda sintaxe das expresses SQL em ingls, no importa o idioma que voc esteja
usando, inclusive nomes de funes e formato de data.
6.2. INSTRUES BSICAS SQL
No se pretende aqui ensinar a linguagem SQL, mas sim passar noes, restritamente
do Microsoft Jet Database Engine SQL.
NOTA: Se voc for programar no MS Visual Basic para acessar banco de dados do MS SQL
Server, deve usar a sintaxe do Transact-SQL.

A maneira mais fcil de se criar expresses SQL construir a consulta na guia
Consultas, alternar para o modo SQL, selecionar todo o texto, copiar e colar no mdulo para
contruir a expresso.
As consultas so agrupadas segundo a sua finalidade. Ao construir uma consulta pelo
modo Estrutura, tem-se 4 tipos bsicos: Seleo, Atualizao, Excluso, Acrscimo e Criao
de tabela.
O quadro a seguir mostra quais instrues SQL caracterizam cada tipo de consulta:
Tipo de consulta Instruo SQL caracterstica
Consulta seleo SELECT
Consulta atualizao UPDATE
Consulta de excluso DELETE
Consulta acrscimo INSERT INTO
Consulta criao de tabela SELECT INTO

6.2.1. Consulta Seleo
A consulta seleo a mais comum de todas. Ela retorna um conjunto de dados vindos
de uma ou mais tabelas relacionadas. Quando se programa, este conjunto no visvel como
no modo Folha de Dados, mas fica na memria do computador para ser acessado. Os dados
tambm no podem ser alterados como ocorre no modo Folha de Dados, a no ser que voc
execute mtodos de insero, atualizao ou excluso do objeto RecordSet.
A consulta seleo possui clusulas e caractersticas especficas deste tipo de consulta
e tambm outras comuns aos demais tipos. Veremos aqui algumas das clusulas e
caractersticas comuns mais detalhadamente para poupar mais explicaes nas consultas
seguintes.
A sintaxe bsica da consulta seleo comea com a instruo SELECT. Sua forma
mais simples :
Microsoft Access Avanado



62
SELECT {listadecampos |*} FROM {tabela}
Esta instruo retorna os campos selecionados em listadecampos ou todos os campos
se voc utilizar o *. Todos os registros da tabela especificada por tabela so recuperados
porque no h uma clusula de critrio. Os campos so recuperados na ordem em que eles
foram escritos na listadecampos. Os campos so separados por vrgulas. Exemplos:
SELECT * FROM Pedidos
Esta instruo retorna todos os campos e todos os registros da tabela Pedidos.

SELECT CdigoDoProduto, NomeDoProduto, CdigoDoFornecedor FROM Produtos
Esta instruo retorna trs campos e todos os registros da tabela Produtos.

A sintaxe completa :

SELECT [predicado] { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2 [AS alias2] [, ...]]}
FROM expressodetabela [, ...] [IN bancodedadosexterno]
[WHERE {critrioswhere} ]
[GROUP BY campo1 [, campo2] [,campoN... ] ]
[HAVING {critrioshaving} ]
[ORDER BY campo1 [ASC|DESC] [, campo2 [ASC|DESC] ] [,campoN [ASC|DESC] ... ] ]
[WITH OWNERACCESS OPTION]

A instruo SELECT extrai as colunas (campos) escolhidas, selecionando as linhas
(registros) que atendam aos critrios da clusula WHERE e classifica (ORDER BY) em orde
crescente (ASC, que o padro) ou decrescente (DESC) ou agrupa (GROUP BY) as linhas
resultantes na ordem especificada.
A clusula WITH OWNERACCS OPTION significa que o usurio que est
executando a consulta possui as mesmas permisses que o criador da consulta. Isto tem
sentido em um ambiente multi-usurio em que se definir segurana em nvel de usurio.
Os argumentos da instruo so:
Argumento Descrio
Predicado Um dos predicados a seguir: ALL, DISTINCT, DISTINCTROW
ou TOP. Voc utiliza o atributo para restringir o nmero de
registros retornados. Se nenhum for especificado, o padro ser
ALL.
* Especifica que todos os campos da tabela ou tabelas especificadas
esto selecionados.
Tabela O nome da tabela contendo os campos a partir dos quais os
registros so selecionados. um argumento opcional. Voc s
precisa defin-lo caso suas tabelas possuam o mesmo nome de
campo, como o caso do campo PreoUnitrio, que consta das
tabelas Produto e Detalhes do Pedido do banco de dados
Northwind. Produto.PreoUnitrio, [Detalhes do
Pedido].PreoUnitrio
campo1, campo2,
campoN
a lista de campos a ser recuperada. Se voc incluir mais de um
campo, eles sero recuperados na ordem listada.
O campo pode ser uma expresso literal, matemtica ou lgica.
Os nomes dos campos so usados nas clusula ORDER BY para
Microsoft Access Avanado



63
definir a ordem de classificao e na clusula GROUP BY para
definir os grupamentos.
alias1, alias2, aliasN Os nomes a serem utilizados como cabealhos de coluna em lugar
dos nomes originais de coluna em tabela. Se omitido, assume o
valor da propriedade Legenda na estrutura da tabela. Caso a
propriedade Legenda esteja em branco, assume o nome do campo.
Se um dos campos for uma expresso e no for definido um alias,
assumido Expr1, Expr2, Expr3 e assim por diante.
Voc no pode usar alias nas clausulas ORDER BY nem em
GROUP BY.
Expressodetabela O nome da tabela ou relacionamento de tabelas contendo os dados
que voc deseja recuperar.
Bancodedadosexterno O nome do banco de dados que contm as tabelas em
expressodetabela se elas no estiverem no banco de dados atual.
Critrioswhere uma expresso lgica que filtra os registros que atendam ao
critrio definido na expresso.
Critrioshaving uma expresso lgica que filtra os registros aps eles terem sidos
agrupados. A clusula HAVING deve obrigatoriamente vir com a
clusula GROPU BY.


Nomes de campos ou de tabelas ou de alias que possuam espaos devem vir entre
colchetes. Exemplo:
SELECT CD_Matric AS Matrcula, [Nome do empregado] AS Nome FROM [Cadstro de
Pessoal]

6.2.1.1. Argumento Predicado
O argumento predicado assume valores que so palavras reservadas da linguagem
SQL. Os predicados podem ser as seguintes palavras reservadas:
PREDICADO FINALIDADE
ALL Indica que sero selecionados todos os registros que atendam aos critrios da seleo.
assumido se nenhum predicado for utilizado.
DISTINCT Omite registros que contm dados duplicados em campos selecionados.
DISTINCTROW Omite dados com base em registros inteiramente duplicados e no somente campos
duplicados.
TOP n
[PERCENT]
Retorna um nmero fixo de registros que ficam na parte superior ou inferior de um intervalo
especificado por uma clusula ORDER BY.

Para enteder o predicado, considere as tabelas:
CLIENTES
ID_CLIENTE NOME SOBRENOME DT_NASC CARGO
1 JOSE SANTOS 06/07/1956 001
2 PAULO VIANNA 07/09/1952 002
3 SIMONE CASTRO 10/11/1965 001
4 CARLOS SANTOS 21/01/1960 001
5 PENELOPE CHARMOSA 07/09/1952 002

Microsoft Access Avanado



64
PEDIDOS
NR_PEDIDO ID_CLIENTE DATA VALOR
1 1 01/01/98 500,00
2 4 02/01/98 100,00
3 5 02/01/98 30,00
4 5 03/01/98 15,00
5 3 04/01/98 60,00
6 3 10/01/98 90,00
7 1 01/01/98 120,00

PREDICADO ALL
A consulta a seguir retornar todos os registros da tabela Clientes.

SELECT ALL Clientes.* FROM Clientes

equivalente a

SELECT Clientes.* FROM Clientes

PREDICADO DISTINCT
A consulta a seguir omitir um dos registros cujo sobrenome SANTOS.
SELECT DISTINCT Clientes.SOBRENOME FROM Clientes

A consulta a seguir retornar todos os registros, pois DISTINCT no ter efeito porque h mais
de um campo selecionado.

SELECT DISTINCT Clientes.* FROM Clientes


PREDICADO DISTINCTROW
A consulta a seguir retornar todos os registros da tabela Clientes, exceto o cliente Paulo
Vianna.

SELECT DISTINCTROW Clientes.*
FROM Clientes INNER JOIN Pedidos
ON Clientes.ID_CLIENTE = Pedidos.ID_CLIENTE

Se o predicado DISTINCTROW no fosse usado, apareceriam mltiplas linhas para os clientes
com mais de um pedido.

Esta consulta a seguir no sofre o efeito de DISTINCTROW pois no existem registros repetidos,
j que NR_PEDIDO tem valor distinto em cada valor.

SELECT DISTINCTROW Clientes.*, Pedidos.NR_PEDIDO
FROM Clientes INNER JOIN Pedidos
ON Clientes.ID_CLIENTE = Pedidos.ID_CLIENTE

PREDICADO TOP

A consulta a seguir retornar os nomes dos 2 clientes mais idosos cujos cargos 001.
SELECT TOP 2 NOME
FROM Clientes
WHERE CARGO ="001"
Microsoft Access Avanado



65
ORDER BY DT_NASC

A consulta a seguir retornar os nomes de 2% dos clientes mais idosos, cujo cargo 001.

SELECT TOP 2 NOME
FROM Clientes
WHERE CARGO ="001"
ORDER BY DT_NASC

O predicado TOP no distingue valores iguais. Portanto, a consulta a seguir retornar
dois registros e no somente um.
SELECT TOP 1 NOME
FROM Clientes
WHERE CARGO = "002"
ORDER BY DT_NASC

6.2.1.2. Expresses na lista de campos
Em qualquer dialeto da SQL possvel usar expresses literais, matemticas ou
lgicas como se fosse um campo de uma tabela. Por exemplo:
SELECT CdigoDoProduto, PreoUnitrio, Quantidade, Desconto,
((PreoUnitrio * Quantidade) (PreoUnitrio * Quantidade * Desconto)) AS
Subtotal
FROM [Detalhes do Pedido]

No existe um campo subtotal na tabele Detalhes do Pedido. Ele o alias da expresso
que calcula o subtotal de um item do pedido. Quando se usa expresso nas lista de campos,
ela se chama campo calculado.
Linguagens SQL como o Microsoft SQL Server possui funes prprias da linguagem
as quais podem ser usadas para criar campos calculados. A diferena do Microsoft Jet
Database Engine SQL que voc pode usar funes do prprio Microsoft Jet Database
Engine SQL, funes do VBA e funes definidas pelo usurio para criar campos calculados.
O Microsoft Jet Database Engine SQL possui a funo agregada Avg() para calcular a
mdia de um valor.
SELECT Avg(PreoUnitrio) AS [Mdia de preos] FROM Produtos

O Microsoft Jet Database Engine SQL no possui a funo WeekDay(), que do
VBA. Mas voc pode us-la em expresses SQL que sero executadas no MS Access ou no
MS Visual Basic.
SELECT WeekDay(DataDoPedido) AS [Dia da semana] FROM Pedidos

Procedimentos do tipo Function, criadas em mdulo padro e com visibilidade Public,
podem ser usadas na contruo de campos calculados. Veja este exemplo:
SELECT NomeDoProduto, Fatura(Quantidade, PreoUnitrio) AS Valor
FROM [Detalhes do Pedido]

O cdigo do procedimento Fatura fica alojado no mdulo padro.
Function Fatura(Qtd, PreoUnit) As Currency
Microsoft Access Avanado



66
If Qtd < 5 Then ' No tem desconto
Fatura = Qtd * PreoUnit
Else ' Tem desconto de 10% sobre a fatura
Fatura = (Qtd * PreoUnit) * 0.90
End If
End Function

6.2.1.3. Argumento Expressodetabela
O argumento de tabela pode ser apenas o nome de uma tabela, como no exemplo:
SELECT * FROM Produtos
Entretanto, ela pode ser composta por mais de uma tabela, como no exemplo:
SELECT NmeroDoPedido, NomeDoProduto, [Detalhes do Pedido].PreoUnitrio,
Quantidade
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto

No caso anterior, as tabelas Produtos e Detalhes do Pedido esto relacionadas pelo
campo CdigoDoProduto, que constam nas duas tabelas. Relembrando a modelagem de
dados, a cardinalidade entre Produtos e Detalhes do Pedido uma-para-muitos.
CdigoDoProduto na tabela Produtos chave primria (primary key) enquanto
CdigoDoProduto na tabela Detalhes do Pedido chave estrangeira (foreing key).
A clusula INNER JOIN especifica que h um relacionamento entre as tabelas, do tipo
de associao 1. No modo estrutura, o tipo de associao definido na caixa de dilogo
mostrada a seguir.



Os tipos de associaes so:
Tipo de
associao
Clusula SQL Descrio Representao
do conjunto
1 INNER JOIN Inclui somente os registros
cujos valores dos campos
relacionados so iguais. Isto
quer dizer que retorna
somente os dados da
interseo entre as duas

Microsoft Access Avanado



67
tabelas
2 LEFT JOIN Inclui todos os registros da
tabela esquerda e somente
os registros da tabela
direita quando os valores dos
campos relacionados forem
iguais.

3 RIGHT JOIN Inclui todos os registros da
tabela direita e somente os
registros da tabela esquerda
quando os valores dos
campos relacionados forem
iguais.


Dizer qual tabela est direita e qual est esquerda depende da ordem em que elas
so escritas na expresso. Se se quiser incluir todos os registros da tabela produtos, pode se
usar tanto LEFT JOIN quanto RIGHT JOIN, dependendo a ordem em que os nomes das
tabelas so escritas.
FROM Produtos LEFT JOIN [Detalhes do Pedido]
Isto equivale a:
FROM [Detalhes do Pedido] RIGHT JOIN Produtos
Naturalmente, a ordem da escrita dos nomes das tabelas no tem efetio quando se usa
INNER JOIN.
INNER JON, LEFT JOIN e RIGHT JOIN simplesmente diz quais tabelas e os tipos de
associaes existentes entre elas, mas no define quais os campos relacionados. Aps escrever
os nomes das tabelas e o tipo de associao, acrescenta-se a clusula ON seguido dos campos
relacionados. No exemplo a seguir, as tabelas so relacionados pelo campo CdigoDoProduto
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto

Note que como os nomes dos campos so iguais nas duas tabelas, necessrio colocar
o nome da tabela antes dos nomes dos campos, separados por ponto.
Normalmente o operador de comparao o =. Mas voc pode usar >, >=, <., <= ou
<>. No comum usar operadores que no seja o =, mas se voc us-los, o modo Estrutura
no consegue exibir este relacionamento.
Casos os relacionamento seja com dois ou mais campos, voc deve usar o operador
lgico AND.
SELECT *
FROM Table1 INNER JOIN Table2
ON (Table1.B = Table2.B) AND (Table1.A = Table2.A)

Voc pode mais de duas tabelas relacionadas. O modo de contruo o mesmo.
SELECT *
FROM Produtos INNER JOIN (Pedidos INNER JOIN [Detalhes do Pedido]
ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido)
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto
Microsoft Access Avanado



68

Note o uso de parnteses na juno entre Pedidos e Detalhes do Pedido. Somente
depois desta juno feita a juno com Produtos.
6.2.1.4. Tabelas em banco de dados externos
Como voc viu na introduo deste cursos, dados e processos residem em arquivos
diferentes. Voc pode construir uma consulta ou uma expresso SQL para acess-los sem ter
que vincular tabelas.
Isto possvel com a clusula IN do SQL.
SELECT * FROM Clientes INNER JOIN Pedidos
ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente
IN "D:\CursosOffice\AccessBasico\NW.mdb"

No caso, as duas tabelas devem estar no mesmo banco de dados. Voc no pode
recuperar dados de tabelas em bancos de dados distintos.
Voc pode acessar tabelas externas em formatos diferente, como Excel, Paradox ou
dBase. Voc coloca duas aspas seguido dos argumentos Especificador e Origem do tipo de
arquivo. No captulo sobe acesso a banco de dados h a lista completa dos argumentos para a
clusula IN.
SELECT * from Customers
IN "" [Excel 8.0; DATABASE=C:\Book1.xls]

Para melhor desempenho, use tabelas vinculadas em vez da clusula IN.
6.2.1.5. Clusula Where
Enquanto o argumento listadecampos restringe quais campos devem ser recuperados,
a clusula WHERE restringue quais linhas devem ser recuperadas. A cluslua WHERE define
uma expresso lgica sob a qual cada registro validado. Se atender condio imposta pela
expresso lgica, o registro recuperado, caso contrrio desprezado.
Operadores lgicos
A expresso lgica pode conter os um ou mais dos seguintes operadores relacionais:
= (igual)
< (menor)
<= (menor ou igual)
> (maior)
>= (maior ou igual)
<> (diferente)

Os operandos podem ser campos, campos calculados ou constantes que, se forem do
mesmo tipo de dados, podem ser comparados com um dos operadores relacionais.
No Microsoft Jet Database Engine SQL no se admite variveis na expresso lgica.
Se voc utilizar uma varivel e criar a consulta, esta ser assumida como um parmetro da
consulta. Se tentar usar varivel em expresso SQL, tal colocao acarretar em erro em
tempo de execuo.
Microsoft Access Avanado



69
Voc pode usar variveis em expresso SQL por meio de um artifcio, como mostrado
abaixo.
Dim strSql As String
Dim intNumeroPedido As Integer
IntNumeroPedido = InputBox("Qual o nmero do pedido?")
strSql = "SELECT NmeroDoPedido, CdigoDoCliente, DataDoPedido, "
strSql = strSql & "DataDeEntrega, DataDeEnvio "
strSql = strSql & "FROM Pedidos WHERE NmeroDoPedido " & intNumeroPedido

A consulta a seguir recuperar todos os campos da tabela Produtos, retornando
somente os registros cujo valor unitrio (campo PreoUnitrio) seja maior que 10.
SELECT * FROM Produtos WHERE PreoUnitrio > 10
Note que a comparao entre um campo e uma constante. Apesar de o campo ser do
tipo moeda (currency) o valor da constante no contm o smbolo da unidade monetria R$.
Operadores lgicos
Se for necessrio fazer mais comparaes, voc pode utilizar-se dos operadores
lgicos AND, OR e NOT. A comparao se faz entre dois operandos de cada vez. Voc no
pode ter uma expresso do tipo A > B > C. Ela deve ser escrita da forma A > B AND B > C
SELECT * FROM Produtos WHERE PreoUnitrio > 10 AND NOT Descontinuado

Operadores IN, BETWEEN e LIKE
Alm dos operadores relacionais e dos operadores lgicos, voc pode operadores IN,
BETWEEN e LIKE
IN significa contido em um conjunto discreto de valores. Por exemplo, In (A+,
B+, O+, AB+) especifica um critrio que seleciona somente os de tipo sangneo RH
positivo. No confunda o operador IN com a instruo IN.
SELECT * FROM [Detalhes do Pedido]
WHERE CdigoDoProduto IN(14,24,48,55)

Between filtra os valores que esto dentro de um conjunto contnuo de valores. Por
exemplo, Between 1000 AND 5000 seleciona os registros cujo valor de um campo esteja
entre 1000 e 5000, inclusive.
SELECT * FROM Pedidos
WHERE DataDoPedido BETWEEN #01/31/95# AND #05/15/95#

Like permite um comparao parcial de string, conforme a mscara de comparao.
Pode-se usara caracteres especiais na mscara.
Caracter Funo Mscara Retorna
* Retorna caracteres
mltiplos
o*o
*ab*
*ANA
k*
ovo, Ocaso, osso, OTELO
abc, Abdomem, cabea
Fabiana, cana, CABANA
Katana, kibe, kamikaze
? Retorna carater simples o?o Oco, ovo, OMO
# Retorna dgito simples MI# Mi6, mi2, MI0
[] Retorna intervalo de
valores
b[a-m] Ba, bb, BC, BJ, bf
Microsoft Access Avanado



70
[!] Retorna valores fora do
intervalo
b[!a-m]
A[!0-9]
bx, BW, BV
AA, A$, ac, A+

SELECT * FROM Clientes
WHERE NomeDoContato LIKE "mar*"

Outras expresses
A expresso lgica da clusula WHERE pode conter ainda as constantes definidas
pelo sistema True e False, expresses (como Is Null), funes do VBA e funes definidas
pelo usurio.
SELECT * FROM Funcionarios
WHERE False

SELECT * FROM Pedidos
WHERE DateDiff("d, DataDoPedido, DataDeEntrega) > 5

SELECT NomeDaEmpresa
FROM Clientes LEFT JOIN Pedidos
ON Clientes.CdigoDoCliente = Pedidos.CdigoDoCliente
WHERE NmeroDoPedido Is Null

6.2.1.6. Funes agregadas SQL
Funces agregadas SQL efetuam clculos com um conjunto de registros, retornando
valores sumarizados. Por exemplo, se voc quiser saber o valor total dos pedidos, ter de usar
a funo agregada SUM. Voc no saber o valor de cada pedido, mas sim a soma de todos os
registros de pedidos.
As funes agregadas so:
FUNO FINALIDADE
AVG (Mdia) Calcula a mdia aritmtica de um conjunto de valores contidos em um campo especificado
em uma consulta.
COUNT (Contar) Calcula o nmero de registros que retornam de uma consulta.
MAX (Mx) Retorna o valor mximo de um conjunto de valores contidos em um campo especificado em
uma consulta
MIN (Mn) Retorna o valor mnimo de um conjunto de valores contidos em um campo especificado em
uma consulta.
STDEV,
STDEVP (Desv)
Retorna a estimativa do desvio padro de uma populao ou de uma amostra de uma
populao representada como um conjunto de valores contidos em um campo especificado
em uma consulta.
SUM (Soma) Retorna a soma de um conjunto de valores contidos em um campo especificado em uma
consulta.
VAR, VARP
(Var)
Retorna as estimativas da varincia de uma populao ou de uma amostra da populao
representada como um conjunto de valores contidos em um campo especificado em uma
consulta.
FIRST
(Primeiro)
Retorna o primeiro registro de um conjunto de registros retornado por uma consulta.
LAST (ltimo) Retorna o primeiro registro de um conjunto de registros retornado por uma consulta.

Exemplos:
SELECT COUNT(*) AS [Qtd Itens] FROM [Detalhes do Pedido]

Microsoft Access Avanado



71
SELECT MIN(DateDiff("d, DataDoPedido, DataDeEntrega)) AS [Prazo mnimo],
AVG(DateDiff("d, DataDoPedido, DataDeEntrega)) AS [Prazo Mdio],
MAX(DateDiff("d, DataDoPedido, DataDeEntrega)) AS [Prazo Mximo]
FROM Pedidos

6.2.1.7. Clusulas GROUP BY e HAVING
As clusulas GROUP BY e HAVING so usadas em conjunto com as funes
agregadas SQL.
GROUP BY agrupa os registros por um ou mais campos. Por exemplo, se voc quiser
saber o prazo mdio de entrega de cada pedido, deve agrupar pelo campo do
NmeroDoPedido
SELECT Pedidos.NmeroDoPedido,
Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) AS [Prazo Mdio]
FROM Pedidos
GROUP BY Pedidos.NmeroDoPedido

Todos os campos que aparecerem na lista de campos devem obrigatoriamente ser um
campo de agrupamento ou alvo de uma funo SQL. A consulta abaixo falhar porque
DataDoPedido no faz parte de GROUP BY nem de uma funo agregada.
SELECT NmeroDoPedido, DataDoPedido,
Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) AS [Prazo Mdio]
FROM Pedidos
GROUP BY NmeroDoPedido

A clusula HAVING semelhante ao WHERE, porm atua sobre os registros
retornados. O exemplo abaixo primeiramente calcula a mdia e depois filtra os registros cujas
mdias sejam maior que 20.
SELECT NmeroDoPedido, DataDoPedido,
Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) AS [Prazo Mdio]
FROM Pedidos
GROUP BY NmeroDoPedido
HAVING Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) > 20

A clusula WHERE atua antes da agregao. No exemplo abaixo, a clusula WHERE
primeiramente filtra somente os pedidos do ano 1996, depois calculada a mdia e a clusula
HAVING filtra os que ultrapassaram a mdia de 20 dias.
SELECT NmeroDoPedido,
Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) AS [Prazo Mdio]
FROM Pedidos
WHERE Year(DataDoPedido) = 1996
GROUP BY NmeroDoPedido
HAVING Avg(DateDiff("d",[DataDoPedido],[DataDeEntrega])) > 20


6.2.2. Consulta de atualizao
A consulta de atualizao no retorna nenhum conjunto de registros, mas sim atualiza
um ou mais campos de uma tabela ou mais tabelas.
UPDATE {expressodetabela}
SET campo1 = valor1 [, campo2 = valor2] [, campoN = valorN]
Microsoft Access Avanado



72
[WHERE {condioWhere}]

No exemplo abaixo, os campos Via e Quantidade so atulizados. Os campos so de
tabelas distintas. A atualizao afeta somente os itens de produtos descontinuados.

UPDATE Produtos INNER JOIN (
Pedidos INNER JOIN [Detalhes do Pedido]
ON Pedidos.NmeroDoPedido = [Detalhes do Pedido].NmeroDoPedido )
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto
SET Pedidos.Via = 1, [Detalhes do Pedido].Quantidade = 6
WHERE Descontinuado


6.2.3. Consulta de excluso
A consulta de excluso elimina os registros de uma nica tabela. Se voc no definir
uma condio na clusula WHERE, todos os registros sero excludos. A tabela de onde o
registros forem excludos pode estar relacionada a outras tabelas.
DELETE [tabela.*]
FROM {expressodetabela}
[WHERE {condioWhere}]

Para excluir registros de uma nica tabela, sem relacionamento, a sintaxe :
DELETE * FROM {tabela}

Caso haja tabelas relacionadas, voc deve especificar o nome da tabela de onde osz
registros devem ser excludos. Exemplo:
DELETE [Detalhes do Pedido].*
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CdigoDoProduto = [Detalhes do Pedido].CdigoDoProduto
WHERE Descontinuado
Se a tabela possuir integridade referencial do tipo resctrict, os registros no sero
excludos. Se a integridade for do tipo cascade, os registros da tabela relacionada tambm
sero excludos.

6.2.4. Consulta acrscimo
Voc pode inserir um nico registro em uma tabela ou vrios registros provenientes de
uma seleo em outra tabela.
Para um nico registro, a sintaxe :
INSERT INTO {tabela} [(campo1, campo2, campoN, ...)]
VALUES (valor1, valor2, valorN, ...)

A identificao da lista de campos opcional. Se voc no a defnir, os valores sero
inseridos na mesma ordem em que os campos foram criados no modo Estrutura da tabela.
INSERT INTO Table1
VALUES ("0033", "PEG SUE", 2, "SP")

Microsoft Access Avanado



73
Se definir a lista de campos, cada valor estar associado ao campo na ordem em que
foram digitados na instruo INSERT.

INSERT INTO Table1 (EstadoCivil, UF, Nome, Matricula)
VALUES ( 1, "MG", "CARLOS KOGA","0021")

Se voc no especificar todos os campos da tabela, o campo omitido assumir o valor
padro ou nulo, caso as propriedades Valor padro e Requerido estejam configurados na
estrutura da tabela. Suponha que os campos EstadoCivil possua a propriedade Requerido=No
e UF possui a propriedade Valor Padro = MG. As instrues abaixo inseriro dois
registros com o campo EstadoCivil como nulo e UF com MG.
INSERT INTO Table1 (Matricula, Nome)
VALUES ("0021", "CARLOS KOGA")

INSERT INTO Table1
VALUES ("0033", "PEG SUE")

Voc pode explicitamente inserir nulo usando a constante NULL.
INSERT INTO Table1
VALUES ("0033", "PEG SUE", NULL)

A insero deve respeitar todas as restries da tabela, tais como unicidade de chave
primria, integridade referrencial, valor requerido, regra de validao, tamanho do campo e
compatibilidade de tipo de dados.
Voc pode inserir registros em uma tabela com registros provenientes de outras
tabelas.
INSERT INTO {tabela} IN bancodedadosexterno
(campo1, campo2, campoN, . . .)
SELECT argumentosSelect

6.2.5. Consulta de criao de tabela





Microsoft Access Avanado



74

7. FORMULRIOS AVANADOS
Os formulrios podem ser usados como:
Formulrio de manuteno de tabelas
Caixa de dilogo
Formulrio de consulta
Caixa de mensagem

Formulrios de manuteno de tabelas podem ser criadas facilmente pelo Assistente
de Formulrio. Tais formulrios, criados por Assistentes, so simples e carecem de
aprimoramento. Via programao, podemos aperfeio-las, incluindo cdigo de validao de
dados, controle de fluxo, botes de navegao personalizados, botes para incluso de novos
registros, para excluso de registros, para alterao de dados e para pesquisa.

7.1. FORMULRIO DE MANUTENO DE TABELAS

Um formulrio simples, criado pelo Assistente de Formulrio ou diretamente pelo
modo estrutura, possui uma fonte de dados - a propriedade Origem do registro
(RecordSource), e controles acoplados que se referem a cada um dos campos da origem do
registro. Controles acoplados possuem o nome do campo na propriedade Origem do controle
(ControlSource).
Os controles podem ser de diversos tipos, dependendo da caracterstica do dado que o
campo contm, como por exemplo caixa de texto, caixa de combinao, caixa de verificao,
caixa de grupo, etc.
Voc pode ter tambm controles calculados, cuja propriedade Origem do controle
contm uma expresso.
A navegao de registros, isto , o avano e retrocesso de registros pelo formulrio,
feita pelos Botes de navegao (NavigationButtons). Os botes de navegao incluem a
operao de incluso de novos registros
As operaes de filtragem, excluso e pesquisa de registros e impresso do formulrio
so realizadas pela barra de menus ou pela barra de ferramentas.
Note que todas as operaes citadas acontecem a partir de uma nica tela. No h um
formulrio especfico para consulta, outro incluso e outro para edio (alterao e excluso).
Isto leva pergunta: Qual a melhor forma de construir formulrios de manuteno de
tabelas?. A resposta sempre Depende.
7.1.1. Botes de Navegao Personalizados
Em vez de usar os botes de navegao do formulrio, voc pode criar botes
personalizados para navegar pelos registros. Basta criar botes de comando e vincular a
cdigo VBA. A propriedade Botes de navegao do formulrio definida como No.
Microsoft Access Avanado



75


Private Sub cmdFirstRecord_Click()
DoCmd.RunCommand acCmdRecordsGoToFirst
End Sub

Private Sub cmdPreviousRecord_Click()
On Error Resume Next
DoCmd.RunCommand acCmdRecordsGoToPrevious
End Sub

Private Sub cmdNextRecord_Click()
On Error Resume Next
DoCmd.RunCommand acCmdRecordsGoToNext
End Sub

Private Sub cmdLastRecord_Click()
DoCmd.RunCommand acCmdRecordsGoToLast
End Sub

O boto de comando cmdPreviousRecord possui a linha On Error Resume Next para
que no ocorra erro ao tentar retroceder um registro quando se est no primeiro registro. O
boto de comando cmdPreviousRecord possui a linha On Error Resume Next para que no
ocorra erro ao tentar avanar um registro quando se est no ltimo registro.
H um erro de comportamento neste formulrio. A navegao deveria ocorrer somente
com os botes personalizados. Entretanto, a tecla Tab, alm de mudar de campo, muda de
registro quando se encontra no ltimo campo. Para desabilitar esta caractersitca, altere a
propriedade de formulrio Ciclo (Cycle) para Registro corrente (Current Record).
Outro problema que cmdNextRecord adiciona um registro ao tentar avanar alm do
ltimo registro. Para resolver isto, altere a propriedade de formulrio Permitir adio (Allow
Additions) para No.






Microsoft Access Avanado



76
7.2. CAIXA DE DILOGO
Uma caixa de dilogo serve para captar dados que sero enviados como parmetros de
procedimento, consulta, relatrio ou outro formulrio.
Antes de explicar como enviar parmetros, voc deve definir as propriedades de um
formulrio para desempenhar o papel de caixa de dilogo:
Propriedade do formulrio Valor
Guia Formato (Format)
Legenda (Caption) O ttulo da caixa de dilogo
Modo padro (Default View) Formulrio simples (Single form)
Modos permitidos (Views Allowed) Formulrio (Form)
Barras de rolagem (Scroll bars) Nenhuma (Neither)
Seletores de registro(Record Selectors) No (No)
Botes de navegao (Navigation Buttons) No (No)
Linhas divisrias (Dividing Lines) No (No)
AutoCentralizar (Auto Center) Sim (Yes)
Estilo da vorda (Border Style) Dilogo (Dialog)
Botes Min Max (Min Max Buttons) Nenhum (None)
Guia Dados (Data)
Origem do registro (RecordSource) Vazio

Uma caixa de dilogo ter dois botes de comando: Um para prosseguir (Ok) e outro
para fechar a caixa de dilogo (Fechar). Normalmente, as propriedades e eventos dos botes
de comando so:
Propriedade Valor
Legenda (Caption) &Ok
Nome (Name) cmdOk
Padro (Default) Sim (Yes)
AoClicar (Onclick) Chamada especfica (Ver exemplos a seguir)

Propriedade Valor
Legenda (Caption) &Fechar
Nome (Name) cmdFechar
Cancelar (Cancel) Sim (Yes)
AoClicar (OnClick) Private Sub cmdFechar_Click()
DoCmd.Close
End Sub

Normalmente, controles caixas de texto so no acopladas e recebem os valores que
sero passados como parmetros para proicedimentos, consultas parametrizadas, relatrios e
formulrios.

Microsoft Access Avanado



77
7.2.1. Passagem De Parmetros Para Procedimento
Esta a tcnica mais simples. O procedimento chamado pelo formulrio pode ser Sub
ou Function definido em mdulo atrs do formulrio (mdulo de classe de formulrio) ou em
mdulo padro. O evento AoClicar do boto cmdOk far a chamada do procedimento
enviando o valor do controle como argumento do procedimento.
Private Sub cmdOk_Click()
Dim curValor As Currency
Dim strExtenso As String
curValor = Me.txtValor
strExtenso = Extenso(curValor)
End Sub

7.2.2. Passagem De Parmetros Para Consulta Parametrizada
As consultas parametrizadas possuem critrio dinnico, ou seja, o valor do critrio de
filtragem da consulta informado quando da execuo da consulta. Por exemplo, a consulta
seleo, cujo cdigo SQL mostrado a seguir, pedir o valor do parmetro [Qual o nmero do
pedido] por meio de uma caixa de dilogo simples.
SELECT Pedidos.NmeroDoPedido, Pedidos.CdigoDoCliente,
Pedidos.DataDoPedido
FROM Pedidos
WHERE Pedidos.NmeroDoPedido = [Qual o nmero do pedido];

Esta no uma forma elegante de passar parmetros para consulta, pois para cada
parmetro da consulta ser aberta uma caixa de dilogo. Estas caixas de dilogo de consulta
parametrizada no validam nenhum dado informado pelo usurio.
A soluo criar um formulrio do tipo caixa de dilogo que receber todos os
parmetros de uma s vez e o boto Ok acionar a consulta. Os parmetros podem ser
formatados e/ou validados pelo formulrio antes de ser enviado para a consulta, garantindo
que o usurio informe parmetros vlidos para a consulta.
Para demonstrar a soluo da consulta do exemplo acima, construiremos uma caixa de
dilogo chamada frmDlg_Consulta_Pedido. Ela conter os botes cmdOk e cmdFechar, como
visto anteriormente. A caixa de texto txtNumeroPedido no acoplada e o seu valor ser
passado como parmetro para a consulta qryConsulta_Pedido.
Microsoft Access Avanado



78


O boto cmdOk conter o seguinte cdigo VBA associado ao evento AoClicar
Private Sub cmdOk_Click()
DoCmd.OpenQuery "qryConsulta_Pedido"
End Sub

A consulta qryConsulta_Pedido ter o seguinte cdigo SQL.
SELECT Pedidos.NmeroDoPedido, Pedidos.CdigoDoCliente,
Pedidos.DataDoPedido
FROM Pedidos
WHERE Pedidos.NmeroDoPedido =
Forms![frmDlg_Consulta_Pedido].txtNumeroPedido;

A consulta funciona porque o formulrio est aberto e seus controles podem ser
acessados por outros objetos do Access.
Esta tcnica til para aplicativos em que a segurana no um ponto importante.
Note que a janela folha de dados da consulta, caso seja uma consulta seleo ou referncia
cruzada, aberta, permitindo que o usurio possa alterar a estrutura, modificar os dados ou
excluir registros. A tcnica de tela de consulta, como veremos mais adiante, resolve estes
problemas.

7.2.3. Passagem De Parmetros Para Relatrio

s vezes precisamos de relatrios mais flexveis, como por exemplo, emitir os pedidos
feitos entre duas datas. Precisamos passar a data inicial e a data final para a origem dos dados
(normalmente uma consulta seleo).
Uma alternativa de soluo criar uma consulta parametrizada, passando parmetros
pelo formulrio. O relatrio ento se basear nesta consulta.
Por exemplo, o formulrio frmDlg_Relatorio_Pedido contm as caixas de texto no
acopladas txtDataInicial e txtDataFinal. Estes controles so parmetros para a consulta
qryRelatorio_Pedido.
Microsoft Access Avanado



79


A consulta qryRelatorio_Pedido possui o cdigo SQL.
SELECT Pedidos.NmeroDoPedido, Pedidos.CdigoDoCliente,
Pedidos.DataDoPedido
FROM Pedidos
WHERE Pedidos.DataDoPedido BETWEEN
Forms![frmDlg_Relatorio_Pedido].txtDataInicial AND
Forms![frmDlg_Relatorio_Pedido].txtDataFinal;

O relatrio rptRelatorio_Pedido baseado na consulta qryRelatorio_Pedido, ou seja, a
sua propriedade Origem do registro (RecordSource) qryRelatorio_Pedido.
O boto cmdOk do formulrio frmDlg_Relatorio_Pedido contm o cdigo VBA
associado ao evento AoClicar.
Private Sub cmdOk_Click()
DoCmd.OpenReport "rptRelatorio_Pedido", acViewPreview
End Sub

Esta tcnica difcil de ser administrada devido interao de trs objetos do Access
(um formulrio, uma consulta e um relatrio). Quanto mais objetos o banco de dados possui,
maior a complexidade e mais difcil sua manuteno. Alm disso, esta tcnica restringe-se a
filtrar a origem do registro utilizando uma consulta parametrizada.
Uma outra tcnica mais elaborada baseia-se na possibilidade de acessar controles de
formulrios que esto abertos. Controles de formulrios abertos possuem visibilidade public,
ou seja, eles so acessveis em qualquer parte do Access. por isso que consultas
parametrizadas funcionam.
Uma caixa de dilogo para abrir relatrios podem construir uma expresso SQL em
tempo de execuo, armazen-la em uma caixa de texto oculta e ser usada como parmetro
para um relatrio. Desta forma, elimina-se a necessidade de se construir um objeto consulta,
diminuindo-se a quantidade de objetos no banco de dados e, consequentemente, a
complexidade de manuteno. Alm disso, outros parmetros podem direcionar o
comportamento do relatrio, tal como definir a ordem de classificao, incluir mensagem ad-
hoc no relatrio, ocultar/exibir sees do relatrios, dentre outras possibilidades.
Para demonstrar esta tcnica, usaremos o mesmo exemplo acima.
O formulrio frmDlg_Relatorio_Pedido conter adicionalmente uma caixa de texto
txtSql, com estas propriedades configuradas:
Propriedade Valor
Visivel (Visible) Sim (Yes)
Parada de tabulao (Tab Stop) No (No)
Microsoft Access Avanado



80

O boto cmdOk conter o cdigo VBA associado ao evento AoClicar:
Private Sub cmdOk_Click()
Dim strSql As String
Dim strDataInicial As String
Dim strDataFinal As String

strDataInicial = Me.txtDataInicial
strDataFinal = Me.txtDataFinal

strSql = "SELECT Pedidos.NmeroDoPedido, Pedidos.CdigoDoCliente, "
strSql = strSql + "Pedidos.DataDoPedido "
strSql = strSql + "FROM Pedidos "
strSql = strSql + "WHERE Pedidos.DataDoPedido BETWEEN #"
strSql = strSql + strDataInicial + "# AND #" + strDataFinal + "#"

Me.txtSql = strSql
DoCmd.OpenReport "rptRelatorio_Pedido", acViewPreview
End Sub

O relatrio rptRelatorio_Pedido ter a propriedade Origem do registro
(RecordSource) vazia e o seguinte cdigo associado ao evento AoAbrir.
Private Sub Report_Open(Cancel As Integer)
Me.RecordSource = Forms![frmDlg_Relatorio_Pedido].txtSql
End Sub

Usando esta tcnica, podemos modificar outras propriedades do relatrio em tempo de
execuo, usando parmetros da caixa de dilogo. O prximo exemplo acrescenta a opo de
ordem de classificao dos dados do relatrio. Uma caixa de grupo permite escolher se a
ordem ser por Nmero do pedido ou por Cdigo do cliente. Lembre-se que a clusula
ORDER BY da origem do registro no afeta a classificao do relatrio.


A propriedade que define a ordem de classificao dos dados no relatrio
GroupLevel. Um relatrio pode ter at 10 nveis de grupo. Assim, a propriedade GroupLevel
funciona como um vetor de 10 elementos. GroupLevel(0) o primeiro nvel de grupo.
GroupLevel possui as propriedades:
Propriedade Valor
Microsoft Access Avanado



81
ControlSource Campo ou expresso pelo qual os dados sero classificados
GroupOn Agrupamento dos dados. O padro agrupar por cada valor.
GroupInterval O intervalo pelo qual os dados so agrupados. O padro 1 (intervalo para cada valor)
KeepTogether Mantm ou no o grupo na mesma pgina quando impresso. O padro 0 (no
mantm na mesma pgina)
SortOrder False para ascendente (padro), True para descendente

O evento AoAbrir do relatrio rptRelatorio_Pedido conter o cdigo:
Private Sub Report_Open(Cancel As Integer)
Dim bytOpcao As Byte

Me.RecordSource = Forms![frmDlg_Relatorio_Pedido].txtSql

bytOpcao = Forms!frmDlg_Relatorio_Pedido.grpClassificacao
If bytOpcao = 1 Then
Me.GroupLevel(0).ControlSource = "NmeroDoPedido"
Else
Me.GroupLevel(0).ControlSource = "CdigoDoCliente"
End If
End Sub


7.2.4. Passagem De Parmetros Para Formulrio

A passagem de parmetros de um formulrio para outro pode usar a mesma tcnica de
passagem de parmetros para relatrio, mostrada acima. Entretanto, formulrios podem
receber parmetros de outra forma.
O objeto DoCmd possui o mtodo OpenForm, cuja sintaxe :
DoCmd.OpenForm formname[, view][, filtername][, wherecondition][, datamode][, windowmode][, openargs]

Argumento Descrio
formname O nome do formulrio a ser aberto.
view Uma das seguintes constantes intrnsecas:
acDesign
acFormDS
acNormal (padro)
acPreview

acNormal abre o formulrio no modo formulrio. Se voc deixar
em branco, assume o padro.
filtername Uma expresso que o nome de uma consulta vlida no banco de
dados. Pode ser tambm uma expresso SQL.
wherecondition Uma expresso de at 32768 caracteres para critrio de filtragem.
A sintaxe a mesma para a clusula WHERE da linguagem SQL,
exceto que no preciso colocar a palavra WHERE.
datamode Uma das seguintes constantes intrnsecas:
acFormAdd
acFormEdit
acFormPropertySettings (padro)
acFormReadOnly
Microsoft Access Avanado



82

Se voc deixar em branco, assume o padro, que abrir o
formulrio de acordo com o modos atribudo nas propriedades
Permitir edio (AllowEdits), Permitir excluso (AllowDeletions),
Permitir adio (AllowAdditions) e Entrada de dados
(DataEntry).
windowmode Uma das seguintes constantes intrnsecas:
acDialog
acHidden
acIcon
acWindowNormal (padro)
Se voc deixar em branco, assume o padro.
openargs Uma expresso literal passada como argumento.

Os argumentos filtername e wherecondition compem a propriedade Filtro (Filter) do
formulrio. Se voc especificar ambas, o valor da propriedade Filtro ser uma expresso
lgica com as duas condies ligadas pelo operador lgico AND.
Por exemplo, se filtername for definido como:
"SELECT Clientes.* FROM Clientes WHERE Left([CdigoDoCliente],1)='A'"
a propriedade Filtro ter o valor:
(Left([CdigoDoCliente],1)='A')

Se alm de filtername for especificado wherecondition como:
"Cidade = 'Mxico D.F.'"
a propriedade Filtro ter o valor:
(Cidade = 'Mxico D.F.') AND (Left([CdigoDoCliente],1)='A')

Voc pode construir um filtro em tempo de execuo usando os argumentos filtername
e wherecondition. Por exemplo, suponha que o formulrio frmClientes apresente todos os
registros da tabela Clientes do banco de dados Northwind. Voc deseja consultar/editar
somente os registros dos clientes de uma cidade especificada em uma caixa de dilogo
frmDlg_Formulario_Clientes. O procedimento de evento AoClicar do boto cmdOk da caixa
de dilogo conter este cdigo:
Private Sub cmdOk_Click()
Dim strCidade As String
Dim strWhereCondition As String

strCidade = Me.txtCidade ' uma caixa de texto no acoplada
strWhereCondition = "Cidade = '" + strCidade + "'"
DoCmd.OpenForm "frmClientes", , , strWhereCondition
End Sub

Uma outra forma de passar parmetros de um formulrio para outro usar o
argumento openargs do DoCmd. openargs um texto que pode ser capturado no formulrio
especificado em formname usando a propriedade de formulrio OpenArgs. Esta propriedade
deve estar em um cdigo dentro do procedimento de evento AoAbrir do formulrio que ser
aberto por DoCmd.
Microsoft Access Avanado



83
Suponha que voc tenha que abrir o formulrio frmClientes e queira posicionar no
registro referente ao cliente ANTON. Construa um procedimento que abra o formulrio
frmClientes, passando ANTON como argumento. Aqui, o procedimento chama-se
AbreCliente.
Sub AbreCliente()
DoCmd.OpenForm "frmClientes", , , , , , "ANTON"
End Sub

O procedimento de evento AoAbrir do formulrio frmClientes conter o cdigo:
Private Sub Form_Open(Cancel As Integer)
Dim strCliente As String
Dim rstCopia As Recordset
If Not IsNull(Me.OpenArgs) Then
strCliente = Me.OpenArgs
Set rstCopia = Me.RecordsetClone
rstCopia.FindFirst "CdigoDoCliente= '" + strCliente + "'"
If Not rstCopia.NoMatch Then
Me.Bookmark = rstCopia.Bookmark
End If
End If
End Sub

A propriedade RecordsetClone do formulrio cria uma cpia da origem do registro
(propriedade RecordSource do formulrio) e armazena na varivel rstCopia. usado o
mtodo FindFirst para localizar o cliente ANTON, valor este capturado pela propriedade
OpenArgs do formulrio. A propriedade NoMatch do objeto recordset (veja Acesso a Banco
de Dados) indica se o registro foi localizado ou no. Caso seja localizado, a propriedade
Bookmark posiciona o registro correto para ser exibido no formulrio frmClientes.

7.3. FORMULRIO DE CONSULTA
Abrir uma consulta criada na guia Consulta da janela Banco de Dados a maneira
mais simples de visualizar dados. Entretanto, o modo Folha de Dados de uma consulta possui
uma apresentao pobre. Na realidade, o modo Folha de Dados no s para consulta, pois
permite que o usurio apague ou altere dados.
Microsoft Access Avanado



84

Usar formulrio e sub-formulrio uma boa alternativa para se visualizar dados
somente para leitura.


O primeiro passo criar um subformulrio para a apresentar os detalhes. As principais
propriedades do subformulrio so:
Propriedade Valor
Nome SubfrmDetalhes_Pedido
Origem do Registro SELECT [Detalhes do Pedido].NmeroDoPedido,
Produtos.NomeDoProduto, [Detalhes do
Pedido].PreoUnitrio, [Detalhes do
Pedido].Quantidade, [Detalhes do Pedido].Desconto,
([Detalhes do Pedido].[PreoUnitrio]-[Detalhes do
Pedido].[PreoUnitrio]*[Desconto])*[Quantidade]
AS SubTotal
FROM Produtos INNER JOIN [Detalhes do Pedido]
ON Produtos.CdigoDoProduto = [Detalhes do
Pedido].CdigoDoProduto;
Modo Padro Formulrios contnuos
Microsoft Access Avanado



85
Barras de Rolagem Somente vertical
Seletor de Registros No
Botes de Navegao No
Permitir edies No
Permitir excluses No
Permitir adies No

O formulrio principal conter o subformulrio, entretanto, no haver vnculo entre
eles, ou seja, no h um campo que relacione os valores do formulrio e do subformulrio. A
propriedade Origem do Registro (RecordSource) do subformulrio ser definido via
programao.
Pode haver um ou mais caixas de texto ou caixa de combinao no acoplados, cujos
valores sero o filtro para a apresentao dos registros no subformulrio. Por esta razo no
necessrio haver vinculao entre formulrio e subformulrio. Neste exemplo, o filtro feito
pela caixa de combinao cboNumeroPedido. Este valor ser usado na construo da
expresso SQL que ser a Origem do Registro do subformulrio. A instruo SQL criada ao
abrir o formulrio, ao clicar no boto Buscar e ao clicar o boto Limpar.
A instruo SQL no evento AoAbrir a mesma no evento AoClicar. Constri-se a
instruo tal qual foi feito no subformulrio, mas acrescenta-se a clusula WHERE False
para no apresentar nenhum registro.
Private Sub Form_Open(Cancel As Integer)
Dim strSql As String

strSql = "SELECT [Detalhes do Pedido].NmeroDoPedido,
Produtos.NomeDoProduto, "
strSql = strSql + "[Detalhes do Pedido].PreoUnitrio , [Detalhes do
Pedido].Quantidade, "
strSql = strSql + "[Detalhes do Pedido].Desconto, "
strSql = strSql + "([Detalhes do Pedido].[PreoUnitrio]-[Detalhes do
Pedido].[PreoUnitrio]*[Desconto])*[Quantidade] AS SubTotal "
strSql = strSql + "FROM Produtos INNER JOIN [Detalhes do Pedido] ON "
strSql = strSql + "Produtos.CdigoDoProduto = [Detalhes do
Pedido].CdigoDoProduto where false"
Me.subfrmDetalhes_Pedido.Form.RecordSource = strSql
Me.subfrmDetalhes_Pedido.Requery
Me.txtTotal = 0
Me.txtRegistros = 0
End Sub

Na linha de instruo Me.subfrmDetalhes_Pedido.Form.RecordSource = strSql
atribudo o valor da propriedade Origem do Registro do subformulrio. Na linha seguinte
utilizado o mtodo Requery para que o subformulrio re-execute a instruo SQL.

O evento AoClicar possui um cdigo semelhante, apenas h o acrscimo da inibio
do boto Exportar XLS e a limpeza do valor na caixa de combinao cboNumeroPedido.

Private Sub cmdLimpar_Click()
Dim strSql As String

Microsoft Access Avanado



86
strSql = "SELECT [Detalhes do Pedido].NmeroDoPedido,
Produtos.NomeDoProduto, "
strSql = strSql + "[Detalhes do Pedido].PreoUnitrio , [Detalhes do
Pedido].Quantidade, "
strSql = strSql + "[Detalhes do Pedido].Desconto, "
strSql = strSql + "([Detalhes do Pedido].[PreoUnitrio]-[Detalhes do
Pedido].[PreoUnitrio]*[Desconto])*[Quantidade] AS SubTotal "
strSql = strSql + "FROM Produtos INNER JOIN [Detalhes do Pedido] ON "
strSql = strSql + "Produtos.CdigoDoProduto = [Detalhes do
Pedido].CdigoDoProduto WHERE False"
Me.subfrmDetalhes_Pedido.Form.RecordSource = strSql
Me.subfrmDetalhes_Pedido.Requery
Me.txtTotal = 0
Me.txtRegistros = 0
Me.cboNumeroPedido = ""
Me.cmdExportToExcel.Enabled = False
End Sub

O boto Buscar que realiza a busca dos registros a serem apresentados no
subformulrio. No exemplo, foram includas duas funcionalidades opcionais: clcular o valor
do pedido e a quantidade de itens a serem apresentados nas caixas de texto txtTotal e
txtRegistros e criar uma consulta para que os dados sejam exportados para o MS Excel.
Note que o boto Exportar XLS somente habilitado (propriedade Enabled) aps a
criao da consulta qryExportXLSTemp
Private Sub cmdBuscar_Click()
Dim rst As Recordset
Dim strSql As String
Dim intNumPedido As Variant
Dim curTotal As Currency
Dim dblQtdRegistros As Double
Dim qdf As QueryDef

' Cria a expresso SQL para que o subformulrio apresente os dados
intNumPedido = Me.cboNumeroPedido
strSql = "SELECT [Detalhes do Pedido].NmeroDoPedido,
Produtos.NomeDoProduto, "
strSql = strSql + "[Detalhes do Pedido].PreoUnitrio , [Detalhes do
Pedido].Quantidade, "
strSql = strSql + "[Detalhes do Pedido].Desconto, "
strSql = strSql + "([Detalhes do Pedido].[PreoUnitrio]-[Detalhes do
Pedido].[PreoUnitrio]*[Desconto])*[Quantidade] AS SubTotal "
strSql = strSql + "FROM Produtos INNER JOIN [Detalhes do Pedido] ON "
strSql = strSql + "Produtos.CdigoDoProduto = [Detalhes do
Pedido].CdigoDoProduto "
strSql = strSql + "WHERE [Detalhes do Pedido].NmeroDoPedido = " &
intNumPedido
Me.subfrmDetalhes_Pedido.Form.RecordSource = strSql

' Totaliza o valor do pedido
curTotal = 0
dblQtdRegistros = 0
Set rst = Me.subfrmDetalhes_Pedido.Form.RecordsetClone
Do While Not rst.EOF
curTotal = curTotal + rst("Subtotal")
dblQtdRegistros = dblQtdRegistros + 1
rst.MoveNext
Loop
Microsoft Access Avanado



87
rst.Close
Me.txtTotal = curTotal
Me.txtRegistros = dblQtdRegistros

' Cria uma consulta para ser exportada para o MS Excel
On Error Resume Next
CurrentDb.QueryDefs.Delete "qryExportXLSTemp"
Set qdf = CurrentDb.CreateQueryDef("qryExportXLSTemp", strSql)
Me.cmdExportToExcel.Enabled = True
End Sub

Como o boto Buscar cria uma consulta, a qryExportXLSTemp, em tempo de
execuo, podemos aproveit-la para exportar os dados para o Excel pelo mtodo
TransferSpreadsheet do objeto DoCmd.
Existe uma funo definida pelo usurio chamada CaixaDialogo_Save que ser
explicada mais adiante.
Private Sub cmdExportToExcel_Click()
Dim strFileName As String
strFileName = CaixaDialogo_Save("Salvar dados para MS Excel ", CurDir, _
"Microsoft Excel" + Chr$(0) + "*.xls" + Chr$(0), _
"Pedidos", "*.xls")
If strFileName = "" Then
MsgBox "Informe o nome do arquivo!"
Else
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel, _
"qryExportXLSTemp", strFileName
End If
End Sub

Finalmente, o boto Fechar possui o cdigo mais simples.
Private Sub cmdFechar_Click()
DoCmd.Close
End Sub

7.4. CAIXA DE MENSAGEM
O modo mais simples de se ter caixas de mensagem usar a intruo MsgBox ou a
funo MsgBox( ). O inconveniente disto estas caixas de mensagem sempre acarreta uma
pausa na execuo do programa, pois voc deve clicar em pelo menos um dos botes da
caixa.
Voc pode usar uma formulrio somente com mensagens, sem nenhum boto de
comando. Isto til, por exemplo, para exibir uma mensagem AGUARDE enquanto um
processamento longo executado.
Tipicamente um formulrio para ser usado como caixa de mensagem possui as
propriedades:
Propriedade Valor
Modo padro Formulrio simples
Modos permitidos Formulrio
Barras de rolagem Nenhum
Microsoft Access Avanado



88
Seletores de registro No
Botes de navegao No
Auto centralizar Sim
Estilo da borda Fino
Caixa de controle No
Botes Min e Max Ambos desativados
Boto fechar No

O cdigo para apresentar a caixa de mensagem deve ter as seguintes instrues:
DoCmd.OpenForm "nome_do_formulrio"
DoEvents
.
.
DoCmd.Close acForm, "nome_do_formulrio"

A primeira linha do cdigo abre o formulrio no modo formulrio. OpenForm um
mtodo do objeto DoCmd. A segunda contm a funo DoEvents que passa o controle para o
sistema operacional, permitindo que a janela seja exibida. Se no for colocada DoEvents, a
tela ficar congelada e nada ser exibido. A ltima instruo fecha o formulrio.


Microsoft Access Avanado



89
8. ACESSO A BANCO DE DADOS

O acesso a banco de dados no Access usa o modelo DAO Data Access Object e o
mecanismo Jet (Jet Engine).
O DAO um conjunto de classes de objetos que modela a estrutura de um sistema de
banco de dado relacional. Eles oferecem propriedades e mtodos que lhe permitem realizar
todas as operaes necessrias para gerenciar tal sistema, incluindo recursos para criar banco
de dados, definir tabelas, campos e ndices, establecer relaes entre tabelas, navegar e
consultar o banco de dados, e assim por diante.
O Jet Engine traduz estas operaes de objetos de acesso a dados em operaes fsicas
sobre os prprios arquivos de banco de dados, tratando toda a mecnica da interface com os
diferentes bancos de dados suportados.
O Visual Basic, por meio do DAO e do Jet Engine reconhece trs categorias de bancos
de dados:

Bancos de dados nativos
So os bancos que utilizam o formato do Microsoft Access. Eles so criados e manipulados
diretamente pelo Jet Engine, e oferecem a mxima flexibilidade e velocidade.

Bancos de dados externos
So os bancos ISAM (Indexed Sequential Access Method), nos quais esto includos os
formatos dBase III, dBase IV, Btrieve, FoxPro, Paradox, arquivos texto, planilhas Excel e
planilhas Lotus 1-2-3.

Bancos de dados ODBC
So bancos de dados cliente/servidor que atendem ao padro ODBC, tais como o MS SQL
Server e o Oracle.

Existem outros mtodos de acesso a banco de dados que no utilizam o Jet Engine.
Somente para citar:
ODBCDirect
RDO e RDC
Chamada API do OBDC
ADO (ActiveX Data Objects)

8.1. Hierarquia do Objetos DAO

Para usar os objetos de acesso a dados, necessrio conhecer o modelo DAO.

Microsoft Access Avanado



90


No topo da hierarquia est o mecanismo de banco de dados do Jet Engine,
representado pelo objeto DBEngine. Ele o nico objeto que no est contido em nada.
Abaixo dele est uma coleo Workspaces (colees so usadas no plural dos objetos que ela
contm). A nica finalidade das colees conter outros objetos do mesmo tipo.

8.2. Sintaxe para Referenciar Objetos em Coleo

Os membros de uma coleo, isto , os objetos, podem ser acessados por um nmero
ndice base-zero. Assim, o primeiro workspace o Workspaces(0), que o workspace atual
(aquele que criado quando voc abre o Access). O primeiro database o Databases(0), que
o banco de dados atual (o arquivo mdb que est aberto).
Os objetos na hierarquia so identificados por um caminho completo das colees
acumuladas a que pertencem, usando o ponto (.) para separ-los. Assim, o objeto database que
representa o arquivo mdb no qual voc est trabalhando referido como:

DBEngine.Workspaces(0).Databases(0)

Alm do nmero ndice, usa-se uma referncia explcita do nome do objeto dentro da
coleo. Por exemplo, um campo CdigoDoLivro um objeto field dentro de uma coleo
Fields. Se ele for o primeiro campo, ele pode ser referenciado por:

Fields(0)

Ou

Fields(CdigoDoLivro)




Microsoft Access Avanado



91
8.3. Coleo Padro

A maior parte dos objetos de acesso a dados possui uma coleo padro. Por exemplo,
a coleo padro de recordset Fields. Isto permite omitir a coleo da sintaxe.

intCodigo = rst!CdigoDoLivro Obtm o valor do campo CdigoDoLivro

Que equivalente a:

intCodigo = rst.Fields!CdigoDoLivro

Ou :

intCodigo = rst.Fields(CdigoDoLivro)

Ou ainda :

intCodigo = rst.Fields(0)

Note que intCodigo uma varivel do tipo inteiro que armazena o valor do objeto e
no o objeto. Valor umas das propriedades do objeto.


8.4. Referncia a Objetos por meio de Variveis

Cada objeto pode (e s vezes deve) ser atribudo uma varivel do mesmo tipo do
objeto.

Dim wks As Workspace
Dim dbs As Database
Set wks = DBEngine.Workspaces(0)
Set dbs = wks.Databases(0)

Se quiser, pode economizar algumas linhas de cdigo com esta sintaxe:
Dim dbs As Database
Set dbs = DBEngine.Workspaces(0).Databases(0)

Neste caso especfico, a economia pode ser maior se se usar a funo CurrentDb para
retornar o banco de dados atual.
O uso de variveis simplifica a referncia a objetos nas mais baixas nveis da
hierarquia do DAO.

8.5. Propriedades e Mtodos

Microsoft Access Avanado



92
Um dos princpios da orientao a objeto manter dados e procedimentos de um
objeto dentro do prprio objeto. Os dados dos objetos so chamados de propriedades
enquanto que os procedimentos chamam-se mtodos.

Usando variveis para referenciar os objetos, torna-se prtica a programao orientada
a objetos.
Para entender os conceitos acima, vamos usar os objetos recordset e field. Um
Recordset o conjunto de registros retornado por uma tabela, por uma consulta que retorne
registros (seja esta uma consulta previamente criada na guia de Consultas da janela de Banco
de Dados ou criada em tempo de execuo, atravs de comandos SQL). Um field o prprio
campo da tabela.
Para obter um objeto recordset, usa-se o mtodo OpenRecordset do objeto database.
O objeto ento atribudo uma varivel, declarada anteriormente como do tipo Recordset.

Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset(Tabela1)

Abrir um recordset semelhante ao comando USE do Clipper.
Como visto, o objeto field referido por um ndice base-zero ou explicitamente pelo
nome do campo. O objeto field pode ser atribudo uma varivel declarada como do tipo
Field.

Dim fldCampo1 As Field
Set fldCampo1 = rst.Fields(CdigoDoLivro)

Para obter o valor deste objeto, usa-se a propriedade Value.

intCampo = fldCampo1.Value

intCampo uma varivel do tipo inteiro que armazena o valor do objeto e no o
objeto, o qual j referenciado por fldCampo1. Em vez de usar a propriedade Value, pode-se
simplesmente referenciar diretamente o objeto, omitindo-se a propriedade.

intCampo = rst.Fields(CdigoDoLivro)

Para obter os valores dos campos para os demais registros, usa-se o mtodo MoveNext
do objeto recordset. Pode-se, assim, percorrer sequencialmente todo o recordset.

rst.MoveNext

Este mtodo semelhante ao SKIP do Clipper.
A leitura sequencial do recordset ir terminar quando se chegar ao seu fim. A
propriedade EOF do objeto recordset.
Para entender os mtodos e propriedades vistos at agora, veja uma analogia com o
Clipper
Microsoft Access Avanado



93

OPERAO CLIPPER VISUAL BASIC
COLEO/
OBJETO
PROPRIEDADE/MTODO
Abrir arquivo de dados USE
{arquivo}
Database OpenRecordset( {recordset} )
Mover ponteiro de
registro para frente
SKIP Recordset MoveNext
Mover ponteiro de
registro para trs
SKIP 1 Recordset MovePrevious
Ir para o primeiro
registro
GoTop() Recordset MoveFirst
Ir para o ltimo registro GoBottom() Recordset MoveLast
Saltar n registros para
frente ou para trs
SKIP [ n] Recordset Move [ n]
Testar fim de arquivo Eof() Recordset EOF
Testar incio de arquivo Bof() Recordset BOF
Obter o valor de um
campo
{nome do
campo}
Fields



Field
Recordset
Fields({ndice}) ou
Fields( {nome do campo} ) ou
Fields!{nome do campo})

Value
!{nome do campo}
Fechar arquivo de
dados
CLOSE Recordset Close


8.6. Acesso a Banco de Dados Access

Vamos tomar como exemplo os conjuntos de registros abaixo para escrever um cdigo
que percorra todos os registros de um recordset e imprima o valor de seus campos .
O primeiro conjunto de registro refere-se tabela Livros, o segundo tabela Tpicos,
o terceiro consulta seleo qryLivros_versus_Tpicos e o quarto uma consulta gerada em
tempo de execuo, atravs da expresso SQL:

SELECT Tpicos.Tpico, Count(Livros.CdigoDoLivro) AS
Quantidade FROM Tpicos RIGHT JOIN Livros ON
Tpicos.CdigoDoTpico = Livros.CdigoDoTpico
GROUP BY Tpicos.Tpico;


Tabela: Livros
Cdigo do Livro Ttulo Cdigo do Tpico Nome do Editor Preo de
1 Dirk Luchte 5 GGG&G Editora R$23,50
2 Planejando Sua 1 Jean-Paul Deloria R$22,95
3 Diamantes 6 Editora Ramona R$9,95
4 Tcnicas de Tai Chi 4 Editora Ramona R$25,95
Microsoft Access Avanado



94
5 Minha Famlia 5 Publicaes R$17,95

Os campos da tabela Livros so: CdigoDoLivro, Ttulo, CdigoDoTpico,
NomeDoEditor, e PreoDoPedido




Tabela: Tpicos
Cdigo do Tpico Tpico
1 Negcios
2 Psicologia
3 Cincia
4 Sade
5 Fico
6 Romance
7 Tcnico

Os campos da tabela Tpicos so: CdigoDoTpico e Tpico

Consulta seleo: qryLivros_versus_Tpicos
Ttulo Tpico
Planejando Sua Carreira Negcios
Tcnicas de Tai Chi Sade
Dirk Luchte Fico
Minha Famlia Fico
Diamantes Romance


Consulta seleo com funo agregada
Tpico Quantidade
Fico 2
Negcios 1
Romance 1
1

Comecemos por fazer uma leitura sequencial de cada registro da tabela Livros,
listando os contedos dos campos Ttulo e NomeDoEditor.
O primeiro passo, ento criar um objeto database que contenha o banco de dados
atual.

' Declara um ojeto database (banco de dados)
Dim dbsBancoAtual As Database
' Atribui o banco atual ao objeto database
Set dbsBancoAtual = DBEngine.Workspaces(0).Databases(0)

O banco de dados atual pode ser referido simplesmente por:

Microsoft Access Avanado



95
Set dbsBancoAtual = CurrentDb

Um objeto recordset tem que ser aberto no banco de dados atual. Assim, vamos
declarar um objeto recordset e usar o mtodo OpenRecordset do objeto database.

' Declara um ojeto database (banco de dados)
Dim dbsBancoAtual As Database
' Declara um ojeto recordset
Dim rstTabela As Recordset
' Atribui o banco atual ao objeto database
Set dbsBancoAtual = DBEngine.Workspaces(0).Databases(0)
' Abre o recordset e o atribui ao objeto recordset
Set rstTabela = dbsBancoAtual.OpenRecordset(Livros)


Para pegar um determinado campo, poderamos criar um objeto Field para cada o
campo, uma para Ttulo e outro para o campo NomeDoEditor, mas em vez disto vamos pegar
o valor do prprio objeto Field, explicitando o nome do campo dentro da coleo Fields.

rstTabela.Fields(Ttulo)
rstTabela.Fields(NomeDoEditor)

O nome do objeto Field deve ser o nome do campo e no a sua legenda. Por isso , est
escrito NomeDoEditor e no Nome do Editor.
Falta ainda criar uma estrutura de repetio do VBA que percorra todo o recordset.
Vamos usar o Do...Loop, com a condio While (enquanto) verificando o fim do de arquivo.
O fim de arquivo pode ser obtido pela propriedade EOF do objeto recordset. A navegao
pelos registros feita pelo mtodo MoveNext do objeto recordset.

' Declara um ojeto database (banco de dados)
Dim dbsBancoAtual As Database
' Declara um ojeto recordset
Dim rstTabela As Recordset
' Atribui o banco atual ao objeto database
Set dbsBancoAtual = DBEngine.Workspaces(0).Databases(0)
' Abre o recordset e o atribui ao objeto recordset
Set rstTabela = dbsBancoAtual.OpenRecordset(Livros)

Do While Not rstTabela.EOF
Debug.Print rstTabela.Fields(Ttulo) & - & _
rstTabela.Fields(NomeDoEditor)
rstTabela.MoveNext
Loop
rst.Close


A janela depurar conter os seguintes dados:

Microsoft Access Avanado



96


8.7. Acesso a Bancos de Dados Externos

No exemplo anterior a origem dos dados uma tabela (vinculada ou no) do banco de
dados corrente, ou seja, do banco de dados onde o programa est sendo executado. Em certos
casos necessrio obter dados (ou objetos) que esto em outros bancos de dados Access ou de
banco de dados ISAM ou ODBC.



H duas maneiras de acessar os dados externos: Vinculao e Abertura direta das
tabelas
8.7.1. Vinculao de Tabelas Externas

Para acessar dados de banco de dados externos, via programao, a forma mais fcil
vincular as tabelas externas (atravs do Menu Arquivo|Obter Dados Externos|Vincular) e
acess-las normalmente pelo mtodo OpenRecordset do Database corrente, pois elas fazem
parte do banco de dados corrente.
O problema da vinculao que o Access no sabe se o arquivo de origem est onde
deveria estar. Portanto, ou se faz a vinculao toda vez que o aplicativo for aberto, ou se
verifica se o vinculo est ativo e o refaz se necessrio.
Banco de Dados Corrente
(MDB)
ARQ3.XLS
(Excel 95)
ARQ2.DBF
(dBase 3 )
ARQ1.MDB
ODBC
(SQL Server)
Microsoft Access Avanado



97
Fazer a vinculao via programao exige o conhecimento de outros objetos,
propriedades e mtodos da DAO.

Toda tabela, seja prpria do banco de dados ou vinculada, um objeto TableDef
(definio de tabela). Ento, fazer uma vinculao significa criar um objeto TableDef e
configurar suas propriedades (Connect e TableSourceName) para apontar para o arquivo a ser
vinculado. Aps criada a TableDef, ela acrescentada coleo TableDefs do objeto
Database.

Sub VinculaBancosExternos()
Dim dbs As Database
Dim tdf As TableDef

Set dbs = CurrentDb
Cria o objeto TableDef
Set tdf = dbs.CreateTableDef(Clientes)

Define o tipo de banco de dados que est conectando e a localizao
(path)
tdf.Connect = dBASE III; DATABASE=C:\Tabelas

Define o nome da tabela (sem o sufixo, dbf, no caso)
tdf.SourceTableName = Clientes

Acrescenta o objeto TableDef coleo TableDefs
dbs.TableDefs.Append tdf

End Sub

A propriedade Connect possui dois argumentos: o Especificador e a Origem
(antecedido pela palavra DATABASE=), separadas por um ponto e virgula. Abaixo esto os
valores para este dois argumentos para os tipos de banco de dados:

Tipo de banco de dados Especificador Origem
Banco de dados Access [banco de dados]; Unidade de
disco:\caminho\nome do
arquivo.mdb
dBASE III dBASE III; Unidade de disco:\caminho
dBASE IV dBASE IV; Unidade de disco:\caminho
DBASE 5 dBASE 5.0; Unidade de disco:\caminho
Paradox 3.x Paradox 3.x; Unidade de disco:\caminho
Paradox 4.x Paradox 4.x; Unidade de disco:\caminho
Paradox 5.x Paradox 5.x; Unidade de disco:\caminho
FoxPro 2.0 FoxPro 2.0; Unidade de disco:\caminho
FoxPro 2.5 FoxPro 2.5; Unidade de disco:\caminho
FoxPro 2.6 FoxPro 2.6; Unidade de disco:\caminho
Excel 3.0 Excel 3.0; Unidade de
disco:\caminho\nome do
arquivo.xls
Excel 4.0 Excel 4.0; Unidade de
disco:\caminho\nome do
arquivo.xls
Microsoft Access Avanado



98
Excel 5.0 ou Excel 95 Excel ; Unidade de
disco:\caminho\nome do
arquivo.xls
Excel Excel 8.0; Unidade de
disco:\caminho\nome do
arquivo.xls
HTML Import HTML Import; Unidade de
disco:\caminho\nome do
arquivo
HTML Export HTML Export; Unidade de disco:\caminho
Text Text; Unidade de disco:\caminho
ODBC ODBC;DATABASE=bancode
dados;UID=usurio;
PWD=senha;DSN=
nomedafontededados;[LOGIN
TIMEOUT=segundos;]
Nenhum
Exchange Exchange;
MAPILEVEL=caminhodapast
a; [TABLETYPE={ 0 | 1
}];[PROFILE=perfil;][PWD=
senha;][DATABASE=bancod
edados;]
Unidade de disco:\caminho.mdb

Quando se usa tabelas vinculadas no aplicativo, interessante refazer os vnculos no
incio da da aplicao. Ora, se as tabelas j esto vinculadas, a criao de um novo TableDef
vai duplicar as tabelas existentes. Alm disso, a vinculao pode falhar se as tabelas no
estiverem no local certo. O exemplo abaixo mostra como refazer os vnculos, reportando na
tela se o processo funcionou ou no.

Function VinculaTabelas()
Dim tbfs As TableDefs
Dim tbf As TableDef
Dim strMsg As String
Dim CRLF As String

CRLF = Chr(13) & Chr(10)

Set tbfs = CurrentDb.TableDefs 'Coleo de tabelas

On Error Resume Next

tbfs.Delete "Pessoal"
tbfs.Delete "Cargo"
tbfs.Delete "Funcao"

Err.Clear 'Limpa o erro anterior, se houver

DoCmd.OpenForm "Histrico de Eventos"
Err.Clear

Set tbf = CurrentDb.CreateTableDef("Pessoal")
tbf.Connect = "dBASE III; DATABASE=C:\Tabelas\"
tbf.SourceTableName = "Pessoal"
If Err.Number <> 0 Then
Forms![Histrico de Eventos].txtMsg = _
Microsoft Access Avanado



99
Forms![Histrico de Eventos].txtMsg & "Erro ao vincular Pessoal" &
CRLF
Else
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Vinculou Pessoal" & CRLF
tbfs.Append tbf
End If
Err.Clear

Set tbf = CurrentDb.CreateTableDef("Cargo")
tbf.Connect = "dBASE III; DATABASE=C:\Tabelas\"
tbf.SourceTableName = "Cargo"
If Err.Number <> 0 Then
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Erro ao vincular Cargo" &
CRLF
Else
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Vinculou Cargo" & CRLF
tbfs.Append tbf
End If
Err.Clear

Set tbf = CurrentDb.CreateTableDef("Funcao")
tbf.Connect = "dBASE III; DATABASE=C:\Tabelas\"
tbf.SourceTableName = "Funcao"
If Err.Number <> 0 Then
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Erro ao vincular Funcao" &
CRLF
Else
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "Vinculou Funcao" & CRLF
tbfs.Append tbf
End If
Err.Clear

Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsg & "--------------------------" & CRLF
Forms![Histrico de Eventos].txtMsg = _
Forms![Histrico de Eventos].txtMsgtrMsg & "Fim da vinculao"

End Function

A execuo desta funo vinvula as tabelas e mostra o formulrio Histrico de
Eventos com o resultado do processamento, como mostra a figura a seguir.
Microsoft Access Avanado



100

8.7.2. Abertura Direta de Tabelas Externas

Com uma tabela vinculada, alm de poder abrir um recordset via programa, voc pode
abr-la normalmente no modo folha de dados ou ainda criar consultas, formulrios e
relatrios com base na tabela.
Se o seu caso simplesmente abrir uma tabela externa via programao, no h
motivo para vincul-la. Basta abr-la diretamente.
Para abrir diretamente as tabelas, sem vinculao, lembre-se que cada arquivo externo
um objeto Database. Portanto, basta declarar as variveis deste tipo, na quantidade
necessria. Vamos supor que alm do banco corrente, queira-se objetos de outros trs bancos
Access.

Dim dbsCorrente As Database
Dim dbsArq1 As Database
Dim dbsArq2 As Database
Dim dbsArq3 As Database

Para abrir o banco corrente pode-se usar a funo CurrentDb ou toda a referncia de
seus objetos pais DBEngine.Workspaces(0).Database(0).
Para abrir bancos de dados externos, usa-se o mtodo OpenDatabase do objeto
Workspace, cuja sintaxe :

Set bancodedados = [workspace.]OpenDatabase(Banco[, Exclusivo[, ReadOnly[, Origem]]])

Banco o nome do banco de dados a ser aberto, incluindo o seu path.
Exclusivo um valor lgico (True ou False que indica se o banco ser aberto em modo
exclusivo.
ReadOnly um valor lgico (True ou False) que indica se o banco ser aberto somente
para leitura.
Origem um string de parmetros para abrir o banco de dados.
Microsoft Access Avanado



101


Set dbsCorrente = CurrentDb
Set dbsArq1 = DBEngine.Workspaces(0).OpenDatabase(C:\Tabelas\Arq1.mdb)
Set dbsArq2 = DBEngine.Workspaces(0).OpenDatabase(C:\Sistemas\Arq2.mdb)
Set dbsArq3 = DBEngine.Workspaces(0).OpenDatabase(C:\Arq3.mdb)

Com a abertura de vrios objetos Database, voc tem acesso a todos os dados destes
bancos de dados (e a objetos, se for banco Access).
Os argumentos Banco e Origem, do mtodo OpenDatabase, e Recordset, do mtodo
OpenRecordset, tm valores especficos para cada tipo de banco de dados. Abaixo esto os
valores para alguns dos mais comuns tipos de banco de dados:

Tipo Banco Origem Recordset
Access Path e nome do banco de
dados.
Ex.:
C:\Tabelas\TB_Org.mdb
Usurio e senha (se
necessrios).
Ex.:
UID=Admin;PWD=senha

Nome da tabela.
Ex.: Cidades
DBase III Path
Ex.:
\\SMG0002\Sistemas
D:\Dados
Tipo do banco de dados.
dBASE III;
Nome do arquivo,
sem o sufixo .dbf.
Ex.: Cliente
Excel Path e nome do arquivo.
Ex.:
C:\Temp\Clientes.xls
Verso do Excel.
Excel 4.0;
Excel 5.0;
Excel 8.0;
Intervalo das clulas
ou nome do intervalo.
Ex.:
Plan1$A1:B5
Custos
Fox Pro Path
Ex.:
\\SMG0003\Arqs
Verso do Fox Pro.
FoxPro 2.0;
FoxPro 2.6;
FoxPro 3.0;
Nome do arquivo sem
o sufixo.
Ex.: Carros


1) Exemplo de acesso direto a arquivo dBase III, situado em um recurso de rede.

Set dbsDBase = DBEngine.Workspaces(0).OpenDatabase(\\SMG0006\Tabelas, _
False, False, dBASE III;)
Set rst = dbsDBase.OpenRecordset(Orgao)



2) Exemplo de acesso direto a arquivo FoxPro 2.0

Set dbsFoxPro2 = DBEngine.Workspaces(0).OpenDatabase(C:\, _
False, False, FoxPro 2.0;)
Set rst = dbsFoxPro2.OpenRecordset(Clientes)

3) Exemplo de acesso direto a arquivo Excel

Microsoft Access Avanado



102
Set dbsExcel = DBEngine.Workspaces(0).OpenDatabase(C:\Sheets\Venda.xls, _
False, False, Excel 8.0;)
Set rst = dbsExcel.OpenRecordset(Plan3$A1:F7)


Microsoft Access Avanado



103
9. ACESSO A ARQUIVOS E IMPRESSORA

O acesso a banco de dados Access, ISAM ou ODBC, via DAO e Jet Engine, substitui
o tradicional acesso a arquivos seqenciais e randmicos. Apesar disso, o Access no
eliminou este tipo de acesso.
No tem muito sentido apresentar o acesso a dados em arquivos, uma vez que a
maioria das necessidades atendida por banco de dados. Porm pode-se usar o acesso a
arquivos para outros fins, tal como direcionar a sada para disco ou diretamente para a porta
da impressora local.
Uma utilidade para a gravao da sada em disco a monitorao, atravs de log em
arquivo texto, de alguns acontecimentos importantes que ocorreu no aplicativo, tal como um
erro fatal. Por exemplo, o aplicativo falhou ao tentar abrir um banco de dados .mdb que no se
encontrava mais no disco. Com certeza, este erro ser tratado por uma rotina de erro (ver
tpico Tratamento de Erro) que gerar uma caixa de mensagem na tela. Porm a mensagem
apresentada ao operador, que esqueceu-se de anot-la. Se esta mensagem for tambm gravada
para o disco , o programador pode posteriormente abrir o arquivo e identificar o erro e em que
linha de programa ele ocorreu.
Para mostrar o acesso a arquivo, mostrarei um exemplo que gerar um relatrio para
disco, em formato ASCII, para ser impresso em uma impressora matricial em modo texto.

Dim rst As Recordset
Dim strNome As String * 35

Set rst = CurrentDb.OpenRecordset("Pessoal")
Open "C:\SAIDA.TXT" For Output As #1

Do While Not rst.EOF
LSet strNome = rst.Fields("NM_EMPREG")
Print #1, rst.Fields("CD_MATRIC") & " ";
Print #1, strNome;
Print #1, rst.Fields("CD_CARGO") & " ";
Print #1, rst.Fields("CD_ORGAO")
rst.MoveNext
Loop

Close #1
rst.Close

O resultado deste cdigo, o arquivo SAIDA.TXT, pode ser aberto no Notepad. Numa
sesso DOS, este arquivo pode ser enviado para uma impressora matricial em modo texto
(type saida.txt > prn: ). Isto significa que a impresso ser rpida, pois no usa as fontes do
Windows.

Microsoft Access Avanado



104

Em vez de direcionar a sada para um arquivo ASCII, pode-se enviar a sada
diretamente para a porta da impressora local. Isto equivale no Clipper a Set Print On e o
comando ?.

Dim rst As Recordset
Dim strNome As String * 35

Set rst = CurrentDb.OpenRecordset("Pessoal")

Open "Lpt1:" For Output As #1
' Liga o modo condensado em impressoras padro Epson
Print #1, Chr(15)

Do While Not rst.EOF
LSet strNome = rst.Fields("NM_EMPREG")
Print #1, rst.Fields("CD_MATRIC") & " ";
Print #1, strNome;
Print #1, rst.Fields("CD_CARGO") & " ";
Print #1, rst.Fields("CD_ORGAO")
rst.MoveNext
Loop

Close #1
rst.Close


Microsoft Access Avanado



105
10. TRATAMENTO DE ERRO

H trs tipos de erros.
Erro lgico
Erro em tempo de compilao
Erro em tempo de execuo

Erro lgico quando o aplicativo no funciona como se esperava. Por exemplo,
esquecer-se de zerar um contador leva a um erro lgico. Este tipo de erro s pode ser
corrigido pelo prprio programador.
Erros em tempo de compilao ocorrem como resultado da construo incorreta de
cdigo. Voc pode ter esquecido de balancear pares de instrues (como If e End If ou For e
Next) ou pode ter cometido um erro de programao que viola as regras do Visual Basic
(como um erro de ortografia, omisso de um separador ou um erro de digitao).
Erros em tempo de compilao tambm incluem erros de sintaxe, que so erros de
gramtica ou pontuao. Isso inclui parnteses mal emparelhados ou um nmero incorreto de
argumentos passados para uma funo.
Erro em tempo de compilao ocorre tambm quando se usam funes definidas pelo
usurio que no existem ou esto fora do escopo, quando se usam objetos de uma biblioteca
no referenciada (ver Referncia a Biblioteca de Objetos mais adiante) e quando de usa
variveis no declaradas (desde que Option Explicit esteja ativada).
O erro por falta de referncia a objetos nem sempre pode ser verificado antes de
executar o programa, pois um objeto pode ser criado em tempo de execuo (ver Automao
mais adiante) e no h como o Access verificar se as propriedades e mtodos so suportados
pelo objeto. Neste caso, um erro em tempo de execuo.
Para verificar a existncia de erro de compilao, execute Compilar mdulos
carregados no menu Depurar de uma janela de mdulo.
Erro em tempo de execuo algo inesperado que ocorre quando o programa est
sendo executado. Por exemplo, tentar abrir um banco de dados em modo exclusivo quando
um outro usurio j o fez ou dividir um nmero por uma varivel que contm zero.
Normalmente, um erro em tempo de execuo suspende o programa. Na suspenso, a
janela de mdulo a aberta, a linha onde ocorreu o erro fica iluminada e mensagem de erro
aparece para se optar por depurar o programa ou encerr-lo.



Microsoft Access Avanado



106
Esta situao no boa, no s porque o programa falha, mas porque o usurio tem
acesso ao cdigo fonte do programa (lembre-se que o Access no um compilador que gera
um programa executvel).
O erro em tempo de execuo pode ser tratado dentro do prprio programa,
melhorando a forma como o programa seja abortado, ou, conforme a gravidade do erro, at
mesmo corrigindo o erro e impedindo que o programa seja interrompido.
O tratamento de erro em tempo de execuo implementado com a instruo On
Error. Esta instruo permite duas formas de tratamento:
Desviar o programa para uma rotina de tratamento de erro
Prosseguir a execuo na linha posterior ao do erro

10.1. Desvio para rotina de tratamento de erro

Para o primeiro caso usa-se On Error GoTo rtulo, onde rtulo uma marca para
fragmento de cdigo dentro do prprio procedimento. Este cdigo pode:
Tratar o erro e terminar o programa
Tratar o erro e voltar execuo na mesma linha do erro
Tratar o erro e voltar execuo na linha seguinte linha de erro
Tratar o erro e desviar a execuo para outro rtulo.

A rotina de tratamento de erro faz uso do objeto Err, que tem duas propriedades
importantes> o nmero do erro (Number) e a sua descrio (Description).

10.1.1. Tratar o erro e terminar o programa

Sub MostraErro()
On Error GoTo Trata_Erro
Open c:\teste.txt For Input As #1
Close #1
Exit Sub

Trata_Erro:
Erro 53 File not found
MsgBox Err.Number & - & Err.Description

End Sub

Note que foi preciso colocar Exit Sub para que o cdigo de tratamento de erro, no
rtulo Trata_Erro, no seja executado em situao sem erro. Note tambm, que aps reportar
o erro, o programa segue o fluxo normal e pra, j que encontra End Sub.

10.1.2. Tratar o erro e voltar execuo na mesma linha do erro

Sub VoltaNaLinhaDoErro()
On Error GoTo Corrige_Erro
Microsoft Access Avanado



107
Open c:\teste.txt For Output As #1
Kill c:\teste.txt
Exit Sub

Corrige_Erro:
If Err.Number = 55 File alredy open
Close #1
Resume
End If

End Sub

Neste caso o erro ocorre porque tenta-se apagar um arquivo que ainda est aberto. A
rotina de tratamento de erro pode corrigir a situao de erro e retornar o fluxo de programa na
mesma linha onde o erro ocorreu.

10.1.3. Tratar o erro e voltar execuo na linha seguinte linha de erro

Sub VoltaNaProximaLinha()
Dim blnArquivoExiste As Boolean

On Error GoTo Corrige_Erro
blnArquivoExiste = True

Open c:\teste.txt For Input As #1
If blnArquivoExiste
MsgBox Preparando para ler arquivo C:\teste.txt
Else
MsgBox O arquivo C:\teste.txt no existe!
End If
Exit Sub

Corrige_Erro:
If Err.Number = 53 File not found
Resume Next
End If

End Sub


10.1.4. Tratar o erro e desviar a execuo para outro rtulo.

Sub DesviaParaUmRotulo()
On Error GoTo Corrige_Erro

Open c:\teste.txt For Input As #1
Exit Sub

Fim:
MsgBox O arquivo C:\teste.txt no existe. & _
Irei cri-lo vazio para as prximas execues!
Open c:\teste.txt For Output As #1
Close #1
Exit Sub
Microsoft Access Avanado



108

Corrige_Erro:
If Err.Number = 53 ' File not found
Resume Fim
End If

End Sub
10.1.5. Prosseguir o programa aps erro

Para prosseguir o programa normalmente aps a ocorrncia de um erro usa-se On
Error Resume Next. Isto til quando o erro no compromete a lgica do programa e pode
ser ignorado. Por exemplo, quando for apagar tabela vinculada (significa desfazer o vnculo),
a falta dela j estiver apagada no um erro grave e pode ser ignorado.

Sub DesvinculaTabelas()
On Error Resume Next

CurrentDb.TableDefs(Pessoal).Delete
CurrentDb.TableDefs(Cargo).Delete
CurrentDb.TableDefs(Funcao).Delete

End Sub

On Error Resume Next pode ser usado para tratar o erro imediatamente aps a sua
ocorrncia, sem desviar para um rtulo.

Sub TrataErroImediatamente()
Dim obj As Object

On Error Resume Next
Set obj = CreateObject("Outlook.Application")
If Err.Number <> 0 Then
' Err.Number 429
' Err.Description ActiveX component cant create object
MsgBox "No foi possvel criar o objeto Outlook"
Else
.
.
End If

End Sub

10.1.6. Evento Erro
A instruo On Error pode ser usada em mdulo padro e mdulo de classe. Em
mdulo de classe h uma outra maneira de interceptar error: o evento On Error (Ao Ocorrer
Erro, em portugus) dos objetos formulrio e relatrio.
O evento On Error detecta somente os erros do Jet Engine e no erros do VBA. Se um
campo que no aceita nulo receber um nulo ser gerado um evento de erro, porque um erro
do Jet Engine. Se o cdigo tentar uma diviso por zero, o erro no interceptado pelo evento
On Erro, porque um erro do VBA. Neste caso, tem que se usar a instruo On Error.
Microsoft Access Avanado



109

10.2. Depurao do Programa

vezes ocorre um erro persistente, difcil de ser solucionado, para o qual so
necessrios executar o programa passo-a-passo, interromper o programa para verificar o
contedo das variveis e prosseguir o programa a partir da interrupo.
Para parar o programa em pontos crticos, podem ser colocados um ou mais Pontos de
Interrupo (tecla F9 pe e tira pontos de interrupo). Nestes pontos o programa
interrompido e a janela do mdulo aberta. Pode-se ento prosseguir com a tecla F8, para
executar o programa passo-a-passo ou F5 para continuar normalmente at outro ponto de
interrupo ou at o fim do programa.
Durante a interrupo, pode-se abrir a janela Depurar (Control G) e verificar o valor
das variveis ou executar um comando interativamente, inclusive alterando o valor de
algumas variveis.




Na figura acima, a linha marcada com um crculo um ponto de interrupo e a linha
marcada com seta a linha atualmente executada. Na janela Depurar (Debug Windows, em
ingls) foi dado o comando ? xlsSheet.Application, o qual retornou Microsoft Excel (que o
nome do objeto pai).
Aps depurar o programa, no se esquea de limpar todos os pontos de interrupo.

Microsoft Access Avanado



110

Microsoft Access Avanado



111
11. AUTOMAO

A automao (antigamente chamada de Automao OLE) um recurso do COM
(Component Object Model), um padro da indstria de informtica utilizado pelos aplicativos
para expor os seus objetos a ferramentas de desenvolvimento, linguagens de macro e a outros
aplicativos que suportam automao. Por exemplo, um aplicativo de planilha pode expor uma
planilha, grfico, clula ou intervalo de clulas como diferentes tipos de objetos. Um
processador de textos pode expor objetos como um aplicativo, um documento, um pargrafo,
uma frase, um indicador ou uma seleo.
Quando um aplicativo suporta automao, os objetos expostos por ele podem ser
acessados pelo Visual Basic. Para manipular esses objetos no Visual Basic, execute mtodos
sobre o objeto ou obtenha e defina as propriedades do objeto. Por exemplo, voc pode criar
um objeto de automao nomeado MyObj e gravar o cdigo apresentado a seguir para acess-
lo:

MyObj.Insert "Oi, mundo." ' Insere um texto.
MyObj.Bold = True ' Formata o texto.
MyObj.SaveAs "C:\PROCTXT\DOCS\OBJTEST.DOC" ' Grava o objeto.

Os objetos que que expem suas funcionalidades chamado pela Microsoft de
ActiveX. O termo ActiveX engloba tambm os controles OLE, antigamente chamados de
componentes OCX (isto porque os arquivos tm a terminao .ocx). Atualmente, o termo
ActiveX tem sido substitudo por COM Component Object Model.
H dois tipos de elementos na automao:
Os servidores de automao, que podem ser controlados porque suas funcionalidades so
expostas e podem ser acessadas por outras aplicaes. Exemplos de servidores de
automao: todos os softwares do Microsoft Office, Schedule+ e o Project.
Os controladores de automao, que podem controlar servidores de automao atravs de
cdigo de programao, acessando a funcionalidade exposta pelos servidores de
automao. Exemplos de controladores: MS Visual Basic, MS Visual C++, MS FoxPro e
o VBA (que est embutido no Access, Excel, Word e Project).

A automao permite extrair o que h de melhor dos softwares especialistas e integr-
los. Por exemplo, pode-se usar o Access, especializado em banco de dados, para processar
dados de vendas e export-los para uma planilha do Excel. O Excel, especializado em grfico,
pode gerar um grfico de barras, mostrando a evoluo das vendas. Este grfico pode ser
exportado para um relatrio trimestral de vendas, que est digitado no Word. Todo este
processo poderia ser manual, usando-se os recursos de copiar e colar. A automao faz tudo
isto com um simples disparo de um cdigo em VBA.
Para usar a automao, no entanto, necessrio conhecer os objetos, propriedades e
mtodos de cada um dos aplicativos envolvidos, sem contar com o conhecimento da
linguagem de programao Visual Basic.
No VBA existem duas funes chaves para realizar a automao. GetObject() e
CreateObject().
GetObjetc() obtm um objeto ActiveX de uma determinada classe de objetos. Sua
sintaxe e argumentos so:
Microsoft Access Avanado



112

GetObject([pathname] [, class])

Pathname Opcional; Variant (String). Indica o caminho completo e nome do arquivo que
contm o objeto a ser recuperado. Se pathname for omitido, class passa a ser
obrigatrio.
class Opcional; Variant (String). Uma seqncia de caracteres que representa a classe
do objeto.

O argumento class utiliza a sintaxe nomedoaplic.tipodeobjeto e possui partes a seguir:

Parte Descrio
nomedoaplic Obrigatria; Variant (String). Nome do aplicativo que fornece o objeto.
tipodeobjeto Obrigatria; Variant (String). Tipo ou classe do objeto a ser criado.

O objeto retornado por GetObject atribudo a uma varivel do mesmo tipo,
possibilitando invocar seus mtodos e acessar suas propriedades. O exemplo abaixo obtm
um objeto Application do Word. A propriedade Visible setada para que a janela do
aplicativo aparece na tela. usado o mtodo Open, da coleo Documents, para abrir um
documento existente.

Dim wrd As Object
Set wrd = GetObject(, "Word.Application")
wrd.Visible = True
wrd.Documents.Open "C:\Meus Documentos\Temp.doc"
Set wrd = Nothing

CreateObject() cria e retorna a referncia de um objeto ActiveX da classe especificada
em seu argumento. O argumento obrigatrio e o mesmo argumento [class] da funo
GetObject().










11.1. Automao com o Microsoft Word

Microsoft Access Avanado



113
Hierarquia dos Objetos do Microsoft Word


O exemplo abaixo cria um novo objeto Application do Word. usado o mtodo
TypeText, do objeto Selection, para inserir um texto. O documento salvo e o aplicativo
encerrado. A referncia ao objeto encerrada atribuindo-se Nothing varivel.

Dim objWord As Object
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
objWord.Documents.Add
objWord.Selection.TypeText Text:="Carlos Koga"
objWord.ActiveDocument.SaveAs FileName:="C:\Koga.doc"
objWord.Quit
Set objWord = Nothing



11.2. Automao com o Microsoft Excel
Hierarquia do Objetos do Microsoft Excel

Microsoft Access Avanado



114



Detalhamento do Objeto Worksheets

Microsoft Access Avanado



115


Detalhamento do Objeto Charts



Detalhamento do Objeto Chartgroups

Microsoft Access Avanado



116




Normalmente, ao abrir o Excel no Windows, abre-se automaticamente um novo
Workbook (Pasta de Trabalho, em portugus) chamado Book1 (Pasta1, em portugus) com
trs Worksheets (planilhas) denominados Sheet1, Sheet2, Sheet3 (em portugus, so Plan1,
Plan2 e Plan3, respectivamente). Cada Worksheet possui vrias clulas, referenciadas por
coordenadas de colunas de A a IV e linhas de 1 a 65536.
Este so os principais objetos do Excel. O prprio Excel, o Workbook, o Worksheet e
o Range (que so as clulas), nesta ordem de hierarquia.
O objeto de mais alto nvel o Application. Ele representa o prprio programa Excel.
No modo programado, o objeto Application no possui de imediato nenhum
Workbook (Pasta de Trabalho, em portugus) e, consequentemente, nenhum Worksheet
(planilha) e nenhum Range.
O Excel pode abrir um ou mais workbooks. Workbooks (no plural) uma coleo de
objetos Workbook (no singular). Um objeto workbook um arquivo .XLS. Note que na
hierarquia de objetos, Workbooks est abaixo do objeto Application. Note tambm que a
legenda do modelo est errada, pois indica que Workbook apenas objeto. Na realidade
coleo e objeto.
Um workbook possui um ou mais Worksheets. Worksheets (no plural) uma coleo
de objetos Worksheet (no singular). Note que no modelo de objetos Worksheet est abaixo de
Workbook.
Cada worksheet (planilha) contm clulas, que so os objetos Range (intervalo). A
clula A1 referenciada por Range(A1). As clulas de A1 a C5 so referenciadas por
Range(A1:C5).



Microsoft Access Avanado



117



Para criar uma instncia do objeto Excel, usa-se a funo CreateObject() do VBA.
Exemplo:

Sub InstanciaExcel()
Dim xls As Excel.Application

' Cria uma instncia do objeto Excel
Set xls = CreateObject(Excel.Application)

' Propriedade para tornar o objeto visvel
xls.Visible = True

MsgBox Clique em OK para fechar o Excel

' Mtodo para fechar o Excel
xls.Quit

Set xls = Nothing ' Libera memria
End Sub


O procedimento acima abre o Excel e o fecha ao clicar OK na caixa de mensagem.
A figura abaixo a repersentao visual do objeto Excel.Application. Perceba que ele
no contm nenhum objeto Workbook ainda.
Microsoft Access Avanado



118



Para termos uma janela do Excel com um workbook, temos que acrescentar uma linha
de cdigo, invocando o mtodo Add da coleo Workbooks.

Sub InstanciaExcel()
Dim xls As Excel.Application

' Cria uma instncia do objeto Excel
Set xls = CreateObject(Excel.Application)

' Propriedade para tornar o objeto visvel
xls.Visible = True

' Cria um workbook novo.
' Por default, ele se chama Book1 e possui trs worksheets
xls.WorkBooks.Add

MsgBox Clique em OK para fechar o Excel

' Mtodo para fechar o Excel
xls.Quit

Set xls = Nothing ' Libera memria
End Sub


O objeto Excel.Application tem agora um objeto Workbook. Logo a sua coleo
Workbooks contm apenas um objeto Workbook, chamado Book1.
Para referenciar um objeto Workbook dentro da coleo, usa-se um ndice ou o seu
nome dentro de parnteses.

xls.Workbooks(1) ou

xls.Workbooks(Book1)

Microsoft Access Avanado



119
Note que a referncia deve seguir a hierarquia dos objetos. Primeiro Application,
seguida de Workbooks.

Sub InstanciaExcel()
Dim xls As Excel.Application

' Cria uma instncia do objeto Excel
Set xls = CreateObject("Excel.Application")

' Propriedade para tornar o objeto visvel
xls.Visible = True

' Cria um workbook novo.
' Por default, ele se chama Book1 e possui trs worksheets
xls.Workbooks.Add

xls.Workbooks(1).Worksheets(1).Range("A1") = 4
xls.Workbooks(1).Worksheets(1).Range("B1") = 6
xls.Workbooks(1).Worksheets(1).Range("C1") = "=A1 + B1"

MsgBox "Clique em OK para fechar o Excel"

' Salva o workbook como Teste.xls
xls.Workbooks(1).SaveAs "C:\Teste.xls"

' Mtodo para fechar o Excel
xls.Quit

Set xls = Nothing
End Sub


O exemplo a seguir mostra como ler cada registro de um recordset do Access,
gravando cada campo em uma clula.

Dim xlsPlan As Object
Dim rstPessoal As Recordset
Din lngLine As Long

Set xlsPlan = CreateObject("Excel.Sheet")
Set rstPessoal = CurrentDb.OpenRecordset("qryRelacaoDePessoal")

lngLine = 1
Do While Not rstPessoal.EOF
xlsPlan.Application.Cells(lngLine, 1) = rstPessoal.Fields(Matricula)
xlsPlan.Application.Cells(lngLine, 2) = rstPessoal.Fields(Nome)
xlsPlan.Application.Cells(lngLine, 3) = rstPessoal.Fields(CodOrgao)
xlsPlan.Application.Cells(lngLine, 4) = rstPessoal.Fields(CodCargo)
xlsPlan.Application.Cells(lngLine, 5) = rstPessoal.Fields(CodFuncao)
rstPessoal.MoveNext
lngLine = lngLine + 1
Loop

xlsPlan.SaveAs ("C:\Pessoal.xls")
rstPessoal.Close
Set xlsPlan = Nothing

Microsoft Access Avanado



120

xlsPlan um objeto Workbook. A propriedade Application retorna o objeto
Application, que possui a propriedade Cells.

Outro exemplo mais sofisticado gerar e imprimir um grfico de barras tridimensional do
Excel a partir de uma consulta referncia cruzada do Access.

REGIAO PROD A PROD B PROD C
LESTE 111 54 78
NORTE 245 200 114
OESTE 99 34 48
SUL 210 348 442

Dim xls As Object
Dim rst As Recordset
Dim intLinha As Integer, intColuna As Integer

Set rst = CurrentDb.OpenRecordset(qryConsumo por Produto e Por Regiao)
Set xls = CreateObject("Excel.application")
xls.Workbooks.Add

' Insere na linha 1 os cabealhos de cada coluna
For intColuna = 1 to rst.Fields.Count
xls.Cells(1, intColuna) = rst.Fields(intColuna 1).Name
Next

intLinha = 2
Do While Not rst.EOF
' Insere os valores de cada coluna
For intColuna = 1 to rst.Fields.Count
xls.Cells(intLinha,intColuna) = rst.Fields(intColuna 1)
Next
intLinha = intLinha + 1
rst.MoveNext
Loop

xls.Range("A1:D5").Select
xls.Charts.Add
xls.ActiveChart.ChartType = -4100
xls.ActiveChart.SetSourceData xls.Worksheets("Plan1").range("A1:D5"), 2
xls.ActiveChart.Location 1
With xls.ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Consumo por Regiao"
.Axes(1).HasTitle = True
.Axes(1).AxisTitle.Characters.Text = "Produtos"
.Axes(3).HasTitle = True
.Axes(3).AxisTitle.Characters.Text = "Regiao"
.Axes(2).HasTitle = False
End With
xls.ActiveWindow.SelectedSheets.PrintOut Copies:=1

Neste exemplo, xls um objeto Application, que possui as propriedades Cells, Range (retorna
o objeto Range), ActiveChart (que retorna o objeto Chart atual) e ActiveWindow (que
retorna o objeto Window atual) e as colees Workbooks e Charts.
Microsoft Access Avanado



121

11.3. Automao com Microsoft Project 95

Hierarquia dos Objetos do Microsoft Project 95 (verso 4.1)


A utilidade da automao com o Microsoft Project mostrada no exemplo a seguir. Uma
tabela do Access contm os eventos de cursos a serem realizados. Cada evento tem as datas de
incio e de trmino, o que no permite uma visualizao fcil de todos os eventos
programados num perodo de tempo. O Project possui o grfico de Gantt, como mostrado
abaixo, que torna a grade de eventos.



O cdigo a seguir possibilita inserir os dados dos eventos de cursos em um arquivo do Project
e imprimir o grfico de Gantt, automaticamente.

Dim prjApp As Object
Dim prjProj As Object
Microsoft Access Avanado



122
Dim rst As Recordset
Dim intI As Integer

Set rst = CurrentDb.OpenRecordset("Cursos")
Set prjApp = CreateObject("MSProject.Application")

prjApp.filenew

Set prjProj = prjApp.projects(1)
intI = 1
Do While Not rst.EOF
prjProj.tasks.Add rst.Fields("Evento")
prjProj.tasks(intI).start = rst.Fields("DataInicio")
prjProj.tasks(intI).finish = rst.Fields("DataTermino")
rst.MoveNext
intI = intI + 1
Loop

prjApp.FileSaveas "C:\Temp\cursos.mpp"
prjApp.fileprint 1, 1, False, False, 1, Null, Null, True, False, False
prjApp.Quit












11.4. Automao com Schedule+ 7.0

Microsoft Access Avanado



123
Hierarquia dos Objetos do Schedule+ 7.0


O exemplo a seguir mostra como criar um novo compromisso (Almoo), que iniciar-
se- na data/hora do sistema operacional e durar 1 hora. Este exemplo pode ser aperfeioado,
integrando a automao com o Project, para criar compromissos para o instrutor do curso.

Dim objSch As Object
Dim objApontamento As Object

Set objSch = CreateObject(SchedulePlus.Application)
objSch.Logon
objSch.ScheduleSelected.Activate

Set objApontamento = objSch.ScheduleSelected.SingleAppointments.New
objApontamento.SetProperties Text:= Almoo, _
Start:=Now(), End:= Now() + Format(01:00)
objSch.Logoff

11.5. REFERNCIA BIBLIOTECA DE OBJETOS

Para acessar objetos, propriedades, mtodos e constantes intrnsecas de outros
softwares, preciso que as referncias aos arquivos de acesso a objetos estejam
estabelecidas.
Uma aplicao Access tpica faz referncia a trs bibliotecas de objetos:

Arquivo de acesso a objetos do Access (tais como formulrios e relatrios) e constantes
do Access (referncia obrigatria).
Arquivo de acesso a objetos (todos os comandos e constantes) do VBA (referncia
obrigatria).
Arquivo de acesso a objetos de dados - DAO (referncia necessria apenas se for acessar
dados).

Microsoft Access Avanado



124

Os arquivos que permitem o acesso a objetos do Access so:
Arquivo Nome Descrio
Msaccess.tlb Microsoft Access for Windows 95 Para o Access 95 (verso 7.0),
em portugus
Msacc8.olb Microsoft Access 8.0 Object Library Para o Access (verso 8.0) em
ingls
Msacc8.tlb Microsoft Access 8.0 Object Library Para o Access (verso 8.0) em
portugus

O arquivo que permite o acesso a objetos do VBA :
Arquivo Nome Descrio
Ven2232.olb Visual Basic for Applications Para a verso 2.2, em ingls

Os arquivos que permitem o acesso a objetos da DAO so:
Arquivo Nome Descrio
Dao350.dll Microsoft DAO 3.5 Object Library Para a verso 3.5
Dao3021.dll Microsoft DAO 3.0 Object Library Para a verso 3.0
Dao2532.tlb Microsoft DAO 2.5/3.0 Compatibility
Library
Para compatibilidade das verses
2.5 e 3.0
Dao2535 Microsoft DAO 2.5/3.5 Compatibility
Library
Para compatibilidade das verses
2.5 e 3.5

Os arquivos que permitem acesso a objetos dos aplicativos Microsoft so:
Arquivo Nome Descrio
Sp7en32.olb Microsoft Schedule+ 7.0 Object Library Para a verso em ingls
Xl5en32.olb Biblioteca de objetos do Microsoft Excel
5.0
Para a verso 5.0 em portugus,
com sintaxe de comandos em
ingls
Xl5pt32.olb Biblioteca de objetos do Microsoft Excel
5.0
Para a verso 5.0 em portugus,
com sintaxe de comandos em
portugus
Excel8.olb Microsoft Excel 8.0 Object Library Para a verso em ingls
Pj4en32.olb Microsoft Project 4.1Object Library Para a verso 95 em ingls
Msword8.olb Microsoft Word 8.0 Object Library Para a verso em portugus, com
sintaxe de comandos em ingls
Graph8.olb Microsoft Graph 8.0 Object Library Para a verso em ingls
Grptb50.olb Biblioteca de objetos do Microsoft
Graph 5.0
Para a verso em portugus

As referncias so estabelecidas no menu Ferramentas|Referncias..., a partir de
uma janela de mdulo aberta.

Microsoft Access Avanado



125


Se estiver faltando alguma referncia na lista de bibliotecas disponveis, acione o
boto Procurar e localize o arquivo necessrio.
importante saber qual as verses dos objetos voc est referenciando, pois em cada
uma h mudanas de sintaxes e at objetos, propriedades e mtodos novos ou de
comportamento diferente. Por isto, um aplicativo que funciona perfeitamente em um
computador pode no funcionar em outro.
A referncia s bibliotecas de objetos ajuda no tempo de codificao do programa,
pois os objetos, propriedades e mtodos ficam visveis na janela Object Browser (acionada
pela tecla F2). Veja na figura a seguir as propriedades e mtodos do objeto reaPlotagem da
biblioteca do Excel 5.0 com a sintaxe em portugus.


Microsoft Access Avanado



126
12. CHAMADA API DO WINDOWS 95

A API (Application Programming Interface) do Windows consiste de um conjunto de
bibliotecas de vnculo dinmico (DLLs) ou arquivo de recursos (EXEs) contendo
procedimentos relacionados ao sistema operacional que incluem funes, mensagens,
estruturas de dados, tipos de dados e instrues que voc pode usar na criao de aplicativos a
serem executados sob o Windows 95. Para chamar esses procedimentos a partir do Visual
Basic, voc precisa primeiro declar-los usando uma instruo Declare. Voc pode ento
cham-los como faria com qualquer outro procedimento.
A instruo Declare possui a seguinte sintaxe:

[Public | Private ] Declare Function|Sub nome Lib "nomedabibliot" [Alias "nomedoalias" ]
[([listadeargumento])][As tipo]

A sintaxe da instruo Declare tem estas partes:
Parte Descrio
Public Usada para declarar procedimentos que esto disponveis em todos os
outros procedimentos em todos os mdulos.
Private Usada para declarar procedimentos que esto disponveis apenas
dentro do mdulo onde a declarao feita.
Sub Indica que o procedimento no retorna um valor.
Function Indica que o procedimento retorna um valor que pode ser usado numa
expresso.
nome Qualquer nome de procedimento vlido.
Lib Indica que uma DLL ou recurso de cdigo contm o procedimento que
est sendo declarado. A clusula Lib obrigatria para todas as
declaraes.
nomedabibliot Nome da DLL ou do recurso de cdigo que contm o procedimento
declarado.
Alias Indica que o procedimento que est sendo chamado tem um outro
nome na DLL ou est num recurso de cdigo do Macintosh. til
quando o nome do procedimento externo igual ao da palavra-chave.
Alias tambm pode ser usado quando um procedimento DLL tem o
mesmo nome de uma varivel ou constante pblica ou qualquer outro
procedimento no mesmo escopo. Alias tambm til se a conveno
de nomenclatura da DLL no permitir algum caractere no nome do
procedimento.
nomedoalias Nome do procedimento na DLL ou recurso do cdigo.
listadeargumento Lista de variveis que representam argumentos que so passados ao
procedimento quando ela chamada.
tipo Tipo de dados do valor retornado por um procedimento Function; pode
ser Byte, Boolean, Integer, Long, Currency, Single, Double, Date,
String (apenas de tamanho flexvel), Object, Variant, um tipo definido
pelo usurio ou um tipo de objeto.

O argumento listadeargumento tem a sintaxe e partes abaixo:
Microsoft Access Avanado



127

[Optional][ByVal | ByRef][ParamArray] nomedavariv[( )][As tipo]

Parte Descrio
Optional Indica que um argumento no obrigatrio. Se usada, todos os
argumentos subseqentes na listadeargumento devem ser opcionais e
declarados pelo uso da palavra-chave Optional. Todos os argumentos
Optional devem ser Variant. Optional no poder ser usada por
nenhum argumento se ParamArray for usada.
ByVal Indica que o argumento passado por valor.
ByRef Indica que o argumento passado por referncia.
ParamArray Usada apenas pelo ltimo argumento em listadeargumento para indicar
que o argumento final uma matriz Optional de elementos Variant. A
palavra-chave ParamArray permite fornecer um nmero arbitrrio de
argumentos. No pode ser usada com ByVal, ByRef ou Optional.
nomedavariv Nome da varivel que representa o argumento que est sendo passado
ao procedimento; segue convenes de nomenclatura padro de
varivel.
tipo Tipo de dados do argumento passado ao procedimento; pode ser Byte,
Boolean, Integer, Long, Currency, Single, Double, Date, String
(apenas de comprimento flexvel), Object, Variant, um tipo definido
pelo usurio ou um tipo de objeto.


Para usar a API, simplesmente saber a sintaxe no significa muito. preciso saber:
os nomes dos procedimentos embutidos
em quais arquivos de biblioteca os procedimentos se encontram
quais os argumentos devem ser passados
quais os valores que os argumentos devem receber

Quanto aos itens 1 a 3, h uma relao gravada em um banco de dados
(Win32API.mdb) que contm as funes do WinAPI. Eis algumas delas:

Funo Declarao
Beep Declare Function Beep Lib "kernel32" Alias "Beep" (ByVal dwFreq As
Long, ByVal dwDuration As Long) As Long
CharLower Declare Function CharLower Lib "user32" Alias "CharLowerA" (ByVal lpsz
As String) As String
GetOpenFileN
ame
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
GetSaveFileN
ame
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias
"GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long

Observao importante: As declaraes das funes devem ser escritas seguindo fielmente a
tabela acima. Os nomes so sensveis caixa.

Microsoft Access Avanado



128
As funes Beep e CharLower no apresentam problema para identificar os valores
que os argumentos devem receber. Os exemplos abaixo demonstram isto.

Option Explicit
Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, _
ByVal dwDuration As Long) As Long

Declare Function CharLower Lib "user32" Alias "CharLowerA" _
(ByVal lpsz As String) As String


Function Som()
Dim lngSom As Long
lngSom = Beep(500, 200)
lngSom = Beep(370, 100)
End Function


Function CaixaBaixa()
Dim str as String
str = CharLower(CAIXA ALTA)
MsgBox str
End Function


Entretanto, as funes GetOpenFileName e GetSaveFileName, assim como a maioria
das funes API, necessitam de documentao quanto estrutura e os valores dos
argumentos. Por exemplo, OPENFILENAME uma estrutura de dados definida pelo usurio
que contm os seguintes elementos.

lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As

Microsoft Access Avanado



129
Os exemplos dessas duas funes, apresentados adiante, s foram possveis graas ao
aplicativo Solutions, que acompanha o Access .

A funo GetOpenFileName abre uma caixa de dilogo do tipo Abrir, retornando um valor
lgico que indica se o usurio clicou no boto Abrir (true) ou no Cancelar (false). O nome do
arquivo armazenado no elemento lpstrFile de OPENFILENAME.

Option Compare Database
Option Explicit
Declare Function GetOpenFileName Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean
Declare Function GetSaveFileName Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Boolean
Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As Long
nMaxCustrFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustrData As Long
lpfnHook As Long
lpTemplateName As Long
End Type


Function CaixaDialogo_Open( )
Dim of As OPENFILENAME
Dim blnAbriu As Boolean ' Verifica se o usurio abriu ou cancelou.
' Poderia ser o retorno da funo.
Dim strTitulo as String ' Ttulo da caixa de dilog. Poderia ser um
' argumento
Dim strFiltro As String ' Filtro para o tipo de arquivo. Tambm
' poderia ser um argumento
Dim strDirInicial As String Diretrio inicial. Idem

strTitulo = Abrir banco de dados
strFiltro = Banco de dados Access & Chr(0) & _
*.mdb & Chr(0) & Chr(0)
strDirInicial = C:\

of.hwndOwner = Application.hWndAccessApp
of.hInstance = 0
of.lpstrCustomFilter = 0
of.nMaxCustrFilter = 0
of.lpfnHook = 0
of.lpTemplateName = 0
Microsoft Access Avanado



130
of.lCustrData = 0
of.lpstrFilter = strFiltro
of.nFilterIndex = 0
of.lpstrFile = String$(512, 0)
of.nMaxFile = 511
of.lpstrFileTitle = String$(512, 0)
of.nMaxFileTitle = 511
of.lpstrTitle = "Teste"
of.lpstrInitialDir = strDirInicial
of.lpstrDefExt = ""
of.flags = 0
of.lStructSize = Len(of)

blnAbriu = GetOpenFileName(of)

MsgBox blnAbriu True se clicou em Abrir. False se clicou em Cancelar
If blnAbriu Then
MsgBox of.lpstrFile Nome do arquivo escolhido
End If
End Function


Function CaixaDialogo_Save( )
Dim of As OPENFILENAME
Dim blnSalvou As Boolean ' Verifica se o usurio salvou ou cancelou.
' Poderia ser o retorno da funo.
Dim strTitulo As String ' Ttulo da caixa de dilog. Poderia ser um
' argumento
Dim strFiltro As String ' Filtro para o tipo de arquivo. Tambm
' poderia ser um argumento
Dim strDirInicial As String 'Diretrio inicial. Idem
Dim strNomeArq As String 'Nome sugerido para salvar. Idem
Dim strExtensaoDefault As String ' Extenso default. Idem

strTitulo = "Salvar banco de dados"
strFiltro = "Text files " & Chr(0) & "*.txt" & Chr(0) & Chr(0)
strDirInicial = "C:\"
strNomeArq = "Teste2"
strExtensaoDefault = "txt"

of.hwndOwner = Application.hWndAccessApp
of.hInstance = 0
of.lpstrCustomFilter = 0
of.nMaxCustrFilter = 0
of.lpfnHook = 0
of.lpTemplateName = 0
of.lCustrData = 0
of.lpstrFilter = strFiltro
of.nFilterIndex = 0
of.lpstrFile = strNomeArq & String$(512 - Len(strNomeArq), 0)
of.nMaxFile = 511
of.lpstrFileTitle = String$(512, 0)
of.nMaxFileTitle = 511
of.lpstrTitle = strTitulo
of.lpstrInitialDir = strDirInicial
of.lpstrDefExt = "txt"
of.flags = 0
of.lStructSize = Len(of)

blnSalvou = GetSaveFileName(of)
Microsoft Access Avanado



131

MsgBox blnSalvou 'True se clicou em Salvar. False se clicou em Cancelar
If blnSalvou Then
MsgBox of.lpstrFile ' Nome do arquivo escolhido
End If

End Function


Estas funes no realizam operaes de abertura/salvamento de arquivo, mas
simplesmente abrem caixas de dilogo para se selecionar os arquivos.

Microsoft Access Avanado



132
13. SEGURANA

Antes de construir um aplicativo Access, voc deve ter em mente que nveis de
segurana que o aplicativo deve atender. mais construir um aplicativo com a segurana j
definida desde o incio que defin-la aps o aplicativo estiver pronto.
A segurana visa proteger os dados contra leitura de informaes confidenciais,
alterao indevida, incluso e excluso de registros por pessoa no autorizada. A segurana
protege tambm a estrutura dos objetos e o acesso ao cdigo-fonte dos mdulos.
Existem vrias formas de segurana:
Senha de banco de dados: a forma mais simples de proteger um banco de dados. Uma
vez definida a senha, uma caixa de dilogo solicita a entrada da senha. Todos os dados e
estruturas so acessveis por quem informar a senha correta.
Criao de arquivo MDE: Cria uma cpia do banco de dados, com extenso .MDE, o que
torna impossvel visualizar, criar ou alterar cdigo VBA. Impede tambm a criao e
alterao de formulrios e relatrios.
Criptografia: Torna a leitura dos dados impossvel atravs de um processador de texto ou
outra ferramenta de acesso a disco. Abrindo o banco de dados no prprio Access, a
criptografia imperceptvel, a no ser a perda de desempenho de 10 a 15%.
Segurana em nvel de usurio: Define permisses de leitura, gravao e alterao de
estrutura por objeto e usurio (ou grupo de usurios). a forma mais completa de
segurana.

Voc pode combinar utilizar todas as formas de segurana em um mesmo aplicativo.

13.1. SENHA DE BANCO DE DADOS
13.1.1. DEFININDO UMA SENHA PARA O BANCO DE DADOS

Para definir uma senha para o banco de dados, o arquivo MDB que voc quer proteger
deve estar em uso.

1) Antes de definir uma senha, faa uma cpia de segurana do banco de dados que voc
quer proteger.
2) Se voc trabalha em rede, assegure-se que ningum mais esteja com o banco de dados em
uso.
3) Abra o banco de dados no modo exclusivo. Na caixa de dilogo Abrir, acionada pelo
menu Arquivo|Abrir banco de dados, h uma caixa de verificao Exclusivo.
4) A senha para um banco de dados feita pelo menu Ferramentas|Segurana|Definir
senha do banco de dados. Ao acionar o menu, ser aberta a seguinte caixa de dilogo.
Digite a senha, confirme e clique Ok

Microsoft Access Avanado



133


Observaes:
Voc pode definir uma senha de at 14 caracteres, entre letras, nmeros e caracteres
especiais. A senha sensvel a letras maisculas e minsculas.
Guarde a senha e a cpia de segurana do banco de dados em lugar seguro, pois em caso
de esquecimento, impossvel descobr-la.
Se voc pretende replicar seu banco de dados, no configure senha de banco de dados,
pois a replicao no funciona em banco de dados protegidos por senha.

13.1.2. ABRINDO UM BANCO DE DADOS PROTEGIDO POR SENHA

Ao abrir um banco de dados protegido por senha, uma caixa de dilogo solicitar a
senha.



Caso a senha esteja correta, o banco de dados aberto normalmente, com acesso a
todos os dados e objetos.

13.1.3. REMOVENDO SENHA DE BANCO DE DADOS

Aps ter aberto o banco de dados com a senha correta e no modo exclusivo, voc pode
remover a senha e voltar o banco de dados situao normal.
Num banco de dados protegido por senha, o menu Ferramentas|Segurana|Definir
senha do banco de dados passa a ser Ferramentas|Segurana|Desproteger senha do
banco de dados. Ao acionar este menu, ser pedida novamente a senha e o banco de dados
ento desprotegido.

13.1.4. DEFININDO SENHA POR CDIGO VBA

Microsoft Access Avanado



134
Voc pode definir uma senha do banco de dados por cdigo VBA, utilizando os
objetos do DAO. O mtodo para definir a senha NewPassword do objeto Database. O
cdigo no pode ser escrito no mesmo banco de dados o qual se deseja proteger.

Sub SetDBPassword()
' Declara a varivel do objeto database.
Dim dbs As Database

' Abre o banco de dados em modo exclusivo.
Set dbs = OpenDatabase("C:\bd1.mdb", True)

' Define a senha e fecha o banco de dados.
dbs.NewPassword "","topsecret"
dbs.Close
End Sub


13.1.5. ABRINDO UM BANCO DE DADOS PROTEGIDO VIA CDIGO VBA

Para abrir um banco de dados protegido via cdigo VBA, utilize o mtodo
OpenDatabase.

Sub OpenProtectedDB()
' Declara a varivel do objeto database.
Dim dbs As Database

' Abre o banco de dados protegido em modo compartilhado.
Set dbs = OpenDatabase("C:\bd1.mdb", False, False, ";pwd=topsecret")

End Sub


13.1.6. ALTERANDO A SENHA VIA CDIGO VBA

Voc pode tambm alterar a senha via cdigo usando o mtodo NewPassword do
objeto Database. O cdigo no pode ser escrito no mesmo banco de dados o qual se deseja
trocar a senha.

Sub ChangeDBPassword()
' Declara a varivel do objeto database.
Dim dbs As Database

' Abre o banco de dados em modo exclusivo.
Set dbs = OpenDatabase("C:\bd1.mdb", True, False, ";pwd=topsecret"))

' Define a senha e fecha o banco de dados.
dbs.NewPassword "topsecret", "novasenha"
dbs.Close
End Sub

Microsoft Access Avanado



135

13.2. CRIAO DE ARQUIVO MDE

Voc pode criar um arquivo de extenso .MDE a partir de um arquivo .MDB. No
preciso que o banco de dados .MDB esteja em uso.
Num arquivo MDE todas as estruturas de formulrios, relatrios e mdulos ficam
ocultas e inacessveis. Voc no pode criar novos formulrios, relatrios e mdulos, nem
exportar estes objetos, nem importar estes objetos de outros banco de dados .MDE.
Entretanto, tabelas, consultas e macros permanecem acessveis e podem ser importados e
exportados.
Se voc alterar seu banco de dados original, deve criar novamente um arquivo .MDE.
Mantenha sempre uma cpia de segurana do banco de dados original, pois no possvel
desfazer um arquivo .MDE.
Arquivos MDE so ideais para a distribuio da sua aplicao front-end, isto , um
banco de dados de extenso MDE possui as consultas, formulrios, relatrios, macros e
mdulos que acessam outros bancos de dados que contm as tabelas.

Aplicativo
Tabelas
Tabelas
Tabelas
Arquivos .MDB
Arquivo .MDE


Para criar um arquivo MDE, siga os passos:

1) Antes de criar um arquivo .MDE, faa uma cpia de segurana do banco de dados
original.
2) Se voc trabalha em rede, assegure-se que ningum mais esteja com o banco de dados em
uso.
3) Acione o menu Ferramentas|Utilitrios de banco de dados|Criar arquivo MDE
4) Na caixa de dilogo Salvar banco de dados como MDE, escolha o banco de dados
original e clique no boto Criar MDE.
5) Na caixa de dilogo Salvar como MDE, escolha o nome do novo arquivo e clique no
boto Criar.

Se o banco de dados original fizer referncia a outros bancos de dados MDB ou banco
de dados de suplemento (.MDA), estes devem tambm ser convertidos para MDE, na ordem
em que eles so referenciados. Por exemplo, se o seu banco de dados db3.mdb referencia
db2.mdb que por sua vez referencia db1.mda, a ordem deve ser db1.dba, db2.mdb e db3.mdb.
Microsoft Access Avanado



136
Para um bom nvel de segurana, defina senhas para o banco de dados do aplicativo
(extenso MDE) e para cada banco de dados de tabelas (extenso MDB). Dentro do cdigo do
aplicativo, vincule as tabelas necessrias via cdigo VBA, passando a senha. Como o cdigo
do aplicativo ficar inacessvel, a senha ficar a salvo no cdigo. Desta forma, as tabelas
tambm ficam protegidas contra alterao de estrutura, j que tabelas vinculadas no podem
ter suas estruturas alteradas.
Eis um cdigo VBA para vincular uma tabela de uma banco de dados protegido por
senha.

Sub LinkTable()
Dim dbs As Database
Dim tdfs As TableDefs
Dim tdf As TableDef

Set dbs = CurrentDb
Set tdfs = dbs.TableDefs
Set tdf = dbs.CreateTableDef("Order Linked")
tdf.Connect = ";database=c:\bd1.mdb; pwd=topsecret"
tdf.SourceTableName = "Order"
tdfs.Append tdf

End Sub


Nesta configurao, os dados das tabelas ainda ficam vulnerveis alterao, assim
como as estruturas das consultas. Os dados somente podem ser protegidos com a segurana
em nvel de usurio. Quanto as consultas, voc pode minimizar o problema com as seguintes
recomendaes:

1) Define a propriedade Origem do Registro de formulrios e relatrios como uma tabela ou
uma consulta SQL (chamando o Construtor de Consulta ou passando a expresso SQL
diretamente).
2) Defina consultas de ao em cdigo VBA, construindo consultas com expresses em SQL
e utilizando o mtodo RunSQL objeto DoCmd.
3) Abra consultas que retorna folha de dados em sub-formulrios. Defina consultas seleo
ou referncia cruzada em cdigo VBA, construindo consultas com expresses em SQL e
passando a expresso como propriedade RecordSource do subformulrio.


Eis um exemplo de consulta de ao definida em cdigo VBA.

Sub DeleteCliente()
Dim strSql As String

strSql = "DELETE * FROM Clientes"
DoCmd.RunSQL (strSql)
End Sub

Eis um exemplo de como passar uma consulta de ao para um subformulrio.
Private Sub cmdAbrir_Click( )
Microsoft Access Avanado



137
Dim strSql as String
strSql = "SELECT * FROM [Detalhes do Pedido]"
Me![subfrmDetalhe].Form.RecordSource = strSql
Me![subfrmDetalhe].Requery
End Sub


13.3. CRIPTOGRAFIA DE BANCO DE DADOS

A criptografia protege o banco de dados contra acesso a seus dados via um editor de
texto ou outra ferramenta de acesso a disco. Ela deve ser usada juntamente com a senha de
banco de dados, pois se algum abrir um banco de dados diretamente pelo Access, a
criptografia no tem efeito nenhum.
Note a ao abrir o banco de dados Northwind.mdb, pelo Wordpad, dados podem ser
lidos.



No arquivo criptografado, todos os dados ficam ilegveis.


Microsoft Access Avanado



138
A criptografia um processo reversvel. Voc pode criptografar um banco de dados e
depois decriptograf-lo.

13.3.1. CRIANDO UM ARQUIVO CRITPTOGRAFADO
1) Abra o MS Access.
2) Certifique-se que o arquivo a ser criptografado no esteja em uso.
3) No menu Ferramentas|Seguraa escolha Criptografar/decriptografar banco de
dados..
4) Na caixa de dilogo Criptografar/Decriptografar banco de dados, selecione um
arquivo no criptografado e clique Ok.
5) Na caixa de dilogo Criptografar banco de dados, informe o novo nome do arquivo e
clique Salvar.

13.3.2. REVERTENDO A CRITPTOGRAFIA
1) Abra o MS Access.
2) Certifique-se que o arquivo a ser decriptografado no esteja em uso.
3) No menu Ferramentas|Seguraa escolha Criptografar/decriptografar banco de
dados..
4) Na caixa de dilogo Criptografar/Decriptografar banco de dados, selecione um
arquivo criptografado e clique Ok.
5) Na caixa de dilogo Descriptografar banco de dados, informe o novo nome do
arquivo e clique Salvar.


13.3.2. CRIPTOGRAFIA POR CDIGO VBA
Use o mdodo CompactDatabase do objeto DBEngine para criptografar outro banco
de dados.

Sub EncryptDb()
DBEngine.CompactDatabase "C:\bd1.mdb", "C:\db1Cripto.mdb", _
dbLangGeneral, dbEncrypt
End Sub


13.4. SEGURANA EM NVEL DE USURIO

A segurana em nvel de usurio o modo mais flexvel e seguro de proteger um
banco de dados. Com ele, para cada objeto, pode-se definir permisses de:
abrir/executar (para formulrio, relatrio e macro)
leitura de dados (para tabela e consulta),
insero de dados (para tabela e consulta),
excluso de dados (para tabela e consulta),
alterao de dados (para tabela e consulta),
visualizao de estrutura,
Microsoft Access Avanado



139
alterao de estrutura e
administrao.

Ainda pode-se definir permisses para o banco de dados:
Abrir/executar,
Abrir exclusivo e
Administrao

As permisses so definidas para cada usurio (chamada permisso explcita) ou para
grupo de usurios (chamada permisso implcita). Neste ltimo caso, os usurios membros do
grupo herdam as permissses do grupo. As definies das permisses ficam armazenadas em
um arquivo de informao de grupo de trabalho, de extenso .MDW.
Por padro, o arquivo de informao de grupo de trabalho o SYSTEM.MDW e
existem dois grupos pr-definidos:
Administradores (Admins, na verso em ingls)
Usuarios (Users, na verso em ingls)

Existe ainda um usurio pr-definido, o Adminsitrador (Admin, na verso em ingls)
que pertence a ambos os grupos pr-definidos.
O arquivo de informao de grupo de trabalho pode ser associado a todos os bancos de
dados ou a apenas um especificamente. O segundo mtodo o mais adequado, pois voc
define segurana por aplicativo.
Ao definir segurana em nvel de usurio, ao abrir o banco de dados ser apresentada
uma caixa de dilogo de Logon para que seja informado o nome do usurio e a senha. Se o
usurio e a senha estiverem corretos, o banco de dados aberto e permitir que o usurio
execute somente as tarefas definidas nas permisses.
As permisses sobre os objetos podem ser alteradas:
Por membros do grupo Administradores.
Pelo proprietrio do objeto.
Por usurios que tenha permisso Administrao sobre o objeto.

13.4.1. PROPRIEDADE SOBRE O BANCO DE DADOS E OBJETOS

Por padro, o usurio Administrador o proprietrio do banco de dados e de todos os
objetos nele contidos. Proprietrio o usurio que criou o objeto. Na segurana em nvel de
usurio no possvel retirar a permisso de usurios criarem objetos. Criando-se um arquivo
MDE, pode-se evitar que novos formulrios, relatrios e mdulos sejam criados. Via
programao, pode-se retirar permisses de usurios de criarem novas tabelas e consultas e
novos banco de dados, mas no se pode retirar permisso de criar formulrios, relatrios,
macros e mdulos.

13.4.2. IMPLEMENTANDO SEGURANA EM NVEL DE USURIO

Microsoft Access Avanado



140
Crie um novo arquivo de informao de grupo de trabalho.
1) Clique no atalho para o Administrador de grupo de trabalho do MS Access. Surgir a
caixa de dilogo a seguir:







2) O arquivo SYSTEM.MDW o arquivo padro de informao de grupo de trabalho.
Clique no boto Criar.

3) Surgir uma caixa de dilogo para definir o proprietrio do grupo de trabalho. Guarde
bem as informaes, incluindo se as letras esto em maisculas ou minsculas.


4) Ao clicar OK, surgir uma caixa de dilogo para o nome e localizao do novo arquivo de
informao de grupo de trabalho.
Microsoft Access Avanado



141


5) Ao clicar OK, uma caixa de dilog surgir confirmando o novo arquivo de informao de
grupo de trabalho. Ao abrir o Access, todos os bancos de dados utilizaro o novo arquivo
para a segurana em nvel de usurio.



Observao: Voc pode pensar em simplesmente criar um arquivo MDW a partir de uma
cpia do system.mdw. Este mtodo no funciona, pois cada arquivo tem uma identificao
nica, formada pelo Nome, Empresa e Cdigo do grupo de trabalho.


Crie um usurio proprietrio e administrador
1) Inicie o Access, sem abrir ou criar nenhum banco de dados. Acione o menu
Ferramentas|Segurana|Contas de usurio e grupo
2) Na caixa de dilogo Contas de usurio e grupo, crie um novo usurio que ser o
proprietrio e administrador do banco de dados de seu aplicativo e inclua-o no grupo
Administradores. Usaremos para exemplo o usurio Master.
Microsoft Access Avanado



142




3) Na caixa de combinao Nome, selecione o usurio Administrador e retire-o do grupo
Administradores.
4) Na guia Alterar senha de logon, informe uma senha para o usurio Administrador. Isto
far com que uma caixa de dilogo de logon aparea ao abrir o Access.
5) Clique no boto OK e saia do Access.
6) Abra novamente o Access. Surgir a caixa de logon. Informe o novo usurio, no caso
Master. A senha no foi definida ainda e portanto, pode clicar OK.
7) Acione o menu Ferramentas|Segurana|Contas de usurio e grupo, selecione a guia
Alterar senha de logon, informe uma senha para o usurio Master. Clique Ok.

Observao: Se voc no retirar o usurio Administrador do grupo Administradores, qualquer
um poder acessar seu banco de dados usando o arquivo padro system.mdw. O usurio
Administrador permanece no grupo Usurios e no pode ser retirado desde grupo.


Criar um banco de dados novo sem permisses de usurio
1) Crie um banco de dados novo. O usurio Master ser o proprietrio do banco de dados. O
grupo Administradores e Usuarios tero todas as permisses sobre todos os objetos e
sobre o banco de dados novo.
2) Acione o menu Ferramentas|Segurana|Permisses para usurio e grupo.
Microsoft Access Avanado



143
3) Mude para listar Grupos e selecione o grupo Usurios. Na caixa de combinao Tipo de
objeto, altere para banco de dados, retire todas as pemisses e clique no boto Aplicar.
4) Na caixa de combinao Tipo de objeto, altere para cada tipo de objeto e retire todas as
pemisses. Clique no boto Aplicar antes de mudar de tipo de objeto.
5) Clique Ok.

Observao: Se voc no retirar as permisses do grupo Usurios, qualquer um poder
acessar seu banco de dados usando o arquivo padro system.mdw e o usurio Administrador,
pois ele ainda permanece ao grupo Usurios.


Defina um grupo de usurios para seu aplicativo
1) Acione o menu Ferramentas|Segurana|Contas de usurio e grupo
2) Na guia Grupos, crie um novo grupo de usurio do seu aplicativo, por exemplo Usuarios
do sistema. Clique Ok.
3) Acione o menu Ferramentas|Segurana|Permisses para usurio e grupo.
4) Mude para listar Grupos e selecione o grupo Usuarios do sistema . Na caixa de
combinao Tipo de objeto, altere para banco de dados, marque somente a permisso
Abrir/Executar e clique no boto Aplicar.
5) Na caixa de combinao Tipo de objeto, altere para cada tipo de objeto e escolha as
permisses desejadas. De um modo geral, os usurios no devem ter permisso de
Modificar estrutura e Administrador. Clique no boto Aplicar antes de mudar de tipo de
objeto.
6) Clique Ok.
7) Se alguns usurio tiverem nveis de permisso diferentes, crie novos grupos de usurios e
marque as pemisses desejadas.

Crie usurios e associe aos grupos
1) Acione o menu Ferramentas|Segurana|Contas de usurio e grupo
2) Crie novos usurios e adicione ao grupo Usuarios do sistema. Todo novo usurio
automaticamente faz parte do grupo Usurios e no pode ser removido dele. Os usurios
herdaro as permisses do grupo ao qual pertencem.
3) Se outro usurio precisar ter o poder de administrar o banco de dados, inclua-o no grupo
Administradores.
4) Todos os usurios no tero senha. Voc deve abrir o Access e efetuar o logon com cada
usurio e definir uma senha. Acione o menu Ferramentas|Segurana|Contas de usurio
e grupo, selecione a guia Alterar senha de logon, informe uma senha para o usurio
atual.

Eliminado a caixa de logon
1) Efetue o logon como Administrador.
2) Acione o menu Ferramentas|Segurana|Contas de usurio e grupo, selecione a guia
Alterar senha de logon, informe a senha atual e mantenha a caixa Nova senha e Confirmar
em branco. Clique OK.

Observao: Ao retirar a senha do usurio Administrador, o Access no mais pedir senha de
logon, e todos os usurios se logaro como Administrador. Como este usurio no tem
Microsoft Access Avanado



144
nenhuma permisso, ele nada poder fazer, a no ser que o grupo Usurios tenha alguma
permisso. Voc pode definir algumas permisses bsicas para o usurio Administrador.
No aconselhvel eliminar a senha do usurio Administrador.


Definindo um arquivo de informao de grupo de trabalho para um aplicativo
1) Acione o Administrador de grupo de trabalho e associe o arquivo original
(SYSTEM.MDW). Isto far com que o Access use o arquivo original mas no permitir o
acesso aos bancos de dados protegidos.
2) Crie um atalho que chame o Access e passe os parmetros de linha de comando.

C:\Arquivos de programas\Microsoft Office\Office\MSAccess.exe C:\bd1.mdb /wrkgrp C:\sistemax.mdw


13.4.2. LOGON POR CDIGO VBA

Ao definir segurana em nvel de usurio, voc pode ter uma complicao com
cdigos escritos sem levar em conta esta segurana. Uma operao que normalmente
funcionava antes pode no funcionar mais depois de configurada a segurana. Um caso tpico
a abertura De uma tabela pelo mtodo OpenRecordset do objeto Database. Normalmente o
cdigo :

Sub AbreTabela()
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("Categorias")
End Sub

Caso o usurio atual no tenha permisso sobre a tabela Categorias, o cdigo falhar.
Se voc no quer dar permisso ao usurio para acessar a tabela, preciso abrir o
banco de dados, via cdigo, com uma conta de um usurio que tenha as permisses
necessrias.

Sub AbreTabela()
Dim wks As Workspace
Dim dbs As Database
Dim rst As Recordset

Set wks = DBEngine.CreateWorkspace("NewWork", "master", "topsecret")
Set dbs = wks.OpenDatabase(CurrentDb.Name)
Set rst = dbs.OpenRecordset("Categorias")
End Sub

Observao: No modo programado, os grupos Administradores e Usurios so referidos como
Admins e Users, respectivamente, e o usurio Administrador Admin, independentemente se
o Access em portugus ou ingls.
Microsoft Access Avanado



145
13.4.3. TROCA DE SENHA VIA CDIGO VBA

Para os usurios mudarem a sua senha, precisam ter acesso ao menu
Ferramentas|Segurana|Contas de usurio e grupoEntretanto, em uma aplicao no
interessante que os usurios tenham acesso a menus. Para resolvere esta situao, pode-se
criar um cdigo VBA para eles mesmos alterem suas senhas, sem ter acesso ao menu.

Sub ChangePassword()
Dim wks As Workspace
Set wks = DBEngine.Workspaces(0)

wks.Users("Teste").NewPassword "senhaantiga", "novasenha"
End Sub

O usurio no precisa ser administrador para alterar sua prpria senha. Porm, eles
no conseguem alterar senha de usurios do grupo Administradores, nem conseguem alterar
sus prpria senha caso esqueam a senha atual.
No exemplo acima, foi alterada a senha do usurio Teste. Uma melhoria do cdigo
seria criar uma caixa de dilogo que obtivesse o nome do usurio atual. O nome do usurio
atual pode ser obtido pela funo CurrentUser().



Private Sub cmdFechar_Click()
DoCmd.Close
End Sub

Private Sub cmdOk_Click()
Dim wks As Workspace

Set wks = DBEngine.Workspaces(0)

If Me.txtNovaSenha <> Me.txtConfirmar Then
MsgBox "Nova senha no confere!"
Exit Sub
End If

On Error Resume Next
wks.Users(CurrentUser()).NewPassword Me.txtSenhaAtual, Me.txtNovaSenha
If Err.Number <> 0 Then
MsgBox "No foi possvel alterar a senha. Confira a sua senha
atual!"
Microsoft Access Avanado



146
End If
End Sub

Private Sub Form_Open(Cancel As Integer)
Me.txtUsuario = CurrentUser()
Me.txtSenhaAtual.SetFocus
End Sub



13.4.4. RETIRAR PEMISSO DE CRIAR NOVOS BANCOS DE DADOS

Quando um usurio efetua o logon no Access, possvel ele fechar o database do
aplicativo e criar um novo banco de dados. Via programao possvel retirar esta permisso.
A permisso de criar banco de dados est no objeto Container, especificamente o
container Databases, do arquivo de informao de grupo de trabalho. Deve-se portanto abrir
este arquivo e configurar a propriedade Permissions do container Databases.
Para acrescentar uma permisso s j existentes, faz-se uma operao Or. Para
remover permisso, faz-se uma operao And Not. As operaes so feitas com as
permisses atuais e uma constante intrseca das Constantes de Segurana. No caso de criao
de banco de dados, a constante a dbSecDBCreate.

Sub Deny_DBCreate()
Dim dbs As Database, ctr As Container, strMDW

' Recupera o caminho e o nome do arquivo de grupo de trabalho
strMDW = DBEngine.SystemDB
Set dbs = DBEngine(0).OpenDatabase(strMDW)
Set ctr = dbs.Containers!Databases
ctr.Username = "Users" ' Grupo Usurios
ctr.Permissions = ctr.Permissions And Not dbSecDbCreate
End Sub
13.4.5. RETIRAR PEMISSO DE CRIAR NOVAS TABELAS E CONSULTAS

As permisses para criar tabelas e consultas ficam so definidas no objeto Container,
especificamente no container Tables, do banco de dados protegido (.MDB). A propriedade
Permissions deste container deve sofrer a operao And Not dbSecCreate.

Sub Deny_Create_TableQuery()
Dim dbs As Database, ctr As Container

Set dbs = CurrentDb()
Set ctr = dbs.Containers!Tables
ctr.Username = "Users" ' Grupo Usurios
ctr.Permissions = ctr.Permissions And Not dbSecCreate
End Sub



ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT



147
ANEXO A - CONVENO DE NOMES PARA
DESENVOLVIMENTO DE APLICAES COM PRODUTOS
MICROSOFT

A Microsoft adota a Leszynski Naming Conventions - LNC, tambm conhecida como notao
hngara, para nomear objetos dos produtos MS Office (Access, Excel, Word, Outlook e
PowerPoint), MS Project, MS BackOffice (SQL Server, Exchange Server, System
Management Server, Internet Information Server e SNA Server) e MS Visual Studio (Visual
Basic, Visual FoxPro, Visual C++ e Visual InterDev). Estes objetos englobam:
Class modules (mdulos de classe do Visual Basic)
Constants (constantes)
Form controls (controles de formulrios do Visual Basic e do Access)
Forms (formulrios do VB e do Access)
Modules (mdulos do VB e Access)
Procedures (procedimentos do VB e Access)
Queries and views (consultas do Access e SQL)
Report controls (controles de relatrio do Access)
Reports (relatrios do Access)
Security objects (objetos de segurana do Access)
Stored procedures (procedimentos armazenados do SQL)
Table fields (campos de tabelas do Access)
Tables (tabelas do Access)
Triggers (gatilhos do SQL)
User-defined types (tipos definidos pelo usurio do VB e Access)
Variables (variveis)

A estrutura da LNC baseia-se em uma tag (etiqueta) antes do nome do objeto (por
exemplo, frmLogin). A sintaxe :

[prefixo(s)] {tag} {Nome} [Qualificador] [Sufixo]

Os elementos entre colchetes so opcionais.
O prefixo e a tag so escritos sempre em letras minsculas. O nome e o qualificador
so escritos em letras maisculas e minsculas. O sufixo pode ser escrito tanto em letras
maisculas quanto minsculas.

Exemplos:

Nome do objeto Prefixo Tag Nome Qualificador Sufixo
qryVendasReopABR qry Vendas Reop ABR
frmSobre frm Sobre
sdtmVigCtr s dtm Vig Ctr
plngAcumulado p lng Acumulado

ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT



148
MICROSOFT ACCESS
Hierarquia dos objetos do Access


Tags para objetos da janela de banco de dados do ACCESS

Objeto Tag
Formulrio (form) frm
Macro mcr
Mdulo (module) bas
Consulta (query) qry
Relatrio (report) rpt
Tabela (table) (*) tbl

(*) As tabelas no usaro prefixo nem tags, somente o Nome.
Tags para objetos controles do ACCESS

Controle Tag
Bound object frame (moldura de objeto acoplado) frb
Chart cht
Check box (caixa de verificao) chk
Combo box (caixa de combinao) cbo
Command button (boto de comando) cmd
Custom control (controle personalizado) ocx
Image (imagem) img
Label (rtulo) lbl
Line (linha) lin
List box (caixa de listagem) lst
Option button (boto de opo) opt
Option group (grupo de opo) grp
Page break (quebra de pgina) brk
Rectangle (retngulo) shp
Section (seo) sec
Subform/Subreport (subformulrio/subrelatrio) sub
Text box (caixa de texto) txt
Toggle button (boto alternar) tgl
Unbound object frame (moldura de objeto no acoplado) fru

ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT



149
Tags para variveis do ACCESS

Objeto Tag
Application app
Collection col
Control ctl
Controls ctls
CustomControl ocx
CustomControlinReport ocx
Debug n/a
DoCmd doo
Err n/a
Form frm
Forms frms
GroupLevel lvl
Report rpt
Reports rpts
Screen scn
Section sec

DATA ACCESS OBJECTS - DAO
Hierarquia dos objetos DAO para Microsoft Jet Workspaces

ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT



150
Hierarquia dos objetos DAO para ODBCDirect Workspaces

Tags para Data Access Objects - DAO
Objeto Tag (ACCESS) Tag (VB)
Connection con
Connections cons
Conteiner ctr
Conteiners ctrs
Database dbs db
Databases dbss
DBEngine dbe
Document doc
Documents docs
Error err
Errors errs
Field fld
Fields flds
Group grp
Groups grps
Index idx
Indexes idxs
Parameter prm
Parameters prms
Properties prps
Property prp
QueryDef qdf qry
QueryDefs qdfs
RecordSet rst rec
RecordSets rsts
Relation rel
Relations rels
TableDef tdf tbd
TableDefs tdfs
User usr
Users usrs
Workspace wrk wsp
Workspaces wrks


ANEXO A - CONVENO DE NOMES PARA DESENVOLVIMENTO DE APLICAES COM
PRODUTOS MICROSOFT



151
MICROSOFT VISUAL BASIC 5.0
Tags para controles do Visual Basic
Controle Tag
3D Panel pnl
Animated button ani
Check box chk
Combo box, drop-down list box cbo
Command button cmd
Common dialog dlg
Communications com
Control (usado em procedures
quando o tipo indefinido)
ctr
Data control dat
Data-bound combo box dbcbo
Data-bound grid dbgrd
Data-bound list box dblst
Directory list box dir
Drive list box drv
File list box fil
Form frm
Frame fra
Gauge gau
Graph gra
Grid grd
Horizontal scroll bar hsb
Image img
Key status key
Label lbl
Line lin
List box lst
MAPI message mpm
MAPI session mps
MCI mci
MDI child form mdi
Menu mnu
MS Flex grid msg
MS Tab mst
OLE ole
Outline out
Pen BEdit bed
Pen HEdit hed
Pen ink ink
Picture pic
Picture clip clp
Report rpt
Shape shp
Spin spn
Text box txt
Timer tmr
UpDown upd
Vertical scroll bar vsb
Slider sld
ImageList ils
TreeView tre
Toolbar tlb
TabStrip tab
StatusBar sta
ListView lvw
ProgressBar prg
RichTextBox rtf
MICROSOFT VISUAL BASIC FOR APPLICATION - VBA
Tags para variveis do Visual Basic for Application
Tipo de varivel Tag
(VBA)
Tag
(VB)
Boolean (lgico) bln
Byte byt
Collection object - col
Conditional Compilation Constant ccc -
Currency (moeda) cur
Date (data) dtm
Double (dupla preciso) dbl
Error err
Integer (inteiro) int
Long (inteiro longo) lng
Object obj
Single (inteiro simples) sng
String (caracter) str
User-Define Type typ udt
Variant var vnt

Você também pode gostar