Você está na página 1de 65

VBA e Excel I

Macros
Menu <Ferramentas> seguido da opção <Macro>
Gravar macros: botões <Terminar gravação> e <Referência relativa>
Gravar macros é uma forma simples e rápida de visualizar os objectos, as
propriedades ou os métodos envolvidos em certas operações sobre as quais
queremos escrever código

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 26


VBA e Excel II
Formulários
Menu <Ver> seguido das opções <Barras
de ferramentas> e <Formulários>
Permite inserir controlos básicos nas folhas
de cálculo para personalizar certas tarefas
Ligar células a controlos
Menu <Formatar> seguido da opção
<Controlo...> e do separador <Controlo>
Atribuir macros a controlos
Menu específico sobre o controlo seguido
da opção <Atribuir macro...>
Aos controlos de formulários apenas é
possível atribuir macros que são
executadas quando ocorre o evento de
índole mais geral sobre o controlo
(habitualmente o clique do rato)

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 27


VBA e Excel III

Editor do
Visual Basic
Projecto
Propriedades
Código: a opção
(General) contém
as declarações e
os procedimentos;
cada objecto
contém a lista de
eventos a ele
associado

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 28


VBA e Excel IV
Código VBA como função do Excel
Uma função definida pelo utilizador não pode afectar células vizinhas (todo o
código que afecte células vizinhas é ignorado)

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 29


VBA e Excel V

Funções do Excel como código VBA


Propriedade WorksheetFunction
Não é possível usar funções do Excel que dupliquem funções próprias do
VBA. Por exemplo, deverá usar-se sempre a função do VBA UCase em lugar
da equivalente função UPPER do Excel

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 30


Objectos I
Conceito
Qualquer coisa que numa aplicação se pode manipular de algum modo

Formas de manipular um objecto


Alterar o seu conjunto de propriedades
Activar métodos específicos do objecto para executar determinadas tarefas
Associar procedimentos aos eventos que podem ocorrer sobre o objecto

Classes e instâncias
Classe de objectos: conjunto de objectos com as mesmas propriedades, com
os mesmos métodos e que respondem aos mesmos eventos
Instância: todo o objecto particular de uma classe

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 31


Objectos II
Propriedades
As propriedades são os atributos que definem as características dos objectos
ActiveCell.Formula = “=A1*10”
Certas propriedades são elas mesmas objectos
ActiveCell.Font.Italic = True
Existem propriedades que são só de leitura
col = ActiveCell.Column

Métodos
Os métodos são acções que descrevem o que os objectos podem fazer
São executados sobre os objectos e podem conter ou não argumentos
ActiveCell.Clear
ActiveCell.AddComment “comentário”

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 32


Objectos III

Eventos
Os eventos são algo que acontece aos objectos
Ocorrem em resultado de acções do utilizador, do sistema ou do próprio código
Os procedimentos correspondentes aos eventos têm todos a seguinte forma:
Private Sub Objecto_Evento(argumentos)
É necessário não confundir métodos com eventos. Por exemplo, o método
Activate quando executado sobre um objecto implica a execução do evento
Activate do mesmo objecto:
Worksheets(1).Activate
Private Sub Worksheet_Activate()

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 33


Objectos IV
Hierarquia de objectos
Application: objecto de topo da hierarquia de objectos
Caminhos hierárquicos
Application.Workbooks(“Livro1”).Worksheets(“Folha1”)
Caminhos únicos podem ser abreviados
Workbooks(“Livro1”)
ActiveCell

Colecção de objectos (Collection)


Tipo de objecto que resulta da colecção de outros objectos, não
necessariamente do mesmo tipo
Por exemplo, os objectos Workbooks e Worksheets são objectos do tipo
Collection que contêm respectivamente todos os objectos do tipo Workbook
e Worksheet da aplicação

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 34


Objectos V
Variáveis como objectos
Tipo de dados Object
A instrução Set
A constante Nothing
O operador Is
Exemplo
Dim bool as Boolean
Dim rng1 As Object, rng2 As Object ‘As Range
Set rng1 = Cells(1,1)
Set rng2 = Cells(2,2)
bool = rng1 Is rng2 ‘bool = False
Set rng1 = Nothing ‘para libertar memória
bool = rng1 Is Nothing ‘bool = True

Uma variável do tipo Object também fica com o valor Nothing se o objecto a
ela associado for fechado/terminado/eliminado

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 35


Objectos VI
A variável implícita Me
É automaticamente disponibilizada em todos os módulos de classe
Referencia a instância da classe onde o código está a ser executado
MsgBox Me.Name
Múltiplas acções sobre um objecto
With objecto
[...]
End With
Exemplo
With ActiveCell
.Formula = “=A1*10” ‘ActiveCell.Formula = “=A1*10”
With .Font
.Italic = True ‘ActiveCell.Font.Italic = True
.Bold = True ‘ActiveCell.Font.Bold = True
End With
End With

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 36


Objectos Workbook I
Referenciação
[Application.]: caminho hierárquico implícito
Workbooks(“Livro1”): referência directa ao nome do livro
Workbooks(1): referência ao primeiro livro a ser aberto
ActiveWorkbook: referência ao livro que tem o foco
ThisWorkbook: referência ao livro onde está o código a ser executado
Workbooks Collection
Workbooks.Open(FileName): método que abre um livro existente
Workbooks.Close: método que fecha todos os livros abertos
Workbooks.Count: propriedade que indica o número de livros abertos
Exemplo
ChDir “\My documents\Excel”
Workbooks.Open “Livro1”

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 37


Objectos Workbook II
Propriedades
workbook.Name: nome do livro (só de leitura)
workbook.Saved: indica se existem alterações por guardar (pode ser
colocada a True para evitar o menu de guardar alterações)
Métodos
workbook.Activate: torna o livro activo
workbook.Save: guarda as últimas alterações
workbook.Close(SaveChanges): fecha o livro
workbook.Protect(Password, Structure, Windows): protege o livro
no que diz respeito à sua estrutura (as folhas não podem ser movidas, ocultas,
mostradas, eliminadas, os nomes não podem ser alterados nem podem ser
inseridas novas folhas) e/ou às janelas (as janelas não podem ser movidas,
redimensionadas, ocultas, mostradas ou fechadas)
workbook.Unprotect(Password): desprotege o livro
Exemplo
ThisWorkbook.Protect “sap”, True, False
ThisWorkbook.Close SaveChanges:=True

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 38


Objectos Workbook III
Eventos
Private Sub Workbook_Open(): ocorre quando o livro é aberto por acção
do método Open, ou por intermédio do utilizador
Private Sub Workbook_Activate(): ocorre quando o livro passa a ser o
livro activo por acção do método Activate, ou por intermédio do utilizador
quando abre o livro ou o selecciona
Private Sub Workbook_Newsheet(ByVal Sh As Object): ocorre
quando é inserida uma nova folha (Sh referencia a nova folha)
Exemplos
Private Sub Workbook_Open()
Application.Visible = False
End Sub
Private Sub Workbook_Activate()
ThisWorkbook.Worksheets(“Folha1”).Activate
End Sub
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Move After:=Worksheets(Worksheets.Count)
End Sub

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 39


Objectos Worksheet I
Referenciação
[ActiveWorkbook.]: caminho hierárquico implícito
Worksheets(“Folha1”): referência directa ao nome da folha
Worksheets(1): referência à primeira folha no separador de folhas
ActiveSheet: referência à folha que tem o foco
Worksheets Collection
Worksheets.Add(Before, After, Count): método que adiciona novas
folhas. Before especifica a folha antes da qual as novas folhas devem ser
adicionadas; After especifica a folha depois da qual as novas folhas devem
ser adicionadas (por defeito são adicionadas antes da folha activa); Count
indica o número de folhas a adicionar (por defeito uma)
Worksheets.Count: propriedade que indica o número de folhas existentes
Exemplo
Worksheets.Add After:=Worksheets(Worksheets.Count)

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 40


Objectos Worksheet II
Propriedades
worksheet.Name: nome da folha
worksheet.Visible: visibilidade da folha
xlSheetVisible: visível
xlSheetHidden: oculta (corresponde a ocultar a folha utilizando os menus)
xlSheetVeryHidden: invisível (só utilizando código é possível reverter o estado)

Métodos
worksheet.Activate: torna a folha activa
worksheet.Delete: elimina a folha
worksheet.Copy(Before, After): copia a folha
worksheet.Move(Before, After): move a folha
worksheet.Protect(Passwd, DrawingObjs, Contents): protege a
folha no que diz respeito aos seus objectos gráficos e/ou ao seu conteúdo
worksheet.Calculate: recalcula todas as fórmulas presentes na folha. Útil
para fórmulas que utilizam funções voláteis como AGORA() e HOJE()

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 41


Objectos Worksheet III
Eventos
Private Sub Worksheet_Change(ByVal Target As Excel.Range):
ocorre quando uma ou várias células são modificadas

Exemplos
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
For Each cel In Target
cel.Interior.ColorIndex = 3
Next
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)


For Each cel In Target
cel.Value = ... ‘entra em ciclo
Next
End Sub

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 42


Objectos Range I
Referenciação
[ActiveSheet.]: caminho hierárquico implícito
Cells(1, 2): referência à célula na 1ª linha e na 2ª coluna (célula B1)
Range(“B2:C3”): referência directa ao intervalo B2:C3
Range(“A1, B2:C3”): referência directa à célula A1 mais o intervalo B2:C3
Range(“Lucro”): referência directa à célula ou intervalo com o nome “Lucro”
Range(“B2”, “C3”): referência ao intervalo B2:C3 (B2 é o canto superior
esquerdo e C3 é o canto inferior direito)
Range(“B2:C3”).Cells(1, 2): referência à célula na 1ª linha e na 2ª
coluna dentro do intervalo B2:C3 (célula C2)

Exemplo
For ano = 1 To 100
Range(“A” & ano).Value = 1999 + ano
Next ano

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 43


Objectos Range II
Propriedades
range.Row: número da primeira linha do range
range.Column: número da primeira coluna do range
range.Rows(): collection de todas as linhas do range
range.Rows(Index): linha de ordem Index do range
range.Columns(): collection de todas as colunas do range
range.Columns(Index): coluna de ordem Index do range

Exemplo
Function LastRow(rng As range)
With rng
LastRow =.Rows.Count + .Row – 1
‘LastRow =.Rows(.Rows.Count).Row
End With
End Function

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 44


Objectos Range III
Propriedades
range.Value: valores das células do range
Exemplo
Function MaxValue(rng As range)
aux_array = rng.Value
‘rng especifica uma única célula
If Not IsArray(aux_array) Then
MaxValue = aux_array
Exit Function
End If
‘rng especifica mais do que uma célula
MaxValue = aux_array(1, 1)
For Each aux In aux_array
If aux > MaxValue Then MaxValue = aux
Next aux
End Function

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 45


Objectos Range IV
Propriedades
range.Formula | FormulaLocal | FormulaR1C1 | FormulaR1C1Local:
fórmulas das células do range

Exemplos
Range(“A9”).Formula = “=SUM(A1:A8)”
Range(“A9”).FormulaLocal = “=SOMA(A1:A8)”
‘aspas nas fórmulas devem ser duplicadas
Range(“A1”).Formula = “=COUNTIF(B1:B9, ““>0””)”
Range(“A1”).FormulaLocal = “=CONTAR.SE(B1:B9; ““>0””)”
‘o exemplo que se segue leva a que B9 Å =SUM(B1:B8)
Range(“A9:B9”).Formula = “=SUM(A1:A8)”
‘o exemplo que se segue leva a que A9 Å =SUM($A$1:$A$8)
Range(“A9”).FormulaR1C1 = “=SUM(R1C1:R8C1)”
Range(“A9”).FormulaR1C1Local = “=SOMA(L1C1:L8C1)”
‘o exemplo que se segue leva a que A9 Å =SUM(A1:A8)
Range(“A9”).FormulaR1C1 = “=SUM(R[-8]C:R[-1]C)”
‘o exemplo que se segue leva a que A9 Å =SUM(A$1:$A8)
Range(“A9”).FormulaR1C1 = “=SUM(R1C:R[-1]C1)”

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 46


Objectos Range V
Propriedades
range.Offset(RowOffset, ColumnOffset): desloca o range RowOffset
linhas para cima/baixo e ColumnOffset colunas para a direita/esquerda
range.Address(RowAbsolute, ColumnAbsolute): endereço do range
range.Count: número de células do range

Exemplos
Range(“C5:D10”).Select
Selection.Offset(-4, -2).Select ‘A1:B6
Selection.Offset(3, 1).Range(“B2”).Select ‘C5

Set cel = Cells(1, 1)


MsgBox cel.Address() ‘$A$1
MsgBox cel.Address(RowAbsolute:=False) ‘$A1

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 47


Objectos Range VI
Métodos
range.Select: selecciona (Selection referencia o conjunto seleccionado)
range.Calculate: recalcula fórmulas
range.Copy(Destination): copia o conteúdo
range.ClearComments: remove comentários
range.ClearContents: remove conteúdos
range.ClearFormats: remove formatações
range.Clear: remove comentários, conteúdos e formatações
range.FillDown: copia o conteúdo da 1ª linha para as restantes células
(idêntico a seleccionar a 1ª linha e arrastar com o rato)
range.FillUp: copia o conteúdo da última linha para as restantes células
range.FillLeft: copia o conteúdo da última coluna para as restantes células
range.FillRight: copia o conteúdo da 1ª coluna para as restantes células
Exemplo
Range(“A1:B5”).Copy Range(“E5”) ‘copia para E5:F9
Range(“A1:A10”).FillDown
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 48
Objectos Control I
Propriedades comuns
Name: nome que identifica o controlo
Caption: texto presente no controlo
Left / Top: posição relativa ao canto superior esquerdo do formulário/relatório
Height / Width: altura e comprimento do controlo
BackColor / ForeColor: cor do fundo e cor do texto do controlo
BackStyle: estilo do fundo do controlo (transparente/opaco)
SpecialEffect: aparência do controlo (com relevo, com profundidade, ...)
Font: tipo de letra do controlo
ControlTipText: texto de ajuda para quando se deixa o rato sobre o controlo
TabIndex: ordem de navegação do controlo (utilizando a tecla Tab)
TabStop: se False previne a navegação por intermédio da tecla Tab
Visible: visibilidade do controlo
Enabled: se False previne o controlo de receber o foco e responder a
eventos
Locked: se True previne o utilizador de editar o valor presente no controlo
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 49
Objectos Control II
UserForm
Show: apresenta o formulário
Hide: esconde o formulário mas não o remove da memória
Unload: remove o formulário da memória
Text box
Text: texto presente na caixa de texto
PasswordChar: caracter especial de edição para introdução de passwords
EnterKeyBehavior: se True permite a edição em várias linhas
Command button
Default: botão seleccionado por defeito quando se abre o formulário
Cancel: botão seleccionado por defeito no caso do formulário ser cancelado
Option / check / toggle buttons
Value: True se seleccionado; False se não seleccionado; Null se não activo
OptionValue: valor do botão no caso de estar inserido num grupo de opções

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 50


Objectos Control III
Combo / list boxes
RowSource: origem dos dados do controlo
ColumnCount: número de colunas a apresentar
ColumnWidths: tamanho de cada coluna
BoundColumn: coluna dependente associada à propriedade Value
TextColumn: coluna dependente associada à propriedade Text
Value: valor da coluna dependente
Text: valor presente na caixa
ControlSource: célula ligada à propriedade Value da caixa
AddItem: método que permite adicionar um novo item
Exemplos
ComboBox1.ColumnCount = 2
ComboBox1.RowSource = “a1:b4”
ComboBox1.BoundColumn = 1
ComboBox1.TextColumn = 2
ComboBox1.ControlSource = “a6”

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 51


Visual Basic for Applications
Introdução
É uma linguagem de programação baseada na conhecida linguagem BASIC
Está concebida para funcionar em conjunto com diferentes aplicações, de
forma a potenciar a robustez das mesmas
Enquadra-se nos ambientes de programação baseados no processamento de
sequência de eventos (event-driven programming)
História
Foi inicialmente integrada com o Excel 5 em 1994 e a partir daí a sua
expansão para outras aplicações foi gradual
Foi com a saída do Office 97 em 1997 que a Microsoft concretizou um dos
seus grandes objectivos: ter um ambiente de programação completamente
integrado nos seus quatro produtos mais famosos: Word, Excel, Access e
PowerPoint
Actualmente, o VBA é já por si só um produto independente, que outras
companhias podem adoptar e incorporar nas suas aplicações

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 1


Variáveis I
Declaração explícita de variáveis
Declarar uma variável VAR: Dim VAR
Declarar uma variável VAR como sendo do tipo TYPE: Dim VAR As TYPE
Declaração implícita de variáveis
Possibilidade de não declarar variáveis
Variáveis não declaradas ou sem declaração de tipo têm por defeito o tipo
Variant
Não permitir o uso de variáveis implícitas: Option Explicit
Visibilidade e longevidade de uma variável
Public: visível em todos os módulos e durante toda a execução
Private ou Dim: visível dentro do seu módulo e durante toda a execução
Dim: visível dentro do seu procedimento e durante a sua execução
Static: visível dentro do seu procedimento e durante toda a execução

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 2


Variáveis II
Tipo de variáveis
Variant tipo genérico
Boolean True ou False
Byte 0 até 255
Integer -32.768 até 32.767
Long -2.147.483.648 até 2.147.483.647
Single -3,402823E38 até -1,401298E-45 (para valores negativos)
1,401298E-45 até 3,402823E38 (para valores positivos)
Double -1,79769313486232E308 até -4,94065645841247E-324 (negativos)
4,94065645841247E-324 até 1,79769313486232E308 (positivos)
Currency -922.337.203.685.477,5808 até 922.337.203.685.477,5807
Decimal +/-79.228.162.514.264.337.593.543.950.335 (sem casas decimais)
+/-7,9228162514264337593543950335 (com casas decimais)
Date 1 de Janeiro de 100 até 31 de Dezembro de 9999
String 1 até aproximadamente 2 biliões de caracteres
65.400 caracteres se tamanho fixo
Type definido pelo utilizador
Object referência a objectos
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 3
Variáveis III
Constantes
System-defined constants: True; False; Null; Empty; Nothing
Intrinsic constants (bibliotecas do VBA): Const LEFT_BUTTON = 1
Symbolic constants: Const PI = 3,14
Exemplos
Dim val As Boolean
val = True
Dim aux
aux = 5
aux = “vba”
dummy = 1
Type Automovel
modelo As String*30
cilindrada As Integer
End Type
Dim meu_carro As Automovel
meucarro.modelo = “Ferrari”
meu_carro.cilindrada = 3000
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 4
Operadores I
Aritméticos
+ (adição) - (subtracção e negação) * (multiplicação)
/ (divisão) \ (divisão inteira) ^ (exponenciação)
Mod (resto da divisão)
Lógicos
And (e lógico) Or (ou lógico) Not (negação)
Imp (implicação) Xor (ou exclusivo) Eqv (equivalência)
Texto
& (concatenação)
Relacionais
= (igual a) > (maior que) < (menor que)
<> (diferente de) >= (maior ou igual) <= (menor ou igual)
Like (padrões de texto) Is (referência de objectos)

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 5


Operadores II
Precedências
Maior precedência

^ exponenciação
- negação
*,/ multiplicação e divisão
\ divisão inteira
Mod resto da divisão
+,- adição e subtracção
& concatenação
= , > , < , <> , >= , <= , Like , Is comparação
And , Or , Not , Imp , Xor , Eqv lógica

Menor precedência

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 6


Operadores III
Símbolos de comparação
? um qualquer caracter
* zero ou mais caracteres
# um qualquer dígito
[lista] um qualquer na lista
[!lista] um qualquer não na lista
Exemplo
Dim var As String
Dim bool As Boolean
var = “aaaa1111”
bool = var Like “?a[a-z][!A-Z]#*” ‘bool = True
Outros caracteres
‘ ou Rem comentários
: múltiplas instruções na mesma linha
_ uma instrução em múltiplas linhas

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 7


Arrays I
Declarar arrays
Dim nome (limite) As tipo
Dim nome (limite_inferior To limite_superior) As tipo
Option Base 1
Exemplos
Dim dias(6) As String
dias(0) = “Seg”
...
dias(6) = “Dom”
Dim dias(2 To 8) As String
dias(2) = “Seg”
...
dias(8) = “Dom”
Option Base 1
Dim dias(7) As String
dias(1) = “Seg”
...
dias(7) = “Dom”
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 8
Arrays II
Arrays com mais do que uma dimensão
Dim nome (limite_1,... ,limite_n) As tipo
Exemplo
Dim matriz(10, 10) As Integer
matriz(0,0) = 0
...
matriz(10,10) = 100
Arrays dinâmicos
ReDim: redefine os limites de um dado array
Redim Preserve: redefine os limites de um dado array e preserva os valores
nele existentes (é aplicável apenas quando se redefine a última dimensão)
LBound: devolve o limite inferior de um dado array
UBound: devolve o limite superior de um dado array

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 9


Arrays III
Exemplos
Dim vector()
...
ReDim vector(10)
vector(0) = 10
ReDim vector(UBound(vector) + 10)
aux = vector(0) ‘aux = ?
vector(0) = 100
ReDim Preserve vector(UBound(vector) + 10)
aux = vector(0) ‘aux = 100
ReDim vector(10,10)
vector(0,0) = 1000
ReDim vector(UBound(vector, 1), UBound(vector, 2) + 10)
aux = vector(0, 0) ‘aux = ?

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 10


Procedimentos
Procedimentos Sub
[Public | Private] Sub nome ([argumentos])
[...]
[Exit Sub]
[...]
End Sub

Procedimentos Function
[Public | Private] Function nome ([argumentos]) [As tipo]
[...]
[nome = expressão]
[Exit Function]
[...]
[nome = expressão]
End Function

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 11


Argumentos I
Declarar argumentos
[Optional] [ByRef | ByVal] arg[( )] [As tipo] [= valor]
Exemplo
Function area(comp As Integer, alt As Integer) As Integer
area = comp * alt
End Function
Passar e nomear argumentos
Passar argumentos: area(5, 4)
Nomear argumentos: area (alt:= 4, comp:= 5)
Opções de declaração
Optional: declara que o argumento não é obrigatório (esta declaração implica
que os restantes argumentos sejam igualmente declarados como Optional)
ByRef: declara que o argumento é passado por referência (o procedimento
recebe o próprio endereço da variável passada como argumento)
ByVal: declara que o argumento é passado por valor (o procedimento apenas
recebe o valor da variável passada como argumento)
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 12
Argumentos II
Exemplos
Function area(comp As Integer, Optional larg As Integer = 1)
area = comp * larg
End Function
...
aux = area (5, 4) ‘aux = 20
aux = area (5) ‘aux = 5

Function area(Optional comp As Integer = 1, larg As Integer)


area = comp * larg
End Function ‘compile error

Function area(Optional comp As Integer = 1,


Optional larg As Integer = 1)
area = comp * larg
End Function
...
aux = area (5, 4) ‘aux = 20
aux = area (5) ‘aux = 5
aux = area () ‘aux = 1
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 13
Argumentos III
Exemplos
Sub dobro(ByVal var As Integer)
var = 2 * var
End Sub
...
aux = 10
dobro aux ‘aux = 10
Sub dobro(ByRef var As Integer)
var = 2 * var
End Sub
...
aux = 10
dobro aux ‘aux = 20
Sub dobro(var As Integer)
var = 2 * var
End Sub
...
aux = 10
dobro aux ‘aux = 20
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 14
Estruturas de decisão I

Execução condicional Exemplo


If condição_1 Then If num = 0 Then
[...] msg = “zero”
... ElseIf num < 0 then
[ElseIf condição_n Then msg = “negativo”
[...]] Else
[Else msg = “positivo”
[...]] End If
End If

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 15


Estruturas de decisão II
Múltiplos testes Exemplo
Select Case expressão_a_testar Select Case num
Case lista_de_expresões_1 Case 0
[...] msg = “zero”
... Case Is < 0
[Case lista_de_expressões_n msg = “negativo”
[...]] Case Else
[Case Else msg = “positivo”
[...]] End Select
End Select
Lista de expressões válidas
expressão_1 [, ..., expressão_n}
expressão_1 To expressão_2
Is operador_de_comparação expressão

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 16


Código em ciclo I
Ciclos condicionais Exemplo
Do {While | Until} condição Dim matriz(5,5), i, j
[...] i = 1
[Exit Do] Do
[...] j = 1
Loop Do
matriz(i,j) = i + j
Do j = j + 1
[...] Loop While j <= 5
[Exit Do] i = i + 1
[...] Loop Until i > 5
Loop {While | Until} condição

Condições de paragem
While: executa o ciclo enquanto a condição for verdade
Until: executa o ciclo enquanto a condição for falsa

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 17


Código em ciclo II
Ciclos numeráveis
For contador = início To fim [Step incremento]
[...]
[Exit For]
[...]
Next [contador]

Condições de paragem Exemplo


Step: por defeito o valor de Dim matriz(5,5), i, j
incremento é 1 For i = 1 To 5
Se o incremento for positivo ou For j = 5 to 1 Step -1
zero, o ciclo termina assim que matriz(i,j) = i + j
contador seja maior do que fim Next j
Next i
Se for negativo, termina assim que
contador seja menor do que fim

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 18


Código em ciclo III
Ciclos numeráveis
For Each elemento In colecção
[...]
[Exit For]
[...]
Next [elemento]

Condições de paragem Exemplo


O ciclo termina assim que percorrer Dim soma, elem
todos os elementos em colecção soma = 0
É útil em situações em que o número For Each elem In matriz
de elementos em colecção é soma = soma + elem
variável ou desconhecido Next elem

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 19


Funções básicas I
Caixas de mensagem Exemplos
MsgBox (mensagem) Dim valor
InputBox (mensagem) valor = InputBox(“Insira valor”)
MsgBox(“O valor inserido foi “
& valor & “!”)
Conversão de dados
CBool (expressão) CBool(1) ‘True
CByte (expressão) CBool(0) ‘False
CInt (expressão) CByte(125.5678) ‘126
CInt(2345.5678) ‘2346
CLng (expressão)
CCur(543.214588) ‘543.2146
CSng (expressão) CDate(“23-2-69”) ‘23-02-1969
CDbl (expressão) CDate(#2/23/69#) ‘23-02-1969
CCur (expressão) CStr(437.324) ‘“437.324”
CDate (expressão) CDbl(CDate(“4:30”)) ‘0,1875
CStr (expressão)
CVar (expressão)

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 20


Funções básicas II
Testes sobre os dados
IsArray (variável): testa se variável é um array
IsDate (expressão): testa se expressão pode ser convertida numa data
IsNumeric (expressão): testa se expressão é um valor numérico
IsMissing (argumento): testa se um argumento do tipo Optional foi
passado ao procedimento corrente
Exemplos
IsDate(#2/12/69#) ‘True
IsDate(“12 de Janeiro de 1998”) ‘False
IsNumeric(“459.95”) ‘True
IsNumeric(“45 Help”) ‘False

Function dobro(Optional a As Integer)


If IsMissing(a) Then dobro = 0 Else dobro = a * 2
End Function
dobro(2) ‘4
dobro() ‘0
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 21
Funções básicas III
Testes sobre os dados
IsEmpty (variável): testa se variável já foi iniciada
IsNull (variável): testa se variável é Null
Exemplos
Dim var1
IsEmpty(var1) ‘True
var1 = Null
IsEmpty(var1) ‘False
var1 = Empty
IsEmpty(var1) ‘True

Dim var2
IsNull(var2) ‘False
var2 = “”
IsNull(var2) ‘False
var2 = Null
IsNull(var2) ‘True

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 22


Funções básicas IV
Manipulação de strings
Len (string)
LCase (string)
UCase (string)
Left (string, comprimento)
Right (string, comprimento)
Mid (string, início [, comprimento])
Exemplos
Len(“Hello World”) ‘11
Lcase(“Hello World”) ‘“hello world”
Ucase(“Hello World”) ‘“HELLO WORLD”
Left(“Hello World”, 1) ‘“H”
Right(“Hello World”, 3) ‘“rld”
Mid(“Hello World”, 7) ‘“World”
Mid(“Hello World”, 7, 2) ‘“Wo”

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 23


Funções básicas V
Manipulação de strings
LTrim (string)
RTrim (string)
Trim (string)
InStr ([início,] string_geral, string_procura)
StrComp (string1, string2)
Exemplos
LTrim(“ <- -> ”) ‘“<- -> ”
RTrim(“ <- -> ”) ‘“ <- ->”
Trim(“ <- -> ”) ‘“<- ->”
InStr(1, “Hello World”, “o”) ‘5
InStr(6, “Hello World”, “o”) ‘8
StrComp(“abc”, “abc”) ‘0 (string1 = string2)
StrComp(“abc”, “ABC”) ‘1 (string1 > string2)
StrComp(“ABC”, “abc”) ‘-1 (string1 < string2)

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 24


Funções básicas VI
Manipulação de datas e horas
Date
Time Exemplos
Now Date ‘31-12-1999
Year (data) Time ‘15:30:00
Now ‘31-12-1999 15:30:00
Month (data) Year(Date) ‘1999
Day (data) Hour(Time) ‘15
Hour (hora) WeekDay(Date) ‘6 (Domingo é 1)
Minute (hora) DateSerial(1999, 12, 31) ‘31-12-1999
TimeSerial(15, 30, 0) ‘15:30:00
Second (hora)
Weekday (data)
DateSerial (ano, mês, dia)
TimeSerial (hora, minuto, segundo)

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 25


Tratamento de erros I
Ideia básica
Sempre que ocorre um erro, o seu tratamento fica a cargo da última
declaração ‘On Error’ invocada no procedimento corrente
Caso não haja qualquer declaração desse tipo, o erro é tratado no primeiro
procedimento pai que possui tratamento de erros. Se nenhum dos
procedimentos envolvidos possuir tratamento de erros, o sistema aborta a
execução e apresenta uma mensagem indicando o erro ocorrido
Formas de tratar erros
On Error GoTo line: activa a rotina de tratamento de erros que se
encontra a partir da indicação line. A posterior ocorrência de qualquer erro
transfere imediatamente a execução para a rotina especificada
[Sub | Function] procedimento( )
On Error GoTo Rotina_Tratamento_Erros
[...]
Exit [Sub | Function]
Rotina_Tratamento_Erros:
[...]
End [Sub | Function]
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 79
Tratamento de erros II
Formas de tratar erros
On Error Resume Next: ignora a posterior ocorrência de qualquer erro e
prossegue a execução na instrução seguinte à que provocar o erro
On Error GoTo 0: desactiva o tratamento de erros no procedimento corrente
Retomar a execução
Resume: retoma a execução na instrução que provocou o erro
Resume Next: retoma a execução na instrução seguinte à que provocou o erro
Resume line: retoma a execução na instrução indicada por line
Objecto Err
Err.Number: número que identifica o último erro ocorrido
Err.Description: descrição sumária do último erro ocorrido
Err.Clear: limpa as propriedades Err.Number (0) e Err.Description (“”).
É igualmente invocado sempre que uma das seguintes instruções é executada:
Instruções do tipo Resume
Instruções do tipo On Error
Instruções Exit Sub, Exit Function, Exit Property
Err.Raise Number: provoca a ocorrência do erro identificado por Number
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 80
Tratamento de erros III
Exemplo
Sub teste_erros()
On Error GoTo trat_erros:
Dim erro As Integer : erro = 5 : MsgBox “Início teste_erros”
gera_erro (erro)
MsgBox “Fim teste_erros” : Exit Sub
trat_erros:
MsgBox “Erro n. ” & Err.Number
Select Case Err.Number
Case 5 To 6
erro = erro + 1 : Resume
Case Else Sequência de mensagens
Resume Next Início teste_erros
End Select Início gera_erro
End Sub Erro n. 5
Sub gera_erro(erro As Integer) Início gera_erro
MsgBox “Início gera_erro” Erro n. 6
Err.Raise erro Início gera_erro
MsgBox “Fim gera_erro” Erro n. 7
End Sub Fim teste_erros
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 81
Collections
Objecto Collection
Conjunto ordenado de objectos não necessariamente do mesmo tipo
Declarar um novo objecto: Dim col As New Collection

Propriedades e métodos
collection.Count: número total de objectos na collection (só de leitura)
collection.Add Item, Key, Before, After: adiciona um novo objecto
Item: objecto a adicionar
Key: nome pelo qual o objecto será conhecido na collection
Before/After: objecto antes/depois do qual o novo objecto deve ser adicionado
collection(Index): objecto de ordem Index (o primeiro tem ordem 1)
collection(Key): objecto cujo nome é Key
collection.Remove Index: remove o objecto de ordem Index
collection.Remove Key: remove o objecto cujo nome é Key

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 82


Módulos de classe I
Exemplo
‘para trabalhar com facturas posso declarar um conjunto de
‘variáveis que represente os dados que pretendo manipular
Dim ID As Long : Dim dataFactura As Date
Dim dataVencimento As Date : Dim dataPagamento As Date
Dim quantia As Currency : Dim emAtraso As boolean

‘para trabalhar com diferentes facturas em simultâneo posso


‘criar um novo tipo de dados que represente a factura
Type Factura
Dim ID As Long : ... : Dim emAtraso As boolean
End Type
Dim factura01 As Factura : Dim factura02 As Factura

‘como a manipulação de facturas envolve quase sempre as


‘mesmas operações, posso criar um módulo de classe que
‘especifique um novo objecto do tipo factura com propriedades
‘e métodos que manipulem as facturas de igual modo
Dim factura01 As New CFactura : Dim factura02 As New CFactura

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 83


Módulos de classe II
Variáveis de classe (data members)
Private m_DataMember As Type
Propriedades de classe (Property Get / Property Let)
Public
Property Get PropertyName([args]) As PropertyDataType
[... : PropertyName = expr]
[Exit Property]
[... : PropertyName = expr]
End Property

Public
Property Let PropertyName([args,] NewVal As PropertyDataType)
[... : m_DataMember = expr]
[Exit Property]
[... : m_DataMember = expr]
End Property
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 84
Módulos de classe III
Exemplo
‘data members do módulo de classe CFactura
Private m_ID As Long : ... : Private m_emAtraso As boolean
‘factura01.ID
Public Property Get ID() As Long
ID = m_ID
End Property
‘factura01.EmAtraso
Public Property Get EmAtraso() As Boolean
EmAtraso = m_emAtraso
End Property
‘factura01.Quantia = newQuantia
Public Property Let Quantia(newQuantia As Currency)
If newQuantia < 0 Then
newQuantia = 0
MsgBox “Quantia inválida! Será usado zero.”
End If
m_quantia = newQuantia
End Property
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 85
Módulos de classe IV
Exemplo
'factura01.DataFactura = newData
Public Property Let DataFactura(newData As Date)
If newData > Date Then
newData = Date
MsgBox “Data inválida! Será usada a data de hoje.”
End If
m_dataFactura = newData
m_dataVencimento = m_dataFactura + 30
End Property

'factura01.DataPagamento = newData
Public Property Let DataPagamento(newData As Date)
m_dataPagamento = newData
m_emAtraso = False
End Property

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 86


Módulos de classe V
Propriedades de classe (Property Set)
Public
Property Set PropertyName([args,] NewObj As PropertyDataType)
[... : Set m_DataMember = expr]
[Exit Property]
[... : Set m_DataMember = expr]
End Property
Métodos de classe
Public [Sub|Function] MethodName([args]) [As MethodDataType]
[...]
End [Sub|Function]
Exemplo
Public Sub Update() ‘factura01.Update
If m_dataPagamento = 0 And m_dataVencimento < Date Then
m_emAtraso = True
End If
End Sub
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 87
Módulos de classe VI
Eventos de classe
Private Sub Class_Initialize( ): ocorre quando um objecto da
classe é instanciado pela primeira vez
Private Sub Class_Terminate( ): ocorre quando todos os objectos da
classe são removidos
Exemplo
Private Sub Class_Initialize()
Randomize
m_ID = Int(Rnd * 999999)
m_dataFactura = Date
m_dataVencimento = m_dataFactura + 30
m_emAtraso = True
End Sub

Private Sub Class_Terminate()


...
End Sub

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 88


Módulos de classe VII
Classes de collections
Private m_DataMember As New Collection
Exemplo
‘para manipular múltiplas facturas pode ser útil criar um
‘novo módulo de classe que especifique um objecto facturas
Dim facts As New CFacturas
‘data member do módulo de classe CFacturas
Private m_facturas As New Collection
‘facts.Add quantia
Public Function Add(quantia As Currency) As CFactura
Dim new_fact As New CFactura
With new_fact
.Quantia = quantia ‘Property Let de CFactura
m_facturas.Add Item:=new_fact, Key:=CStr(.ID)
End With
Set Add = new_fact
End Function

Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 89


Módulos de classe VIII
Exemplo
‘facts.Remove index
Public Sub Remove(index As Variant) ‘index é do tipo Variant
m_facturas.Remove index ‘porque pode ser um
End Sub ‘número ou uma string
‘facts.Count
Public Function Count() As Long
Count = m_facturas.Count
End Function
‘facts.Item index
Public Function Item(index As Variant) As CFactura
Set Item = m_facturas(index)
End Function
‘exemplo de utilização
Dim facts As New CFacturas
facts.Add 1000
facts.Add 2000
MsgBox facts.Count ‘apresenta “2”
facts.Remove 1
MsgBox facts.Item(1).Quantia ‘apresenta “2000”
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 90
Módulos de classe IX
Propriedades de classe como objectos
Muitas das propriedades de um objecto são por si só também objectos. Como
é então possível definir uma propriedade como objecto?
Exemplo
‘suponhamos que queremos criar um módulo de classe CCliente
‘que especifique um novo objecto cliente
Private m_Nome As String
Private m_Facturas As CFacturas

‘cliente01.Nome
Public Property Get Nome() As String
Nome = m_Nome
End Property

‘cliente01.Facturas
Public Property Get Facturas() As CFacturas
Set Facturas = m_Facturas
End Property
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 91
Módulos de classe X
Exemplo
‘cliente01.Nome = newNome
Public Property Let Nome(newNome As String)
m_Nome = newNome
End Property
‘Set cliente01.Facturas = newFacturas
Public Property Set Facturas(newFacturas As CFacturas)
Set m_Facturas = newFacturas
End Property
‘exemplo de utilização
Dim cliente01 As New CCliente
With cliente01
.Nome = “António”
Set .Facturas = New CFacturas ‘a declaração New cria uma
With .Facturas ‘nova instância do objecto
.Add 1000
.Add 2000
End With
End With
MsgBox cliente01.Facturas.Item(1).Quantia ‘apresenta “1000”
Ricardo Rocha DCC-FCUP Visual Basic for Applications: # 92

Você também pode gostar