Você está na página 1de 31

Escola Secundria de Jaime Moniz

Notas sobre programao VBA em Access 2000









Luis Abreu








Ano Lectivo 2001/2002


ndice

Introduo ......................................................................................................................... 3
Captulo 1...................................................................................................................... 4
VBA no Access 2000................................................................................................ 4
Controlo de fluxo.................................................................................................... 11
Captulo 2.................................................................................................................... 17
Os objectos intrnsecos do Access .......................................................................... 17
Captulo 3.................................................................................................................... 22
Utilizando os objectos de dados do Access (ActiveX Data Objects) ..................... 22
Captulo 4.................................................................................................................... 26
Tratamento de erros ................................................................................................ 26
Captulo 5.................................................................................................................... 28
A aplicao Sub-MovieCentral............................................................................... 28

Introduo

O que contm este documento

Este documento tem por principal objectivo ilustrar algumas das capacidades que
Microsoft Access fornece, incidindo sobre aspectos pouco focados ao longo das aulas
prticas (recorde-se que ao longo das aulas foi dado grande nfase ao desenvolvimento
de base de dados utilizando os vrios assistentes fornecidos pela aplicao). O principal
objectivo deste documento introduzir o VBA como meio auxiliar de desenvolvimento
de aplicaes.


O que no deve esperar deste manual

Este documento no de forma alguma uma referncia completa de todas as funes do
Access 2000. Pretende apenas fornecer algumas ideias base que podero ser seguidas
aquando da construo de uma base de dados. Ao longo do manual so apresentados
vrios exemplos prticos que se encontram no site da disciplina
(http://www.luisabreu.go.cc/disciplinas/aplicacoes.htm). Para obter uma referncia
completa sobre todas as funes do VBA deve ser consultada a ajuda on- line que
acompanha o Microsoft Access. Existem tambm vrios artigos tcnicos relacionados
com programao VB/VBA no site MSDN da microsoft
(http://www.msdn.microsoft.com). Para alm deste site, o http://groups.google.com
fornece um dos mais completos newsgroups existentes.

Apesar de terem sido feitos todos os esforos possveis no sentido de garantir a absoluta
correco deste documento, alerta-se todos os interessados para a consulta regular da
pgina da disciplina a fim de puderem proceder a eventuais actualizaes do contedo
(http://luisabreu.go.cc/disciplinas/aplicacoes.htm). O cdigo que acompanha este
manual pode ser retirado do site anterior.

O endereo de mail que serve de suporte a este manual o seguinte:
progC@netmadeira.com. Tambm podem utilizar este mail para colocar eventuais
dvidas relacionadas com o cdigo apresentado.


Captulo 1

VBA no Access 2000

O Access suporta o VBA desde a verso Access 95. O VBA, tambm conhecido por
Visual Basic for Applications
1
, uma linguagem de programao, baseada em
objectos
2
, que pode ser utilizada pelos vrios componentes (programas) do Microsoft
Office.

O objectivo desta seco apresentar, de uma forma bastante rpida, algumas das
caractersticas do VBA.

Utilizao de mdulos

A programao VBA em Access sempre feita em mdulos. Existem trs tipos de
mdulos
3
:
tipo formulrio;
tipo relatrio;
tipo stadalone (que passaremos a designar por mdulos e possuem um
separador prprio no Access que designado de...Mdulos).

Todo o cdigo VBA tem obrigatoriamente de estar contido num destes mdulos. As
funes relacionadas com os formulrios devem ser escritas nos mdulos tipo
formulrio (cada formulrio criado no Access dispe sempre de um mdulo tipo
formulrio associado); por sua vez, todo o cdigo relativo aos relatrios deve ser
armazenado num mdulo do tipo relatrio (cada formulrio possui sempre,
semelhana dos formulrios, de um mdulo tipo relatrio associado); por outro lado, o
cdigo genrico (no relacionado directamente com um formulrio ou relatrio) deve
ser sempre escrito em mdulos tipo standalone.

Mdulos tipo formulrio

Para exemplificar os vrios tipos de mdulos, vamos apresentar alguns exemplos
simples. Antes de comear a escrever cdigo num formulrio, necessrio ter em
ateno as diferenas existentes no modo de visionamento de um formulrio:
modo de desenho;
modo datagrid;

1
A verso actual do VBA (6) coincide com a verso 6 do Visual Basic. A Microsoft props-se a manter
ambas as linguagens sincronizadas.
2
A opinio do autor deste documento diverge da grande maioria dos restantes autores. Muitas vezes o
Access apresentado como sendo uma linguagem orientada a objectos. Isto no corresponde realidade!
O paradigma da orientao a objectos permite a criao de classes (grupo de objectos com as mesmas
caractersticas), a utilizao de tcnicas como o polimorfismo, encapsulamento, etc. Tal no possvel em
VBA ( praticamente impossvel criar classes em VB!). Exemplos de linguagens orientadas a objectos:
C++ (ora a est uma linguagem do agrado do autor), Java, C#, etc.
3
Estes termos so da autoria do autor, no sendo por isso designaes exactas.
modo formulrio.

Um formulrio visto em modo datagrid ou modo formulrio contm cdigo a ser
executado (ou que pode vir a ser executado aquando do acontecimento de determinados
eventos). Por sua vez, no modo de desenho, o cdigo associado a um formulrio nunca
executado.

Vamos agora proceder criao de um formulrio, com um nico boto, que ao ser
clicado apresenta a mensagem Ol Mundo!
4
:
1. criar um novo formulrio na vista de desenho;
2. adicionar um novo boto ao formulrio;
3. clicar com o boto direito sobre o boto adicionado e mudar o nome (tab other,
opo name) do controlo para button e o seu label (tab Format, opo caption)
para Click on me!;
4. os botes tem vrios eventos. Neste caso queremos responder ao evento de
onclick. Para tal, basta seleccionar o boto, e nas propriedades seleccionar o tab
Event. No evento onclick seleccionar [Event Procedure] e clicar no boto ...
sua direita. Deparamo-nos ento com o editor de cdigo VBA.
5. acrescentar a instruo msgbox Hello World!;
6. para testar, basta pr o formulrio em modo de formulrio e clicar sobre o boto


Bem, vamos analisar um pouco melhor o que foi feito. Assim, o primeira aspecto a ter
em ateno reside no facto dos botes terem uma caption (texto que apresentado ao
utilizador que se encontra escrito no boto) e um nome (id que serve para identificar o
boto no formulrio). Alis refira-se que todos os elementos que constituem um
formulrio (designados de objectos ou controlos) tm sempre um nome, servindo esse
nome para identificar o controlo no formulrio ( atravs desse nome que podemos
mudar as propriedades de um determinado controlo do formulrio utilizando VBA).
Convm tambm analisarmos um pouco melhor a janela do editor do VBA (o chamado
IDE):






4
Este exemplo encontra-se nos ficheiros de cdigo com o nome de cap1_1.mdb nos ficheiros que
acompanham este manual.


Conforme possvel ver na figura, o IDE est dividido em vrias zonas. Por cima do
cdigo temos uma zona importante que contm duas caixas de combinao: a primeira
contm o nome do controlo actual; a segunda contm o nome do evento seleccionado.
Ambos estes parmetros so controlados pela posio do cursor na pgina. Tambm
servem para navegarmos rapidamente para a funo pretendida, ou at mesmo
acrescentar uma nova funo.
At agora temos falado de funes e eventos, dando at a ideia de que s podemos ter
funes que servem para processar eventos. Contudo podemos ter funes
independentes, que so evocadas por determinados eventos (mais informao nas
prximas pginas).
Outro conceito que tem sido referido constantemente, e que importa aprofundar um
pouco mais, o de evento. O evento assume um papel muito importante na
programao em VBA. Pode-se mesmo dizer que a programao em VBA event-
driven, ou seja, todas as aces desempenhadas propagam-se sob a forma de eventos,
podendo ento o programador processar o evento (processar no mais do que associar
um conjunto de instrues a um determinado evento). Os eventos existentes so muitos,
e podem ser despoletados por um controlo existente num formulrio, ou at mesmo pelo
prprio formulrio (por exemplo, quando um formulrio aberto, disparado o evento
onload). Como vimos (atravs do exemplo anterior) uma das formas que temos de
processar eventos atravs das opes propriedades ( a que podemos aceder,
seleccionando um controlo e clicando com o boto direito sobre este).

A programao em mdulo tipo relatrio praticamente idntica do tipo
formulrio, pelo que no vamos efectuar qualquer tipo de referncia especfica a
esse tipo de mdulo.

Chama-se ainda a ateno do utilizador para um exame cuidado do ficheiro
cap1_2.mdb, onde apresentado cdigo um pouco mais complexo (mdulo tipo
formulrio).

Mdulos tipo standalone

Todo o cdigo independente deve ser escrito na seco dos mdulos tipo standalone.
recomendvel o agrupamento de funes relacionadas num mesmo mdulo. Podemos
definir vrios mdulos, que esto sempre disponveis para serem utilizados em qualquer
lugar da aplicao.


Declarao de variveis

medida que a complexidade aumenta, torna-se necessrio armazenar informao de
forma temporria; nestes casos podemos recorrer s variveis. A criao de variveis
pressupe trs questes importantes:
tempo de vida da varivel;
nome da varivel;
tipo da varivel.

O tempo de vida da varivel designado de scope. Para alm do scope, uma varivel
sempre caracterizada pela visibilidade. As variveis podem ser locais (no interior de
funes ou do mdulo) ou globais (disponveis em qualquer local da aplicao). As
variveis globais so sempre declaradas nos mdulos
5
, tendo apenas a particularidade de
serem declaradas com uma visibilidade pblica (ut ilizando portanto o qualificador
Public). A declarao de variveis segue a seguinte sintaxe:
visibilidade nome_variavel As tipo_variavel

Exemplos de variveis:
Private var1 As String
Public var2 As Integer

A visibilidade pode ser de dois tipos:
pblica (Public);
privada(Private ou Dim).

A declarao de variveis pblicas apenas tem efeito a nvel de variveis declaradas a
nvel global nos vrios mdulos
6
. Se uma varivel for declarada como pblica num
mdulo, ento possvel aceder ao seu valor (leitura ou escrita) a partir de qualquer
funo (o ficheiro cap1_3.mdb apresenta exemplo da utilizao de uma varivel local ao
mdulo do formulrio - esta varivel passava a ser global se tivesse sido declarada como
Public).


5
A partir de agora o termo mdulo passa a designar os mdulos do tipo standalone. Se uma varivel for
declarada globalmente no mdulo de um formulrio, ento necessrio referenci -la antes de a puder
utilizar (informaes adicionais na parte de programao de objectos).
6
Uma vez que uma varivel declarada no interior de uma funo s existe quando a funo for executada,
ento no h qualquer vantagem em declarar uma varivel como pblica no interior de uma funo.
Falta apenas referir uma ltima opo que possvel aplicar declarao de variveis:
Static. O qualificador Static pode ser aplicado a variveis no interior de funes,
fazendo com que as variveis se portem como variveis declaradas a nvel do mdulo.
Contudo s podem ser acedidas no interior da funo
7
. Exemplo:
Static usr as String


Declarao de funes

Uma funo no mais do que um conjunto de instrues que esto agrupadas sob um
nome, bastando apenas evocar o nome da funo para executar todas essas instrues.
Existem dois tipos principais de funes:
procedimentos: assim designados por no retornarem qualquer valor;
funes: retornam sempre um resultado.

Os procedimentos so sempre declarados utilizado a seguinte sintaxe:

Public Sub Nome_Procedimento( parmetros )

mais codigo
End Sub

Por sua vez as funes seguem a seguinte sintaxe

Public Function Nome_Funo ( parmetros ) As Tipo_Valor_Retorno

mais cdigo
End Function

J agora chama-se a ateno para o facto de os comentrios serem feitos em VB
utilizando o smbolo .

Repare-se que a visibilidade de um funo (se s est disponvel no mdulo, ou ento,
se se encontra disponvel em toda a aplicao) tambm ela qualificada pelos dois
termos Public e Private (portanto, de forma semelhante s variveis). A qualificao dos
procedimentos e das funes no obrigatria, sendo que quando no utilizado
nenhum qualificador, o qualificador Public automaticamente atribudo ao
procedimento. Tambm possvel atribuir o qualificador Static a um procedimento ou
funo. A qualificao de uma funo (ou um procedimento) de static converte
automaticamente todas as variveis em variveis estticas.


Utilizao de parmetros


7
Para melhor percebe-se o funcionamento das variveis estticas (static) h que perceber o que acontece
normalmente a uma varivel. Quando uma varivel declarada no inicio de uma funo, essa varivel
existe at ao fim da funo (at chegar ao End Sub ou End Function). Ao chegar ao fim da funo, a
memria libertada, e o eventual valor que a varivel continha perdido. Por sua vez, as variveis
estticas no so destrudas quando se chega ao fim da funo. Da prxima vez que a funo for
executada, a varivel esttica contm o valor que tinha no fim da ltima execuo da funo.
Por vezes necessrio passar valores externos para o interior dos
procedimentos/funes. Se no existissem parmetros, teramos de recorrer sempre a
variveis globais como forma de passar valores para o interior dos
procedimentos/funes.

A utilizao de parmetros bastante simples: basta introduzir o nome seguido do tipo
do parmetro. Podemos at considerar os parmetros como sendo variveis que so
automaticamente inicializadas aquando da execuo da funo.

Sub Teste( par as Integer )
os parmetros podem ser utilizados como variveis no interior das
funes
par = par + 1
End Sub

Se por acaso houvesse mais parmetros, teramos de introduzi- los da mesma forma que
o parmetro par, utilizando a , para separ- los. Se por acaso for necessrio passar para a
linha de baixo, temos de indicar esse facto utilizando para tal o caracter _. Exemplo:
Sub Teste( par as Integer, _
par2 as Integer)


End Sub


Parmetros Opcionais

Tambm possvel termos parmetro opcionais. Os parmetros opcionais so sempre
declarados no fim da lista de parmetro de uma funo. Para tornar um parmetro de
opcional, basta apenas declar- lo como sendo do tipo Variant. Para ver se o parmetro
foi introduzido basta utilizar a funo IsMissing()
8
.

Function Salutation(strFirst as String, strLast as String, _
Optional varSalutation as Variant) as String

If IsMissing(varSalutation) Then
Salutation = strFirst & " " & strLast
Else
Salutation = varSalutation & " " & strFirst & " " & StrLast
End If
End Function

O simbolo & responsvel por efectuar a concatenao das duas strings. Tambm
possvel passar n parmetros opcionais. Para tal temos de qualificar a varivel de
ParamArray.

Public Function Concat(ParamArray avarArray() as Variant) as String

End Function

8
Repare -se na diferena de processos para evocar uma subrotina: no caso dos procedimentos, basta
escrever o nome da subrotina (ex: soma a, b procedimento soma com dois parmetros); no caso das
funes, temos de introduzir parntesis (ex: c = soma( a, b ) ).


Parmetros por referncia e parmetros por valor

O que acontece quando modificamos o valor de um parmetro no interior de uma
funo (ou de um procedimento)? A resposta um pouco mais complicada do que
parece primeira vista.

Suponhamos o seguinte exemplo:

Sub WhatsMyValue()
Dim intX as integer
intX = 10
SquareIt(intX)
MsgBox intX
End Sub

Sub SquareIt(intSquare as Integer)
intSquare = intSquare * intSquare
End Sub

Como podemos ver, o parmetro inicializado com a varivel. Qual o valor da varivel
aps a execuo da funo SquareInt (recorde-se que o valor do parmetro mudou
dentro da funo)? Neste caso o valor da varivel X no alterado de 10 para 100
(ficheiro cap1_4.mdb). De facto, os parmetros so passados (por defeito) por valor
(estamos a falar dos tipos primitivos do access, como por exemplo o integer; no caso
dos objectos, a passagem feita por referncia). Existe uma outra opo (por referncia)
caso em que os parmetros trabalham directamente sobre o valor. Podemos especificar o
tipo de parmetro atravs de dois termos reservados:
ByRef: parmetro por referncia;
ByVal: parmetro por valor.

Exemplo da utilizao destes qualificadores:

Sub Test( ByRef par1 as String, ByVal par2 as String )
End Sub

Como j foi dito, os parmetros por referncia trabalham directamente sobre o valor de
uma varivel. Da que tenhamos que ter o cuidado de ao evocar a funo, ter em ateno
que um parmetro por referncia tem de estar sempre relacionado com uma varivel (l-
value) e nunca com um valor constante (r-value). O exemplo seguinte tenta evocar o
procedimento apresentado no pargrafo anterior:
Dim var as String
cdigo....
exemplo da correcta utilizao
Test var, String 2

forma incorrecta
Test String1, String2

Em relao aos parmetros por valor no h qualquer tipo de preocupao, pois
podemos passar uma varivel ou um valor constante
9
. Contudo o mesmo j no
acontece em relao aos parmetros por referncia.
Controlo de fluxo

Tal como em todas as linguagens de alto nvel, existem dois tipos de estruturas de
controlo de fluxo:
estruturas de deciso: permitem tomar decises;
estruturas de repetio: permitem repetir um conjunto de instrues.

Os principais dois tipos de estrutura de deciso so o if e o select. Tm a seguinte
sintaxe (uma vez que os alunos inscritos esto matriculados em TLP, apenas
apresentamos a sintaxe sem indicar quaisquer exemplos da utilizao deste tipo de
estruturas, pois apenas esta (sintaxe) a diferena existente entre as estruturas de
controlo de fluxo do VBA e as do C ou do Pascal) :

If condio then
Bloco de intrues
Else
Bloco de instrues
End If

Select Case condio
Case valor1
' Process valor1
Case valor2
' Process valor2
Case Else
' All other days.
End Select


Por sua vez, existem trs tipos de estruturas de repetio: do...loop, for....next e for
each...next. A sintaxe de cada um das estruturas a seguinte:

Do While | Until condition
statements
Exit Do
statements
Loop

Do
statements
Exit Do
statements
Loop While | Until condition


For intLoop = 1 To 10 [Step 1]

9
Neste caso estamos a falar dos chamados r-values, que so valores constantes e no de constantes
definidas pelo utilizador. Exemplos de r-values: 10 (exemplo de um inteiro), test (exemplo de uma
string), etc.
' Run Code
Next intLoop


Existe uma diferena entre o Do While e o Do Until. O Do While executa um conjunto
de instrues enquanto a condio for verdadeira; por sua vez o Do Until executa um
conjunto de instrues at que a condio seja verdadeira. O ciclo for contm uma parte
opcional: step. Se for omitida, ento equivalente instruo step 1. O step serve para
controlar o incremento da varivel que controla a execuo das instrues que se
encontram no interior do ciclo.


Objectos existentes

Como j foi referido, a programao VBA baseada em objectos. Praticamente tudo
um objecto. Os objectos tm propriedades e mtodos que so expostos (pblicos). O
Object Browser permite ver as propriedades/mtodos expostos por um objecto. Para
aceder ao object browser, basta carregar na tecla F2 no IDE do VBA.
Se for necessrio, podemos recorrer a objectos exteriores. Por exemplo, pode ser
necessrio integrar o word numa base de dados, utilizando para construir relatrios
escritos. Para tal basta indicarmos ao Access que desejamos utilizar esse(s) objecto(s)
atravs da opo Referncias no menu Ferramentas do IDE de VBA.




Programao com objectos

Apesar de j termos utilizado objectos nalguns dos exemplos apresentados at agora,
ainda no tnhamos dedicado especial ateno sua utilizao. Est na hora de
colmatarmos essa lacuna.


Os termos Public e Private (revisitados)

Como vimos, as variveis podem ser pblicas ou privadas. Tambm foi visto que as
variveis pblicas que se encontram definidas num mdulo so variveis globais. Se
declararmos uma varivel global num mdulo standalone, ento para acedermos a essa
varivel temos apenas de escrever o nome da varivel. Contudo, se a varivel estiver
contida num formulrio ou relatrio, ento tem de ser qualificada do nome do
formulrio. O ficheiro cap1_5.mdb apresenta um exemplo bastante simples sobre este
tpico. Convm ainda chamar a ateno para o nome que utilizado no mdulo para
identificar o formulrio. Apesar do formulrio ter sido identificado de testes, o seu id
form_testes (isto est relacionado com o facto de estarmos a trabalhar com a classe do
formulrio; mais informaes sobre isto frente). Por isso que foi utilizado
form_testes no cdigo existente no mdulo.


As propriedades de um objecto

Para se aceder s propriedades de um objecto basta fazer o seguinte:
Nome_objecto.propriedade

Por exemplo, se tivermos uma edit box com o nome de edit, ento podemos aceder a
propriedade value da seguinte maneira: edit.Value. Existem algumas propriedades que
so s de leitura, outras de escrita e ainda outras que suportam ambas as operaes.
Muitos objectos fornecem uma propriedade por defeito. Nesse caso no necessrio
indicar a propriedade. Por exemplo, as edit boxes apresentam o Value como propriedade
por defeito. Por isso podemos utilizar (aproveitando o exemplo anterior) edit como
sinnimo de edit.Value. Todos os objectos tm uma propriedade por defeito (ou melhor,
quase todos, uma vez que isso depende da maneira como o objecto foi implementado).
Existe uma forma de aceder a vrias propriedades de um objecto em simultneo. Para
tal utilizamos o With. Exemplo (supondo que temos uma edit box com o nome de
text1):
With text1
.Backcolor = 0
.Width = 200
.Height = 400
End With


Os mtodos de um objecto

Da mesma forma que podemos aceder s propriedades de um objecto, tambm
possvel aceder aos mtodos de um objecto. Um mtodo uma subrotina pblica, e por
isso semelhante a uma funo ou procedimento. A nica diferena reside no facto de
termos de qualificar o nome do mtodo pelo nome do objecto. Exemplo:
Objecto.metodo

Mais uma vez necessrio ter em ateno que as funes tm obrigatoriamente de ser
evocadas utilizando parntesis, enquanto que os procedimentos no devem ser evocados
com parntesis. Os exemplos seguintes ilustram a diferena:

Object.metodo procedimento
Object.metodo() funo

Tambm possvel evocar mtodos de objectos com parmetros (alis como era de
esperar!). O exemplo seguinte mostra como (para funes e para procedimentos):
Object.metodo( 10, 20 ) funo
Object.metodo 10, 20 procedimento


Passando valores a parmetros pelo nome

Geralmente os valores so passados aos parmetros pelo posio em que so colocados
na evocao da funo/procedimento. Contudo, podemos utilizar outra tcnica que
consiste em passar os parmetros pelo nome. A sintaxe a seguinte:
Object.Metod Parameter1:=expression, _
Parameter2:=expression,...Parametern:=expression

Podemos utilizar os parmetros com nome numa situao em que temos parmetros
opcionais e no queremos ter o trabalho de andar a escrever virgulas. Por exemplo,
suponhamos que temos uma funo com cinco parmetros, e que s queremos passar
valores para o primeiro e para o ltimo parmetro. Neste caso a utilizao de parmetros
por nome facilita e ajuda a melhor documentar o cdigo.


Atribuio de objectos a variveis

Normalmente, quando atribumos uma varivel a outra estamos a copi- la (portanto, o
comportamento semelhante ao que acontece na passagem de parmetros por valor).
Dim intX as integer
Dim intY as integer
intX = 10
intY = intX
intX = 20
MsgBox intY


No exemplo anterior, aps efectuarmos a atribuio do intX ao intY, um modificao no
intX no afecta a varivel intY. Isto porque intY apenas foi inicializada com uma cpia
do valor de intX. Contudo, e se for necessrio, tambm podemos ter referncias, ou seja,
variveis que se tm um comportamento semelhante passagem de parmetros por
referncia. Por exemplo:

Dim txtName as TextBox controlo de um form
Me!UserName = "Bill"
Set txtName = Me!UserName controlo passa a ser ref para o objecto
username que existe no form
Me!UserName = "Joe"
MsgBox txtName

No exemplo anterior a utilizao da instruo Set torna txtName numa referncia.
Assim, ambas as variveis apontam para o mesmo endereo de memria. Da que a
mensagem apresentada ao utilizador seja Joe. O ficheiro cap1_6.mdb apresenta alguns
exemplos de programao de objectos. S mais uma observao: a utilizao do set faz-
se sempre que seja necessrio utilizar objectos! (como no exemplo anterior)


Coleces

O VBA rico em coleces. Podemos considerar que as coleces consistem num
conjunto de objectos relacionados. Por exemplo, uma base de dados contm um
conjunto (coleco) de tabelas, que por sua vez contm um conjunto de ndices. Por
outro lado, existe tambm um conjunto de consultas, um conjunto de formulrios, etc.
Se atentarmos nos formulrios, podemos tambm afirmar que eles so constitudos por
um conjunto de controlos (editboxes, buttons, checkboxes, etc).

O ficheiro cap1_7.mdb mostra como se pode aceder a algumas das coleces existentes
no Access. Suponhamos que apenas queremos imprimir o valor das edit boxes. Como j
vimos, temos de utilizar a propriedade Value. Contudo, o seguinte cdigo no
suficiente:

Dim c as control
For each c in me!controls
Msgbox c.value
Next

Bem, o problema reside no facto de nem todos os controlos terem uma propriedade
chamada value (recorde-se que as labels que acompanham as edit boxes so tambm
controlos). A soluo mais correcta ser ento a seguinte:
For Each ctlCurrentIn Me.Controls
' Process the control ctlCurrent
If ctlCurrent.ControlType = acTextBox Then
ctlCurrent.Left = Me!txtLocation
End If
Next

A propriedade controltype permite aferir qual o tipo de controlo actual. Para uma
descriminao mais pormenorizada sobre os objectos e respectivas propriedades
aconselhvel a consulta do manual de VBA que acompanha o Access. J agora refira-se
que o termo reservado Me refere-se ao objecto actual: neste caso ao formulrio.


Criao de propriedades num formulrio

A maneira mais simples de criar uma propriedade num formulrio consiste em declarar
um varivel com o qualificador Public. Contudo, existe uma outra maneira que permite
um maior controlo por parte do programador: a definio de propriedades utilizando o
get e set. O ficheiro cap1_8.mdb apresenta um exemplo da definio de uma
propriedade utilizando o get e o set. A grande vantagem deste mtodo reside no facto de
ser possvel proceder a verificaes antes de armazenar a informao numa varivel.
Existem vrios tipos de propriedades:
escrita: permitem apenas a leitura, ou seja, s define o mtodo get;
leitura: permite apenas a escrita, ou seja, s define o mtodo set;
leitura/escrita: permite quer a leitura quer a escrita (portanto definem mtodos
set e get).

Qual o prximo passo?

Bem, este captulo serviu para termos algumas ideias sobre as potencialidades do
Access. Serviu tambm para apresentar as principais caractersticas da sua linguagem de
programao VBA. Ficmos a conhecer vrios aspectos importantes que recordamos
aqui:
variveis;
qualificadores;
mtodos;
tipos de mdulos;
estruturas de controlo de fluxo;
mtodos;
parmetros;
controlos;
propriedades.

O prximo captulo (Objectos do Access) parte dos aspectos bsicos deste captulo e
apresenta, de uma forma mais ou menos detalhada, os objectos existentes no Access.

Captulo 2

Os objectos intrnsecos do Access


O captulo anterior introduziu as bases necessrias compreenso das coleces. Na
atura, apresentamos uma coleco como sendo um conjunto de objectos do mesmo tipo.
Tambm afirmmos que o Access muito rico em coleces. Como exemplo, chegmos
a falar dos vrios tipos de coleces que Access possui: tabelas, consultas, formulrios,
etc. Vamos comear por falar na criao de coleces.


Coleces definidas pelo programador

possvel criarmos a nossa prpria coleco utilizando o VBA. Antes de explicarmos
como, convm apontar alguns aspectos que nos levem a criar a nossa prpria coleco.
No captulo 1 no chegmos a mencionar a existncia de um tipo fundamental de dados:
o Array!
O array permite guardar um conjunto de valores do mesmo tipo, sob o nome de uma
varivel. O exemplo seguinte ilustra um array de 10 inteiros:

Dim arr (10) as integer
Dim i as integer
preencher o array atravs dum ciclo
for i = 1 to 10
arr(i) = i
next

Para definir um array sempre necessrio introduzirmos o nmero de elementos que o
array comporta. Esta a grande desvantagem que reside na utilizao dos arrays! Por
sua vez, uma coleco no necessita de, partida, saber quantos elementos vai
armazenar. Da que, nos casos em que no sabemos quantos elementos queremos
armazenar, seja vantajoso utilizar coleces.


Como criar coleces e manipul-las

Para criar uma coleco temos apenas de escrever o seguinte:

Dim col1 as collection
Ou
Dim col2 as new collection

A segunda instruo a prefervel pois cria um novo objecto do tipo collection (sim, at
as coleces so objectos em VBA!). A primeira apenas define uma varivel, no
chegando a criar o objecto em si. Antes de utilizarmos a col1 temos de criar o objecto.
Para tal temos duas hipteses:
utilizamos o new;
utilizamos uma referncia para uma coleco que j exista (utilizando o termo
reservado set, tal como foi feito no captulo anterior).

Exemplo:

criar nova coleco
If col1 Is Nothing Then Set col1 = New Collection

utilizar referncia para uma coleco j existente - por exemplo col2
set col1 = col2

O ficheiro cap2_1.mdb apresenta um conjunto de exemplos que ilustram o
manuseamento de arrays e de coleces (com particular nfase nas coleces).


O modelo de objectos do Access

O modelo de objectos do Access um modelo hierrquico, cujo objecto de topo se
chama Application. A figura seguinte ilustra o modelo de objectos existente no Access.


O objecto Application

O objecto Application suporta vrios mtodos, propriedades e coleces que permitem
efectuar. Por exemplo, se quisermos sair da aplicao podemos utilizar o mtodo quit.
Este mtodo aceita um parmetro opcional que permite especificar como proceder em
relao a eventuais operaes que no tenham sido gravadas. As hipteses so as
seguintes:
acPrompt;
acSave;
acExit.

Exemplo da utilizao do mtodo: Application.Quit acPrompt

O Access 2000 apresenta dois novos objectos que permitem um fcil acesso s
coleces intrnsecas do Access: Tabelas, Consultas, Relatrios, etc. O objecto
CurrentData permite aceder s seguinte coleces:
AllTables;
AllQueries;
AllViews;
Etc.

Por sua vez, o objecto CurrentProject apresenta as seguintes coleces:
AllForms;
AllReports;
AllMacros;
AllModules;

Estes objectos apresentam ainda mais alguma coleces que no iremos referir. Para
mais informaes deve ser consultado o manual do Access. Estas coleces contm
objectos do tipo AccessObject, que apresenta as seguintes caractersticas:
Name: nome do objecto como aparece na janela da base de dados;
FullName: caminho completo para a pagina de acesso de dados;
IsLoaded: indica se objecto est ou no aberto;
Type: indica o tipo do objecto (retorna uma constante do tipo acObjectType);
Properties: coleco de propriedades definidas para objecto em questo (apenas
aplicvel a objectos obtidos a partir das coleces do CurrentProject).


O ficheiro cap2_2.mdb ilustra quais os objectos que existem na base de dados
seleccionada.
O objecto CurrentProject apresenta tambm algumas propriedades teis. Exemplo:
FullName : caminho completo para o ficheiro de base de dados;
Name : nome da base de dados (sem o caminho at ao ficheiro);
Path : caminho da base de dados (sem o nome do ficheiro).


Coleco dos formulrios e dos relatrios

No capt ulo anterior j foram dados alguns exemplos da utilizao de formulrios (a
utilizao de relatrios muito semelhante).
Quando escrevemos cdigo num mdulo do tipo formulrio (ou do tipo relatrio)
podemos utilizar o termo reservado Me para nos referirmos ao prprio formulrio (
contudo, se quisermos, podemos omitir pois este assumido por defeito). Quando
estamos a escrever cdigo num formulrio, e nos queremos referir a outro formulrio,
temos de qualificar o nome do outro formulrio de forma conveniente. Por exemplo:
Forms!Form1.Caption = MyCaption
Neste caso temos de ter a certeza de que o formulrio est aberto antes de utilizarmos a
instruo anterior. A funo seguintes mostra como podamos utilizar a referncia de
uma forma segura:

Private Sub cmdMyButton_Click()

On Error GoTo Err_cmdMyButton_Click

Forms!frmExample.Caption = "MyForm"

Exit_cmdMyButton_Click:
Exit Sub

Err_cmdMyButton_Click:

If Err = 2450 Then ' Form not open
DoCmd.OpenForm "frmExample"
Resume
Else
MsgBox "Error: " & Err.Description
Resume Exit_cmdMyButton_Click
End If

End Sub
A rotina anterior introduz o chamado error handling, ou seja o
lugar, proceder abertura do formulrio atravs da instruo
DoCmd.OpenForm frmExample". A instruo resume serve para tratamento
do erro. A primeira instruo informa o procedimento que em caso de
erro deve prosseguir para a linha com a label Err_cmdMyButton_Click.
Essa linha verifica em primeiro lugar o cdigo do erro (utilizando
para tal o objecto Err do VBA). Neste caso, se o erro for o 2450,
ento temos de, em primeiro indicar ao Access que aps o processamento
da rotina de erro deve ser retomado o cdigo responsvel pelo erro (ou
seja, deve ser retomada a execuo do programa na linha que originou o
erro). Por sua vez a mensagem Resume Exit_cmdMyButton_Click serve para
indica que o Access deve retomar o cdigo na linha
Exit_cmdMyButton_Click.

Poderamos tambm verificar se o formulrio j est carregado antes de utilizarmos a
referncia:

Function ap_FormIsOpen(strFormName As String) As Boolean

ap_FormIsOpen = _
Application.CurrentProject.AllForms(strFormName).IsLoaded

End Function

Em vez de utilizarmos a coleco dos formulrios para acedermos a um formulrio,
podemos referirmo-nos classe do formulrio (alis, foi esta a estratgia que utilizmos
no captulo anterior). Se tivermos um formulrio chamado de Form1, temos de nos
referir a esse formulrio como Form_Form1.Caption = My Caption (refira-se que
neste caso as alteraes so aplicadas a todos os formulrios que venham a ser abertos).
Captulo 3
Utilizando os objectos de dados do Access (ActiveX Data Objects)

O principal objectivo deste captulo introduzir o ADO (ActiveX Data Objects). Estes
objectos vieram substituir o DAO (Data Access Objects) como meio preferencial de
aceder base de dados por forma a inserir, eliminar e modificar informao.
Actualmente o Access suporta ambas as tecnologias. Contudo, a partir da verso 2000 a
Microsoft encoraja a utilizao do ADO como meio de acesso aos dados armazenados
na base de dados
10
.
O ADO o mtodo standard para aceder a base de dados. Comeou por ser utilizado
pelos programadores de VB para acederem base de dados, uma vez que no
conseguiam utilizar o OLE DB para esse efeito.

Modelos de objectos do ADO

A tecnologia ADO suporta vrios modelos
11
de objectos, que se subdividem em:
ActiveX Data Objects (ADODB) que permite a criao de recordsets e o
processamento de erros;
ADO Extensions (ADOX), que permite modificar a estrutura da base de dados (
a nvel da criao/modificao de tabelas
Jet and Replication Objects (JRO), que permite trabalhar com o motor da base
de dados (JET) e com a replicao da base de dados.

Este modelos de objectos encontram-se, apesar de separados, relacionados. Iremos
apenas estudar o modelo ADODB, utilizado na manipulao da informao que se
encontra armazenada na base de dados.


10
O DAO possui o seu prprio modelo para aceder informao. Aconselha-se os interessados em
aprenderem a utilizar o DAO para recorrerem ao manual do VBA.
11
De facto, ao contrrio do DAO, que apenas apresenta um modelo, o ADO apresenta vrios modelos de
objectos independentes.
O modelo ADODB

A figura seguinte tenta mostrar os principais objectos que compem o modelo de
objectos ADODB:


O objecto Connection permite efectuar ligaes base de dados. O objecto Errors
permite ao utilizador efectuar o tratamento de erros. O objecto Command permite
efectuar aces sobre a base de dados (geralmente utilizado para obter resultados de
consultas, inserir dados, etc). Costuma ser acompanhado de um conjunto de parmetros
(coleco Parameter, composta, como seria de esperar, por objectos Parameter). O
objecto Recordset, que contm um conjunto de registos devolvidos aps a execuo de
uma consulta. Antes de comearmos a utilizar os objectos ADO, h que informar o
Access que os queremos utilizar. Para tal, temos que incluir uma referncia aos objectos
ADO2.1 (consulte o captulo anterior para ver como que se procede introduo de
uma referncia de objectos).


Estabelecendo a ligao base de dados

A partir de agora todos os exemplos apresentados so mais completos e, sempre que
possvel, apresentam exemplos de manipulao de dados utilizando a programao.
Bem, sempre que utilizarmos o ADO para manipular a informao que se encontra na
base de dados temos, em primeiro lugar, de estabelecer uma ligao a essa base de
dados. Aps estabelecermos a ligao, podemos enviar comandos que iro ser
processados pelo motor da base de dados.
Para estabelecer a ligao (a chamada connection) temos de utilizar o objecto
Connection do ADO. O estabelecimento de uma ligao a uma base de dados envolve
sempre a configurao da chamada connection string (uma string que serve para
configurar os parmetros necessrios ligao: caminho para o ficheiro da base de
dados, utilizador, password, etc.). A situao mais utilizada consiste em nos ligarmos
base de dados actual (ou seja, estamos a desenvolver um projecto e, geralmente, ligamo-
nos a essa base de dados para manipularmos a informao). Neste caso a seguinte
instruo suficiente para assegurar a correcta configurao da ligao (ou seja, para
assegurar a correcta obteno do objecto connection):

utilizar o namespace ADODB para nos referirmos
o conceito de namespace um conceito mais avanado
que serva para identificar um conjunto de nomes (evitar conflitos)
Dim conLocal as ADODB.Connection

utilizar o objecto CurrentProject e a sua propriedade Connection para estabelecer a
ligao
set conLocal = CurrentProject.Connection

A ligao a outra base de dados um pouco mais complexa e apresentada apenas para
satisfazer a curiosidade (uma vez que no ir ser utilizada ao longo do manual):

Sub DisplayAnotherConnection()

Dim cnnNet As New ADODB.Connection
cnnNet.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Books\PwrPrg2000\AppCD\Examples\VideoDat.mdb"

cnnNet.Close

End Sub


Repare-se que neste segundo caso foi necessrio criar um objecto do tipo pretendido
utilizando para tal a instruo NEW (recorde-se que os objectos tm que ser sempre
inicializados atravs do NEW ou do SET). Outro aspecto importante reside no facto de,
no segundo excerto de cdigo, ser necessrio abrir a ligao base de dados.

Aps estabelecida a ligao, costume procedermos a uma de duas operaes:
obter dados que se encontram nas tabelas;
inserir/modificar/eliminar dados que se encontrem nas tabelas.


O objecto Recordset

Para obtermos dados provenientes das tabelas temos de utilizar o objecto Recordset.
Este objecto responsvel por guardar a informao proveniente da execuo de uma
instruo SQL
12
. Aqui apenas analisamos o objecto recordset como forma de obter
informao; contudo, ele tambm pode ser utilizado para modificar/acrescentar
informao.
O cdigo seguinte ilustra como poderamos obter todas os registos de uma tabela
chamada tblMoviesTitles:



12
O SQL a linguagem utilizada para acedermos a base de dados. A instruo SELECT responsvel
por seleccionar um conjunto de registos de uma ou mais tabelas que verifiquem uma determinada
condio.
Como estamos a ver, o cdigo bastante simples! S temos que seguir a seguinte
sintaxe:
Recordset.Open string_sql, connection_object, cursor_type, locking_method

A string de sql uma string que contm as instrues que se pretendem executar sobre a
base de dados. O objecto Connection necessrio para assegurar uma ligao base de
dados (s aps estabelecida a ligao que podemos executar as instrues
pretendidas). O CursorType define a maneira como o nosso recordset deve-se portar:
adOpenKeyset: possvel actualizar os dados do recordset, no sendo contudo
visiveis as alteraes que outros utilizadores podem estar a efectuar;
adOpenStatic: recordset s de leitura (deve ser utilizado em situaes de
consulta); pode-se navegar em ambos os registos;
adOpenForwardOnly: igual ao anterior, com a particularidade de a navegao
ser s num sentido.
O LockingMethod est relacionada com as medidas de segurana que devem tomadas
aquando da execuo de determinadas operaes sobre o recordset. As opes possveis
so as seguintes:
adLockOptimistic: tranca os recordsets apenas quando so modificados e
gravados;
adLockPessimistic: tranca o receordset aquando da edio (alterao) dos
valores;
apLockReadOnly: trancar o recordset.
Existem alguns conselhos teis que devem ser seguidos:
para a construo das strings SQL devemos utilizar as vistas de consultas. As
consultas no so mais do que instrues SQL. Da que a maneira mais fcil de
construirmos as consultas passa pela utilizao deste editor; em seguida,
mudamos para a vista de sql e simplesmente copiamos a instruo de SQL;
a melhor opo para o Locking method a adLockOptimistic (uma vez que
apenas vamos utilizar os recordsets para obter informao).
Como vimos, os recordsets obtm dados de uma (ou mais) tabela(s). Assim, muito
provvel que algumas instrues retornem recordsets vazios, ou seja, sem nenhum
registo. Antes de explicarmos como podemos proceder a essa validao temos de
introduzir dois novos conceitos: EOF e BOF.
A propriedade EOF (s de leitura) retorna true (verdadeiro) se estivermos antes do
primeiro registo do recordset; por sua vez, a propriedade BOF retorna true se estivermos
depois do ltimo registo da base de dados. Logo, podemos utilizar a seguinte expresso
para verificarmos se temos um recordset vazio:

If rec.EOF and rec.BOF then
temos um recordset vazio
end if

Por outro lado, se o recordset no estiver vazio, bvio que podemos querer percorrer
os vrios valores do recordset. Para percorremos os valores do recordset podemos
utilizar a seguinte estratgia:

Set cnnLocal = CurrentProject.Connection

string sql pede todos os valores da a utilizao do *
em que o campo ReleaseDate seja igual a 02/01/99 o Access
obriga a utilizao do # para especificar a data
rstCurr.Open "Select * from tblMovieTitles where ReleaseDate =
#02/01/99#", cnnLocal, _
adOpenKeyset, adLockPessimistic

Do Until rstCurr.EOF
'-- Print each of the fields
For Each fldCurr In rstCurr.Fields
Debug.Print fldCurr.Value
Next

rstCurrent.MoveNext

Loop

rstCurr.Close

Como podemos ver, possvel aceder coleco dos campos retornados por um
recordset atravs da coleco Fields, que contm objectos do tipo Field. Como a
propriedade Fields a propriedade por defeito do objecto recordset, ento para
acedermos ao campo Nome de um recordset (suponhamos que j obtivemos o recordset,
e que um dos campos se chama Nome) podemos utilizar qualquer uma das seguinte
linhas:

supor que temos um recordset rec
e que o recordset j foi inicializado
rec.Fields.Item(Nome)
ou
rec.Item(Nome)
ainda podemos simplificar mais se tivermos em ateno que a propriedade Item
a propriedade por defeito do objecto Fields
por isso podemos ter ainda o seguinte:
rec(Nome)
O ficheiro cap2_3 apresenta uma base de dados com trs formulrios. Um formulrio
permite introduzir os dados; outro permite ver os dados existentes; e o terceiro permite
eliminar os dados. Foi utilizada programao VBA nos trs casos para mostrar como
possvel construir uma base de dados recorrendo somente a VBA. Repare-se ainda na
utilizao das regras de validao e respectivo texto de validao como meio auxiliar de
proceder verificao de certas restries (se quisssemos podamos ter utilizado
cdigo para efectuar esta validao).

Captulo 4
Tratamento de erros

Como do conhecimento geral, no h nenhum programa que possa considerar-se
imune a erros. Seno vejamos o exemplo do Windows
13
: quem que nunca se deparou
com um dos famosos ecrs azuis (BSOD- blue screen of death)?
Quando ocorre um erro, o Access mostra-nos uma mensagem de erro. Esta mensagem
geralmente permite- nos efectuar a depurao. Isto bom quando estamos em

13
Sim, o Windows um sistema operativo. Contudo, um sistema operativo no mais do que um
programa especial, que tem como principal objectivo gerir um computador.
desenvolvimento. Contudo, aps terminada a fase de desenvolvimento, no muito
agradvel utilizar um programa que, perante um erro, mostra uma mensagem destas:

Assim apareceu o error handling
14
! O error handling permite-nos efectuar o tratamento
de um erro, fazendo com que a nossa aplicao termine de uma forma controlada. Bem,
em muitos casos, at podemos impedir que esta termine, pois possvel apanhar o
erro e continuar a correr o programa. O Access efectua o tratamento de erro atravs dos
seguintes termos reservados: On Error, Exit e Resume.

A instruo On Error indica a instruo que o Access deve retomar em caso de erro
(deve ser sempre colocada no incio de uma funo ou procedimento). A instruo On
Error costuma ser utilizada com labels. A funo seguinte ilustra essa utilizao:

Sub Test()
tratamento de erro deve ser a primeira instruo
On Error Goto Erro
....codigo
....codigo
sair da funo
exit sub
tratamento de erro
Erro:
Msgbox err.description
Exit sub
End Sub

Existem alguns aspectos importantes no cdigo anterior:
introduo da label Erro: as labels so sempre utilizadas em conjunto com a
instruo Goto. Se houver algum erro durante a execuo do cdigo, ento o
Access automaticamente salta para a primeira instruo depois da label indicada
(neste caso, Erro);
repare-se como antes da label erro existe um exit sub. Esta instruo obriga a
que se saia imediatamente da funo (semelhante instruo return do C). Deve
ser colocada uma instruo antes da label pois caso contrrio o cdigo relativo
ao erro iria ser processado (o que no era necessrio neste caso, uma vez que no
ocorreu nenhum erro);
Existem outras alternativas no processamento de erros. Por exemplo o ficheiro
cap4_1.mdb retorna ao inicio da subrotina sempre que verifica um determinado erro.
Neste exemplo pedido um nmero, e em seguida tenta-se dividir 100 pelo nmero
introduzido pelo utilizado. S uma coisa pode correr mal: introduzir o nmero 0. A
soluo encontrada neste caso passa por voltar ao inicio da rotina e pedir um novo
nmero ao utilizador.
Existem outras variaes do on error que tambm costumam ser utilizadas. Temos o on
error resume next, por exemplo. Esta instruo obriga o Access a retomar a instruo
seguinte em caso de erro. Pode ser til quando tenhamos de apagar um registo de uma
tabela utilizando o ADO.


14
Tambm designado em portugus de tratamento de erros.
Para alm desta, existe ainda a on error goto 0, que obriga o access a mostrar o dilogo
que vimos no inicio do captulo. Portanto j vimos como detectar e tratar o erro. Falta
apenas vermos como identificar o erro!


O objecto Err

Quando acontece um erro, o Access procede ao armazenamento desse erro numa
varivel designada de Err. Pode-se mesmo afirmar que o Err contm o erro mais recente
detectado pelo Access. O objecto Err apresenta vrias propriedades, das quais se
destacam as seguintes:
Description: descrio do erro ocorrido;
Number: nmero do erro ocorrido;

Este objecto tambm apresenta alguns mtodos:
Clear: permite limpar o ltimo erro
Raise: permite criar um erro (pode ser til no caso de querermos construir os
nosso prprios erros).

Para mais informaes sobre estes tpicos deve ser consultada a ajuda on- line do
Access.


Captulo 5
A aplicao Sub-MovieCentral

A aplicao Sub-MovieCentral um projecto do autor deste livro que foi adaptado para
Microsoft Access. O objectivo desta aplicao permitir armazenar os dados relativos
aos filmes que eventualmente um utilizador possa possuir (ficheiro code.mdb). No caso
desta aplicao, foram apresentados os seguintes requisitos:
manter uma lista actualizada de filmes;
deve ser possvel proceder a operaes de manuteno da base de dados:
adicionar, modificar e eliminar registos;
deve ser possvel manter vrios dados relacionados com os filmes, dos quais se
destacam os seguintes:
o nome actores;
o nome realizadores;
o nome do filme;
o link para a pgina oficial do filme.

Assim, e aps efectuado o necessrio processo de obteno de requisitos, chegou-se ao
seguinte modelo relacional:



Esta aplicao apresenta vrios exemplos relacionados com aspectos que podem ser
utilizados no access:
barras de menus;
barras de ferramentas;
macros;
painis;
splash screens;
cdigo VBA;
etc.
O cdigo referente a este programa encontra-se no ficheiro code.mdb. A figura seguinte
ilustra o aspecto da aplicao:


A aplicao Sub-Movie Central foi construda utilizando um formulrio principal, no
qual se colocou tab control. Este tab control possui trs tabs ou pginas, contendo cada
um deles um formulrio. Apenas o formulrio Filmes impede a insero/modificao
dos filmes apresentados (os outros formulrios permitem que estas operaes sejam
realizadas directamente.
Todos os botes apresentados possuem cdigo VBA associado a eles. J agora, refira
que para construir estes botes com esta apresentao (texto + imagem) foi necessrio
utilizar um artificio, pois o access no permite a directa construo de um boto com
texto e imagem; neste caso, colocou-se no formulrio uma caixa de texto + uma imagem
+ um boto (com estilo transparente) por cima dos elementos anteriores.
A aplicao apresenta um splash screen, que mostrado ao abrir o formulrio principal
e que se auto-destri quando algum clica sobre ele (ou carrega numa tecla) ou quando
passam 3 segundos desde o seu inicio. No caso da primeira opo, bastou colocar
cdigo no evento onclick (onkeydown). Para que o formulrio se autodestrua ao fim de
3 segundos, tivemos de instruir o formulrio para chamar uma funo ao fim desse
tempo. Para tal utilizou-se um timer, mais propriamente a propriedade TimerInterval do
formulrio (ver evento onload do mesmo formulrio).
Voltando ao formulrio principal, temos de referir que o evento de click num formulrio
foi tratado em todos os formulrios que se encontram nas tabs do formulrio principal.
Cada um destes formulrios contm uma varivel que, em cada instante, possui a
posio seleccionada dentro do formulrio (uma vez que todos os formulrios
apresentam um conjunto de registos recordset e um recordselector que guarda a
posio actual nessa lista de registos ento basta saber qual a posio do
recordselector, e depois obter o ID do elemento que se encontra nessa posio; o nico
pormenor digno de destaque o recordset associado ao formulrio (pode ser obtido
atravs da propriedade recordset): um recordset do tipo DAO e no do tipo ADO por
isso que foi necessrio acrescentar uma referncia ao DAO).
Chama-se tambm a ateno para o facto de todos os formulrios terem sido alterados
(modificaram-se vrias propriedades de forma a obter o resultado pretendido).
Construram-se vrias barras de ferramentas, uma para cada sub- formulrio (contido em
cada uma das pginas do tab control). Cada uma destas barras foi associada a um
formulrio e recorreu-se a VBA para processar o evento onchange do tab control, pois
em cada instante s deveria estar presente a barra de ferramentas associada ao
formulrio que est seleccionado (e tal s possvel utilizando cdigo VBA ou ento
macros; neste caso optou-se por utilizar cdigo VBA. Quer as barras de ferramentas,
quer a barra de menus recorrem a macros para executar as aces. Algumas macros
servem apenas para juntar as opes do menu ao cdigo VBA correspondente (ex.: tab1,
tab2, etc, etc ). As restantes executam as aces contidas nas macros
(total_movies_preview, etc). Para terminar os aspectos relacionados com as macros,
refira-se ainda que quando queremos executar cdigo VBA (que est contido num
mdulo) atravs de uma macro temos de colocar esse cdigo numa funo ( e nunca
num procedimento).
Esta aplicao pretende apenas demonstrar como que se pode construir (de uma forma
simples) uma base de dados utilizando o Access. Claro que ficaram vrios aspectos por
implementar, como por exemplo a construo de um relatrio associado ao formulrio
Add_Movies que trata da adio/alterao dos dados de um filme. Apesar destas faltas,
pensa-se que a aplicao ilustra de forma significativa algumas das capacidades do
access.

Você também pode gostar