Upload
phamhanh
View
239
Download
3
Embed Size (px)
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Manuel A. E. Baptista, Eng.Manuel A. E. Baptista, Eng.ººErnesto R. Afonso, Eng.Ernesto R. Afonso, Eng.ºº
Agradecimentos:Agradecimentos:Jorge A. A. Loureiro, Eng.Jorge A. A. Loureiro, Eng.ººValterValter N. N. Alves, Eng.N. N. Alves, Eng.ºº
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Ambiente de programaAmbiente de programaççãoão
Programando em VBA Programando em VBA -- Visual Basic for Applications Visual Basic for Applications
ManipulaManipulaçção de varião de variááveis estruturadas: veis estruturadas: arraysarrays
ProgramaProgramaçção estruturada ão estruturada
TTóópicos avanpicos avanççadosados
Objectos, Propriedades e MObjectos, Propriedades e Méétodos do EXCELtodos do EXCEL
Programação sobre EXCEL
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Ambiente de programação
Ambiente do EXCEL
Folha de CFolha de Cáálculolculo
MMóódulodulo
GrGrááficofico
Caixa de DiCaixa de Diáálogologo
Charts
Worksheet
Modules
UserForms
LIVROLIVROLIVRO
WORKBOOK
APPLICATION
Ambiente de
Ambiente de
programa
programaççãoão
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
ObjectoObjectoObjecto: Workbook
Folha de CFolha de Cáálculolculo
Aplicação (Application)
Livro (Workbook)
AplicaAplicaççãoãoMicrosoft EXCELEXCEL
Livro 1Livro 1Livro 2Livro 2……..Livro nLivro nLi
vros
Livr
os
LivroLivro
ObjectoObjectoObjecto: Application
ObjectoObjectoObjecto: Worksheet
Folha de GrFolha de Grááficofico
Caixa de DiCaixa de Diáálogologo
MMóódulodulo
ObjectoObjectoObjecto: Charts
ObjectoObjectoObjecto: UserForms
ObjectoObjectoObjecto: Module
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Programação sobre o EXCEL
Criação dum módulo
Ferramentas → Macro → Editor do Visual Basic ... Insert → Module
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Modos de actuação
Utilização exclusiva sobre os Módulos
Programar sobre VBA é fascinante!!!
111
222
333
444555
1 1 -- Correr o procedimentoCorrer o procedimento-- Colocar o cursor dentro do procedimentoColocar o cursor dentro do procedimento-- Fazer: Fazer: RunRun SubSub ou (F5)ou (F5)
2 2 -- Caixa de diCaixa de diáálogo: entrada da opiniãologo: entrada da opinião3 3 -- IndicaIndicaçção da opiniãoão da opinião4 4 -- ConfirmaConfirmaççãoão5 5 -- Caixa de diCaixa de diáálogo: visualizalogo: visualizaçção da opiniãoão da opinião
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Utilização na forma de funções sobre uma folha de cálculo
111 222
333
444
555
1 1 -- Definir a funDefinir a funçção num mão num móódulodulo2 2 -- Abrir a folha de cAbrir a folha de cáálculo e escolher a clculo e escolher a céélula onde vamos usar a funlula onde vamos usar a funççãoão3 3 -- Invocar o assistente de funInvocar o assistente de funççõesões4 4 -- Escolher funEscolher funçções definidas pelo utilizadorões definidas pelo utilizador5 5 -- Escolher a Escolher a ““Minha_FuncaoMinha_Funcao””6 6 -- Seguir os passos anSeguir os passos anáálogos como se fosse uma funlogos como se fosse uma funçção do EXCELão do EXCEL
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Utilização de procedimentos na forma de macros
222 333 444555
666777 888
999
1 1 -- Definir o procedimento no mDefinir o procedimento no móódulodulo2 2 -- Saltar para a folha de cSaltar para a folha de cáálculolculo3 3 -- Escrever os valores nas cEscrever os valores nas céélulas, que queremos sujeitar ao procedimentolulas, que queremos sujeitar ao procedimento4 4 -- Seleccionar as cSeleccionar as céélulaslulas5 5 -- Seleccionar : Seleccionar : Ferramentas Ferramentas →→ Macro Macro →→Macros ... Macros ... ou (ou (AltAlt+F8)+F8)6 6 -- Surgimento da caixa de diSurgimento da caixa de diáálogo com os procedimentos definidoslogo com os procedimentos definidos7 7 -- Escolher o procedimento Escolher o procedimento ““Calcular_dobroCalcular_dobro””8 8 -- Pressionar o botão Pressionar o botão ExecutarExecutar9 9 -- Troca dos valores nas cTroca dos valores nas céélulas pelos respectivos dobroslulas pelos respectivos dobros
111
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Entrada e saída de dados
Inserção sobre o próprio código
Tratados como constantesTratados como constantesTratados como constantes
Nota: Cada vez que se desejar novos valores de entrada
teremos que corrigir o código, e de seguida correr novamente o
procedimento.
Nota: Cada vez que se desejar novos valores de entrada
teremos que corrigir o código, e de seguida correr novamente o
procedimento.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.1.4.2. Utilização de funções de entrada e saída de dados3.1.4.2. Utilização de funções de entrada e saída de dados
Entrada de Dados
Saída de Dados
InputBox (VBA) InputBox (EXCEL)
Valor Tipo de dados 0 Fórmula
1 Valor numérico
2 String
4 Valor lógico(TRUE, FALSE)
MsgBox (VBA)
Gosto de programar!!!!
Nota: Devolve sempre um valor do tipo pedido, não sendo necessária a
conversão de tipos e verifica sempre a validade do valor.
Nota: Devolve sempre um valor do tipo pedido, não sendo necessária a
conversão de tipos e verifica sempre a validade do valor.Nota: Devolve sempre um valor do tipo string, sendo necessária a
utilização de funções de conversão de tipo (ver mais à frente)
Nota: Devolve sempre um valor do tipo string, sendo necessária a
utilização de funções de conversão de tipo (ver mais à frente)
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.1.4.3. Interacção com uma folha de cálculo3.1.4.3. Interacção com uma folha de cálculo
1 1 -- Editar os elementos da matriz 3x3 numa folha de cEditar os elementos da matriz 3x3 numa folha de cáálculolculo2 2 -- Definir o procedimento de leitura dos elementos da matriz num mDefinir o procedimento de leitura dos elementos da matriz num móódulodulo3 3 -- Correr o procedimentoCorrer o procedimento4 4 -- VisualizaVisualizaçção dos elementos da matriz 3x3ão dos elementos da matriz 3x3
111222
333
444
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2. Programando em VBA - Visual Basic for Applications3.2. Programando em VBA 3.2. Programando em VBA -- Visual Visual BasicBasic for Applicationsfor Applications
3.2.1. Estrutura dum módulo3.2.1. Estrutura dum módulo
Opções de funcionamento(1)
Option Explicit
Declarações do módulo:
variáveis e constantes
Procedimentos
(1): A declaração de variáveis não é
obrigatória, e pode realizar-se em
qualquer local do módulo. Contudo,
recomenda-se a sua declaração e no
inicio dos procedimentos, funções ou
módulos, pois torna mais claro o
programa e mais rápida a execução.
(1): A declaração de variáveis não é
obrigatória, e pode realizar-se em
qualquer local do módulo. Contudo,
recomenda-se a sua declaração e no
inicio dos procedimentos, funções ou
módulos, pois torna mais claro o
programa e mais rápida a execução.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.2. Variáveis e constantes3.2.2. Variáveis e constantes
3.2.2.1. Tipos de dados3.2.2.1. Tipos de dados
O VBA, tal como a maioria das linguagens de programação de alto nível, define vários tipos de dados. O tipo de
dados, determina a gama de valores que estes podem tomar, assim como a gama de operações que podem ser
realizadas com estes. Por outro, lado o espaço ocupado em memória por cada valor depende do tipo de dados a
que pertence.
O VBA, tal como a maioria das linguagens de programação de alto nível, define vários tipos de dadostipos de dados. O tipo de
dados, determina a gama de valores que estes podem tomar, assim como a gama de operações que podem ser
realizadas com estes. Por outro, lado o espaço ocupado em memória por cada valor depende do tipo de dados a
que pertence.
Tipos lógicos : Boolean (valores lógicos: Verdadeiro (TRUE), Falso (FALSE)Tipos numéricos : Integer, Long (valores numéricos, apenas com parte inteira)
Single, Double (valores numéricos, reais)Tipo Currency : dedicado a quantidades monetáriasTipo Date : dedicado às datas Tipo String : dedicado à manipulação de Strings (cadeias de caracteres)Tipo Variant : trata-se dum tipo bastante especial, que pode conter qualquer um dos outros tiposTipo Object : relacionado com a utilização de objectos pertencentes à aplicação
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.2.2. Sumário dos vários tipos de dados3.2.2.2. Sumário dos vários tipos de dados
Tipos de Dados Ocupação (em bytes) Gama de valores
Boolean 2 bytes True ou False
Integer 2 bytes -32768 a 32767
Long (grande inteiro) 4 bytes -2 147 483 648 a 2 147 483 647
Single (virgula flutuantede precisão simples)
4 bytes -3, 402 823E38 a -1,401 298E-45 : valores negativos 1, 401 298E-45 a 3,402 823E38 : valores positivos
Double (virgula flutuantede precisão dupla)
8 bytes -1,797 693 134 86232E308 a-4,940 656 458 41247E-324 : valores negativos4,94065645841247E-324a 1,797 693 134 86232E308 : valores positivos
Currency 8 bytes -922 337 203 685 477, 5808 a922 337 203 685 477, 5807
Date 8 bytes 1 Jan 0100 A 31 Dez 9999
String 1 byte/caracter (0 a 65535) ou mais em algumas sistemas até 2 biliões
Variant 16 bytes +1 para c/caracter
Qualquer valor numérico até à gama do Double, ouqualquer texto de caracteres
Object 4 bytes Qualquer referência a um objecto.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.2.3. Tipo Variant3.2.2.3. Tipo VariantVariant
Trata-se dum tipo muito especial, pois pode conter qualquer um dos outros tipos de dadosTrata-se dum tipo muito especial, pois pode conter qualquer um dos outros tipos de dados
Aspectos a ter em conta
uma variável deste tipo poderá conter qualquer tipo de dados;
a flexibilidade anterior diminui o controlo possível sobre a utilização duma variável deste tipo;
se em determinada situação, for colocado involuntariamente um valor dum tipo de dados não desejado, a
utilização duma variável deste tipo, torna muito mais difícil a detecção do erro cometido;
o tipo Variant, é o que ocupa mais espaço em memória.
uma variuma variáável deste tipo podervel deste tipo poderáá conter qualquer tipo de dados;conter qualquer tipo de dados;
a flexibilidade anterior diminui o controlo possa flexibilidade anterior diminui o controlo possíível sobre a utilizavel sobre a utilizaçção duma varião duma variáável deste tipo;vel deste tipo;
se em determinada situase em determinada situaçção, for colocado involuntariamente um valor dum tipo de dados nãão, for colocado involuntariamente um valor dum tipo de dados não desejado, a o desejado, a
utilizautilizaçção duma varião duma variáável deste tipo, torna muito mais difvel deste tipo, torna muito mais difíícil a deteccil a detecçção do erro cometido;ão do erro cometido;
o o tipo VariantVariant, , éé o que ocupa mais espao que ocupa mais espaçço em memo em memóória.ria.
Nota: A utilização do tipo Variant deve restringir-se apenas às situações, em que não se tenha conhecimento do tipo de dados a
utilizar.
Nota: A utilização do tipo Variant deve restringir-se apenas às situações, em que não se tenha conhecimento do tipo de dados a
utilizar.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.2.5. Declaração de variáveis3.2.2.5. Declaração de variáveis
Uma variável representa a área de memória, que contém um valor dum determinado tipo de dados. Para associar
um determinado tipo de dados a uma dada variável, é necessário proceder à declaração da variável. A
declaração da variável condiciona, o tipo de dados que esta pode conter durante a execução dum programa.
Uma variável representa a área de memória, que contém um valor dum determinado tipo de dados. Para associar
um determinado tipo de dados a uma dada variável, é necessário proceder à declaradeclaraçção da varião da variáávelvel. A
declaração da variável condiciona, o tipo de dados que esta pode conter durante a execução dum programa.
3.2.2.6. Sintaxe: declaração duma variável do tipo simples3.2.2.6. Sintaxe: declaração duma variável do tipo simples
A declaração de várias variáveis, pode ser feita da forma anterior em linhas diferentes iniciadas pela palavra reservada Dim , ou
duma forma equivalente, na mesma linha através da separação do nome e do tipo das variáveis por virgulas. Para o efeito vejamos
o exemplo seguinte:
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Algumas considerações: declaração de variáveis simples
Quando uma variável não é declarada explicitamente (i.e.: quando a opção Option Explicit estádesactivada), o VBA assume que esta se trata duma variável do tipo Variant
Quando uma variQuando uma variáável não vel não éé declarada explicitamente (i.e.: quando a opdeclarada explicitamente (i.e.: quando a opçção ão OptionOption ExplicitExplicit estestáádesactivada), o VBA assume que esta se trata duma varidesactivada), o VBA assume que esta se trata duma variáável do tipo vel do tipo VariantVariant
se declararmos apenas o nome da variável sem indicar o tipo de dados, o VBA assume por defeito o tipoVariant
se declararmos apenas o nome da varise declararmos apenas o nome da variáável sem indicar o tipo de dados, o VBA assume por defeito o tipovel sem indicar o tipo de dados, o VBA assume por defeito o tipoVariantVariant
‘ Exemplos
Dim s As String
Dim n1 As Integer, n2 As
Double
Dim x As Single
Dim y As Single
Dim data AsDate
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.2.7. Sintaxe: declaração de variáveis de tipo estruturado ou Arrays3.2.2.7. Sintaxe: declaração de variáveis de tipo estruturado ou Arrays
Arrays (vectores)
Por vezes torna-se necessário/conveniente referenciar uma zona de memória onde estão guardados vários
valores dum mesmo tipo de dados simples ou estruturado, utilizando um mesmo nome. Para o efeito, utilizam-se
variáveis do tipo estruturado: Arrays.
Por vezes torna-se necessário/conveniente referenciar uma zona de memória onde estão guardados vários
valores dum mesmo tipo de dados simples ou estruturado, utilizando um mesmo nome. Para o efeito, utilizam-se
variáveis do tipo estruturado: ArraysArrays.
AA20
15
17
18
1
2
3
4
O Array é um tipo de variável estruturada, consistindo num
conjunto de “células”, identificadas univocamente por um “índice”
(endereço), cujo o conteúdo é constituído por um valor dum
determinado tipo de dados simples.
O ArrayArray é um tipo de variável estruturada, consistindo num
conjunto de “células”, identificadas univocamente por um “índice”
(endereço), cujo o conteúdo é constituído por um valor dum
determinado tipo de dados simples.
Células Índices
Tipo inteiro Nota: Para nos referirmos a cada um dos seus valores, utilizamos o nome do Array e o índice da
célula, na qual o valor se encontra.
Nota: Para nos referirmos a cada um dos seus valores, utilizamos o nome do ArrayArray e o índice da
célula, na qual o valor se encontra.
‘ Exemplo
Dim A(1 To 4) As Integer
, var_1 As integer
var_1 = A(2)’r
epresenta o va
lor 15 do arra
y A
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Declaração
A gama_de_índices, apresenta-se do seguinte modo:menor_índice To maior_índice,
equivalendo a dizer em analogia com um bloco habitacional, que este vai “desde o andar mais baixo até (To) ao andar mais alto”.
A gama_de_índices, apresenta-se do seguinte modo:menor_índice To maior_índice,
equivalendo a dizer em analogia com um bloco habitacional, que este vai “desde o andar mais baixo até (To) ao andar mais alto”.
O array Array_A, teria 6 células (desde a célula -2 à célula 3), com valores do tipo Integer.O array Array_A, teria 6 células (desde a célula -2 à célula 3), com valores do tipo Integer.
O array Array_B, teria 3 células (desde a célula 6 à célula 8), com valores do tipo string.O array Array_B, teria 3 células (desde a célula 6 à célula 8), com valores do tipo string.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Algumas considerações:
As duas formas de declarar a gama de índices são equivalentes, tratando-se em ambos os casos dum Arrayde 5 células com valores do tipo double, cujo o menor índice é 0 (0..4)
As duas formas de declarar a gama de As duas formas de declarar a gama de ííndices são equivalentes, tratandondices são equivalentes, tratando--se em ambos os casos dum se em ambos os casos dum ArrayArrayde 5 cde 5 céélulas com valores do tipo lulas com valores do tipo double, cujo o menor , cujo o menor ííndice ndice éé 0 (0..4)0 (0..4)
Apesar de ser possível qualquer gama de índices (desde que o valor do índice inferior seja menor que o valor do índice superior), em geral é preferível que o valor do índice inferior comece em 1.
Apesar de ser possApesar de ser possíível qualquer gama de vel qualquer gama de ííndices (desde que o valor do ndices (desde que o valor do ííndice inferior seja menor que o ndice inferior seja menor que o valor do valor do ííndice superior), em geral ndice superior), em geral éé preferpreferíível que o valor do vel que o valor do ííndice inferior comece em 1. ndice inferior comece em 1.
Quando quisermos referir uma dada célula, indicamos o nome do Array seguido do índice da célula entre parêntesis. Contudo, teremos de escolher sempre um valor do índice, que se encontre dentro da gama de índices.
Quando quisermos referir uma dada cQuando quisermos referir uma dada céélula, indicamos o lula, indicamos o nome do nome do ArrayArray seguido do seguido do ííndice da cndice da céélula entre lula entre parêntesis. parêntesis. Contudo, teremos de escolher sempre um Contudo, teremos de escolher sempre um valor do valor do ííndice, que se encontre dentro da gama de ndice, que se encontre dentro da gama de ííndicesndices..
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Arrays multi-dimensionais
5 9 1
3 9 1
4 7 2
5 9 1
3 9 1
4 9 1
5 9 1
1 9 1
2 9 1
5 9 1
5 9 1
5 9 1
1 9 1
1 2
3
1 2 3
1
2
1 2 3
3
1
2
12
3
Array uni-dimensional - (1-D)
Array bi-dimensional - (2-D)
Array tri-dimensional - (3-D)
Array k-dimensional - (K-D)
Embora não se tenha desenhado um Array K-D, para K >3, a sua declaração e utilização éigualmente possível em VBA.
Embora não se tenha desenhado um ArrayArray K-D, para K >3, a sua declaração e utilização éigualmente possível em VBA.
3
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.2.8. Declaração de constantes3.2.2.8. Declaração de constantes
A diferença em relação à declaração duma variável reside na palavra reservada utilizada, Const em vez de
Dim, e ainda na necessidade de indicar antecipadamente o valor atribuído à constante.
A diferença em relação à declaração duma variável reside na palavra reservada utilizada, Const em vez de
Dim, e ainda na necessidade de indicar antecipadamente o valor atribuído à constante.
móduloNota: Em toda a codificação do módulo utiliza-se sempre o
nome da constante (e não o seu valor), pelo que se
quisermos alterar o seu valor, basta alterar o valor da linha
da declaração Const.
Nota: Em toda a codificação do módulo utiliza-se sempre o
nome da constante (e não o seu valor), pelo que se
quisermos alterar o seu valor, basta alterar o valor da linha
da declaração Const.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.3. Procedimentos3.2.3. Procedimentos
Um procedimento é constituído por um conjunto de instruções codificadas, ao qual é atribuído um determinado
nome, sendo a sua execução feita individualmente num módulo.
Um procedimentoprocedimento é constituído por um conjunto de instruções codificadas, ao qual é atribuído um determinado
nome, sendo a sua execução feita individualmente num módulo.
3.2.3.1. Estrutura dum procedimento3.2.3.1. Estrutura dum procedimento
Cabeçalho do Procedimento
Tipo, Nome, Argumentos, Tipo devolvido
Declarações do Procedimento
Constantes e Variáveis
Corpo do Procedimento
Bloco de instruções codificadas
Fim do Procedimento
End Tipo do Procedimento
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.3.2. Tipos de procedimentos3.2.3.2. Tipos de procedimentos
Sub … End Sub
Function … End Function
Existem dois tipos de procedimentos: Sub … End Sub e Function … End Function. A diferença entre
estes dois tipos de procedimentos reside no facto de Function … End Function, devolver um valor a um
outro procedimento que o tiver invocado, como uma atribuição a uma variável, o que não acontece com Sub …
End Sub.
Existem dois tipos de procedimentos: Sub … End Sub e Function … End Function. A diferença entre
estes dois tipos de procedimentos reside no facto de Function … End Function, devolver um valor a um
outro procedimento que o tiver invocado, como uma atribuição a uma variável, o que não acontece com Sub …
End Sub.
Sub nome_do_procedimento (lista_de_argum
entos)
Dimensionamento das constantes
e variáveis do procedimento
Bloco de instruções codificada
s
End Sub
Function nome_do_procedimento (lista_de_argum
entos)As tipo_do_valor_a_devolver
Dimensionamento das constantes
e variáveis do procedimento
Bloco de instruções codificada
s
nome_do_procedimento = expressão_do_
valor_a_devolver
End Function
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.3.2. Exemplo3.2.3.2. Exemplo
Definição da função f_partes
Definição do procedimento Rep_ValoresAtribuição duma expressão a f_partes
Nota: Para que uma função possa
devolver um determinado valor, torna-se
necessário que uma das suas instruções
faça a atribuição desse valor ao seu
nome.
Nota: Para que uma função possa
devolver um determinado valor, torna-se
necessário que uma das suas instruções
faça a atribuição desse valor ao seu
nome.
Chamada de f_partes dentro de Rep_Valores
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.4. Instruções3.2.4. Instruções
3.2.4.1. Tipos de Instruções3.2.4.1. Tipos de Instruções
- Leitura e Escrita
- Atribuição
- Expressões
- Comentários
- Estruturas de controlo
O corpo dum procedimento é composto por um conjunto de instruções. Numa linguagem de programação estas
instruções correspondem à codificação das instruções utilizadas na escrita dum algoritmo (pseudo-linguagem ou
fluxograma), de acordo com a sua sintaxe (neste caso a do VBA).
O corpo dum procedimento é composto por um conjunto de instruinstruççõesões. Numa linguagem de programação estas
instruinstruççõesões correspondem à codificação das instruções utilizadas na escrita dum algoritmo (pseudo-linguagem ou
fluxograma), de acordo com a sua sintaxe (neste caso a do VBA).
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.5. Leitura e Escrita3.2.5. Leitura e Escrita
As instruções de Leitura e Escrita, correspondem na linguagem VBA, às funções de entrada e saída de dados já
abordadas na secção 3.1.4.2: InputBox e MsgBox.
As instruções de Leitura e Escrita, correspondem na linguagem VBA, às funções de entrada e saída de dados já
abordadas na secção 3.1.4.2: InputBox e MsgBox.
Exemplo
…Inst.1: ESCREVER (“Cálculo da área do rectângulo”)
Inst.2: ESCREVER (“Indique o valor da base”)
Inst.3: LER (base)
Inst.4: ESCREVER (“Indique o valor da altura”)
Inst.5: LER (altura)
Inst.6: area base * altura
Inst.7: ESCREVER ( “A área é:” area)
...
…Inst.1: ESCREVER (“Cálculo da área do rectângulo”)
Inst.2: ESCREVER (“Indique o valor da base”)
Inst.3: LER (base)
Inst.4: ESCREVER (“Indique o valor da altura”)
Inst.5: LER (altura)
Inst.6: area base * altura
Inst.7: ESCREVER ( “A área é:” area)
...
Codificação VBADescrição Algorítmica
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO Em VBA, o operador de atribuição é o sinal de igual “ =“, que tal como o símbolo utilizado na descrição
algorítmica (“←”), também este significa: “ toma o valor de “.
A instrução em pseudo-linguagem I←3, seria codificado em VBA através da instrução I=3
Em VBA, o operador de atribuição é o sinal de igual “ =“, que tal como o símbolo utilizado na descrição
algorítmica (“←”), também este significa: “ toma o valor de “.
A instrução em pseudo-linguagem I←3, seria codificado em VBA através da instrução I=3
3.2.6. Atribuição3.2.6. Atribuição
Codificação VBADescrição Algorítmica
…Inst.1: ESCREVER (“Cálculo da área do rectângulo”)
Inst.2: ESCREVER (“Indique o valor da base”)
Inst.3: LER (base)
Inst.4: ESCREVER (“Indique o valor da altura”)
Inst.5: LER (altura)
Inst.6: area base * altura
Inst.7: ESCREVER ( “A área é:” area)
...
…Inst.1: ESCREVER (“Cálculo da área do rectângulo”)
Inst.2: ESCREVER (“Indique o valor da base”)
Inst.3: LER (base)
Inst.4: ESCREVER (“Indique o valor da altura”)
Inst.5: LER (altura)
Inst.6: area base * altura
Inst.7: ESCREVER ( “A área é:” area)
...
Exemplo
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.7. Expressões3.2.7. Expressões
3.2.7.1. Tipos de expressões3.2.7.1. Tipos de expressões
Tal como num algoritmo uma expressão (ou fórmula) é composta por um conjunto de operandos (dados directos
ou indirectos), relacionados entre si por operadores e/ou por funções, permitindo o cálculo de valores, a partir
dum outro conjunto de valores.
Tal como num algoritmo uma expressão (ou fórmula) é composta por um conjunto de operandos (dados directos
ou indirectos), relacionados entre si por operadores e/ou por funções, permitindo o cálculo de valores, a partir
dum outro conjunto de valores.
Numéricas - são expressões que utilizam apenas operadores aritméticos, funções matemáticas e trigonométricas e operandos numéricos (inteiros ou reais).
Booleanas ou Lógicas - são expressões que utilizam apenas operadores relacionais e têm como resultado valores do tipo booleano (True, False).
‘ Exemplos
Var_A = Sin(x) + 2*
Cos(x)
Var_B = 100* (1+0,15
)* Var_A
Area = base * altur
a
‘ Exemplos
Var_A >=Var_B
Var_F = Not (Var_C)
Var_G = And (Var_C,V
ar_D)
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.7.2. Tipos de operadores e respectiva precedência3.2.7.2. Tipos de operadores e respectiva precedência
Operadores aritméticos
Operadores relacionais
Operador Significado Exemplo+ Adição- Subtracção ou sinal negativo* Produto/ Divisão 17/5 vale 3.4\ Parte inteira da divisão 17\5 vale 3
Mod Resto da divisão inteira 17 Mod 5 vale 2^ Exponenciação 2^3 vale 23=8
O perador S ign ificado< M enor que
<= M enor ou igual a> M aio r que
>= M aio r ou igual a= Igual a
<> diferen te
17 5
2 3
Tome atenção: a interpretação da relação entre dois valores
depende do seu tipo; enquanto a relação entre valores
numéricos se baseia na ordem que estes ocupam em termos da
recta real (onde se incluem os inteiros), a relação entre strings
(cadeias de caracteres) baseia-se na sua ordem de acordo com
a tabela ASCII:
ex.: -5 < 2 < 4 < 10“1” < “10” < “1006” < “184” < “2”< “30< ”ola”
Tome atenção: a interpretação da relação entre dois valores
depende do seu tipo; enquanto a relação entre valores
numéricos se baseia na ordem que estes ocupam em termos da
recta real (onde se incluem os inteiros), a relação entre strings
(cadeias de caracteres) baseia-se na sua ordem de acordo com
a tabela ASCII:
ex.: -5 < 2 < 4 < 10“1” < “10” < “1006” < “184” < “2”< “30< ”ola”
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Operadores lógicos (booleanos)
Operadores para cadeias de caracteres
Operador Significado Símbolo matemáticoNot Negação ~And "e" ∧Or "ou" ∨Xor "ou" exclusivo ∨Imp Implicação ⇒Eqv equivalência ⇔
Operador Significado Exemplo& Concatenação "bom" & "dia" vale "bom dia"+ Concatenação "bom" + "dia" vale "bom dia"
Tome atenção: “20” + “34” vale “2034” e não “54”Tome atenção: “20” + “34” vale “2034” e não “54”
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
^-*, /\Mod+, -
exponenciaçãosinal de negativomultiplicação e divisãodivisão inteiraresto da divisãoadição e subtracção
& concatenação de cadeias=, <>, <, >, <=, >=,Like, Is
igual a; diferente de; menor que; maior que;menor ou igual a; maior ou igual a; like; is
NotAndOrXorEqvImp
negaçãoeouou exclusivoequivalênciaimplicação
^-*, /\Mod+, -
exponenciaçãosinal de negativomultiplicação e divisãodivisão inteiraresto da divisãoadição e subtracção
& concatenação de cadeias=, <>, <, >, <=, >=,Like, Is
igual a; diferente de; menor que; maior que;menor ou igual a; maior ou igual a; like; is
NotAndOrXorEqvImp
negaçãoeouou exclusivoequivalênciaimplicação
Precedência dos operadores
Quando queremos construir uma expressão que envolva diferentes operadores teremos de ter em atenção a
respectiva tabela de precedências
Quando queremos construir uma expressão que envolva diferentes operadores teremos de ter em atenção a
respectiva tabela de precedências
Tabela de precedências dos operadores
Tome atenção:
a) quando estamos perante operadores com o
mesmo nível de precedência estes deverão
ser considerados de acordo com a ordem em
que se apresentam: da esquerda para a
direita.
b) quando queremos forçar uma determinada
ordem na execução das operações duma
expressão usam-se parêntesis (ex.: -3 -
(4+6/(3-1))*5 ).
Tome atenção:
a) quando estamos perante operadores com o
mesmo nível de precedência estes deverão
ser considerados de acordo com a ordem em
que se apresentam: da esquerda para a
direita.
b) quando queremos forçar uma determinada
ordem na execução das operações duma
expressão usam-se parêntesis (ex.: -3 -
(4+6/(3-1))*5 ).
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
‘ ExemplosDim media As Singl
e
Dim valores(1 To 10) As Single
…media=Applicat
ion.Average(valores)
...
3.2.7.3. Utilização de funções3.2.7.3. Utilização de funções
EXCEL (Application)
VBA (módulo)
Uma expressão (ou fórmula) pode conter além de operandos relacionados entre si através de operadores,
também funções. As funções utilizadas presentes numa expressão codificada em VBA podem estar definidas no:
Uma expressão (ou fórmula) pode conter além de operandos relacionados entre si através de operadores,
também funções. As funções utilizadas presentes numa expressão codificada em VBA podem estar definidas no:
Application.nome_da_função (lista_de_argum
entos)
O nome das funções do EXCEL, num módulo está em inglês.
‘ ExemplosAbs(x) Fix(x) Ln(x)
Cos(x) Int(x) Sqrt(x)
Exp(x) Log(x) Sin(x)
...
As restantes funções podem ser consultadas no manual On-Line.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.8. Comentários3.2.8. Comentários
Os comentários são frases, que têm como missão facilitar a compreensão do conteúdo dos módulos (declaração das variáveis ou instruções), sendo sempre antecedidos do caracter “ ‘ “ (plica).
Os comentários são frases, que têm como missão facilitar a compreensão do conteúdo dos módulos (declaração das variáveis ou instruções), sendo sempre antecedidos do caracter “ ‘ “ (plica).
Exemplos de comentários
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.9. Estruturas de controlo3.2.9. Estruturas de controlo
3.2.9.1. Tipos estruturas de controlo3.2.9.1. Tipos estruturas de controlo
Existem vários tipos de estruturas de controlo, cada uma das quais com comportamentos distintos em termos da
sequência de execução das diversas instruções dentro dum procedimento. Estas condicionam a ordem pela qual
as várias instruções serão executadas no procedimento, tal como vimos na descrição algorítmica.
Existem vários tipos de estruturas de controlo, cada uma das quais com comportamentos distintos em termos da
sequência de execução das diversas instruções dentro dum procedimento. Estas condicionam a ordem pela qual
as várias instruções serão executadas no procedimento, tal como vimos na descrição algorítmica.
- Estruturas Sequenciais
- Estruturas de Decisão Condicional
- Estruturas de Repetição com n.º de iterações pré-definidas
- Estruturas de Repetição Condicional
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.10. Estrutura Sequencial3.2.10. Estrutura Sequencial
De acordo com esta estrutura, as instruções são executadas pela ordem em que estas se encontram definidas
num procedimento. Por defeito, esta é estrutura usada em qualquer procedimento.
De acordo com esta estrutura, as instruções são executadas pela ordem em que estas se encontram definidas
num procedimento. Por defeito, esta é estrutura usada em qualquer procedimento.
Codificação VBADescrição Algorítmica
…Inst.1: ESCREVER (“Cálculo da área do rectângulo”)
Inst.2: ESCREVER (“Indique o valor da base”)
Inst.3: LER (base)
Inst.4: ESCREVER (“Indique o valor da altura”)
Inst.5: LER (altura)
Inst.6: area base * altura
Inst.7: ESCREVER ( “A área é:” area)
...
…Inst.1: ESCREVER (“Cálculo da área do rectângulo”)
Inst.2: ESCREVER (“Indique o valor da base”)
Inst.3: LER (base)
Inst.4: ESCREVER (“Indique o valor da altura”)
Inst.5: LER (altura)
Inst.6: area base * altura
Inst.7: ESCREVER ( “A área é:” area)
...
Exemplo
Sequ
enci
al
Sequ
enci
al
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.11. Estruturas de Decisão Condicional3.2.11. Estruturas de Decisão Condicional
3.2.11.1. Decisão Simples3.2.11.1. Decisão Simples
Nesta estrutura de controlo, a instrução ou bloco de instruções serão executadas apenas, se a condição testada
for verdadeira (“True”).
Nesta estrutura de controlo, a instrução ou bloco de instruções serão executadas apenas, se a condição testada
for verdadeira (“True”).
Sintaxes:
If condição Then
Instrução ou bloco de instruçõ
es
End If
Sintaxe 1
Sintaxe 2If condição Then Instrução
Utiliza-se mais do que uma linha, e se a condição for verdadeira, corresponde à execução duma instrução ou bloco de instruções. A
primeira linha deve acabar com Then e a estrutura com End If.
Utiliza-se mais do que uma linha, e se a condição for verdadeira, corresponde à execução duma instrução ou bloco de instruções. A
primeira linha deve acabar com ThenThen e a estrutura com EndEnd IfIf.
Neste caso utiliza-se apenas uma linha, e se a condição for verdadeira, corresponde à execução de apenas uma instrução.Neste caso utiliza-se apenas uma linha, e se a condição for verdadeira, corresponde à execução de apenas uma instrução.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO Codificação VBADescrição Algorítmica
…Inst.1: ESCREVER (“Indique a nota do aluno”)
Inst.2: LER (Nota)
Inst.3: SE Nota >= 9,5 ENTÃO Situação “Aprovado”Inst.4: SE Situação = “Aprovado” ENTÃO
ESCREVER (“Indique o nome do aluno”)LER (nome)ESCREVER ( “O aluno” & nome & “ foi ” & Situação)
FIM SE
...
…Inst.1: ESCREVER (“Indique a nota do aluno”)
Inst.2: LER (Nota)
Inst.3: SE Nota >= 9,5 ENTÃO Situação “Aprovado”Inst.4: SE Situação = “Aprovado” ENTÃO
ESCREVER (“Indique o nome do aluno”)LER (nome)ESCREVER ( “O aluno” & nome & “ foi ” & Situação)
FIM SE
...
Exemplo - Análise da nota dum aluno: (Nota >= 9,5 então Aprovado).
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.11.2. Decisão Dupla (ou alternativa)3.2.11.2. Decisão Dupla (ou alternativa)
Nesta estrutura de controlo se a condição testada for verdadeira (“True”), serão executadas a instrução_1 ou
bloco de instruções_1, caso contrário (“False”) serão executadas a instrução_2 ou o bloco de instruções_2.
Nesta estrutura de controlo se a condição testada for verdadeira (“True”), serão executadas a instrução_1 ou
bloco de instruções_1, caso contrário (“False”) serão executadas a instrução_2 ou o bloco de instruções_2.
Sintaxe 1If condição Then
Instrução_1 ou bloco de instru
ções_1
ElseInstrução_2 ou
bloco de instruções_2
End If
If condição Then Instrução_1 Else Instrução_2
Utiliza-se mais do que uma linha, e se a condição for verdadeira, executa-se a instrução_1 ou o bloco de instruções_1, senão executa-se a instrução_2 ou o
bloco de instruções_2. A primeira linha deve acabar com Then e a estrutura tem de fechar com End If.
Utiliza-se mais do que uma linha, e se a condição for verdadeira, executa-se a instrução_1 ou o bloco de instruções_1, senão executa-se a instrução_2 ou o
bloco de instruções_2. A primeira linha deve acabar com ThenThen e a estrutura tem de fechar com EndEnd IfIf.
Neste caso utiliza-se apenas uma linha, e se a condição for verdadeira executa a instrução_1, senão executa a instrução_2.Neste caso utiliza-se apenas uma linha, e se a condição for verdadeira executa a instrução_1, senão executa a instrução_2.
Sintaxe 2
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
…Inst.1: ESCREVER (“Indique a nota do aluno”)
Inst.2: LER (Nota)
Instr.3: ESCREVER (“Indique o nome do aluno”)
Instr.4: LER (Nome)
Inst.5: SE Nota >= 9,5 ENTÃO
Situação “Aprovado”
ESCREVER (“O aluno “ &Nome &“foi “ &SituaçãoSENÃOSituação “Reprovado”
ESCREVER (“O aluno “ &Nome &“foi “ &SituaçãoFIM SE
...
…Inst.1: ESCREVER (“Indique a nota do aluno”)
Inst.2: LER (Nota)
Instr.3: ESCREVER (“Indique o nome do aluno”)
Instr.4: LER (Nome)
Inst.5: SE Nota >= 9,5 ENTÃO
Situação “Aprovado”
ESCREVER (“O aluno “ &Nome &“foi “ &SituaçãoSENÃOSituação “Reprovado”
ESCREVER (“O aluno “ &Nome &“foi “ &SituaçãoFIM SE
...
Codificação VBADescrição Algorítmica
Exemplo - Análise da nota dum aluno: (Se Nota >= 9,5 então Aprovado Senão Reprovado).
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.11.3. Decisão Múltipla (ou selectiva)3.2.11.3. Decisão Múltipla (ou selectiva)
As estruturas anteriores, encontram-se limitadas ao resultado lógico da sua condição (“True” ou “False”), pelo que
podemos ter no máximo dois comportamentos alternativos. Se quisermos utilizar mais do que uma condição,
correspondendo a igual número de comportamentos, teremos de utilizar uma estrutura de decisão múltipla ou
selectiva.
As estruturas anteriores, encontram-se limitadas ao resultado lógico da sua condição (“True” ou “False”), pelo que
podemos ter no máximo dois comportamentos alternativos. Se quisermos utilizar mais do que uma condição,
correspondendo a igual número de comportamentos, teremos de utilizar uma estrutura de decisão mestrutura de decisão múúltipla ou ltipla ou
selectivaselectiva.
Sintaxe 1
If condição_1 Then
Instrução_1 ou bloco de instru
ções_1
ElseIf condição_2 Then
Instrução_2 ou bloco de instru
ções_2
………………………………….
ElseIf condição_n Then
Instrução_n ou bloco de instru
ções_n
ElseInstrução_n+1 o
u bloco de instruções_n+1
End If
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Exemplo
…Inst.1: ESCREVER (“Indique a nota do aluno”)
Inst.2: LER (Nota)
Inst.3: SE Nota < 9,5 ENTÃO
Nota_Qual “Insuficiente”SENÃO SE Nota <14 ENTÃO
Nota_Qual “Suficiente”SENÃO SE Nota <17 ENTÃO
Nota_Qual “Bom”SENÃO SE Nota <=20 ENTÃO
Nota_Qual “Muito Bom”SENÃO
Nota_Qual “Inválida”FIM SE
Inst. 4: ESCREVER (“A nota “ &Nota &“corresponde a “ &Nota_Qual)
…Inst.1: ESCREVER (“Indique a nota do aluno”)
Inst.2: LER (Nota)
Inst.3: SE Nota < 9,5 ENTÃO
Nota_Qual “Insuficiente”SENÃO SE Nota <14 ENTÃO
Nota_Qual “Suficiente”SENÃO SE Nota <17 ENTÃO
Nota_Qual “Bom”SENÃO SE Nota <=20 ENTÃO
Nota_Qual “Muito Bom”SENÃO
Nota_Qual “Inválida”FIM SE
Inst. 4: ESCREVER (“A nota “ &Nota &“corresponde a “ &Nota_Qual)
Codificação VBADescrição Algorítmica
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Sintaxe 1
Exemplo Descrição Algorítmica…Inst.1: ESCREVER (“Indique a nota do aluno”)
Inst.2: LER (Nota)Inst.3: CASO Nota SEJA
<9.5 FAZ:Nota_Qual “Insuficiente”
<14 FAZ:Nota_Qual “Suficiente”
<17 FAZ:Nota_Qual “Bom”
<=20 FAZ:Nota_Qual “Muito Bom”
SENÃO FAZ:Nota_Qual “Inválida”
FIM CASOInst. 4: ESCREVER (“A nota “ &Nota &“corresponde a “ &Nota_Qual)...
…Inst.1: ESCREVER (“Indique a nota do aluno”)
Inst.2: LER (Nota)Inst.3: CASO Nota SEJA
<9.5 FAZ:Nota_Qual “Insuficiente”
<14 FAZ:Nota_Qual “Suficiente”
<17 FAZ:Nota_Qual “Bom”
<=20 FAZ:Nota_Qual “Muito Bom”
SENÃO FAZ:Nota_Qual “Inválida”
FIM CASOInst. 4: ESCREVER (“A nota “ &Nota &“corresponde a “ &Nota_Qual)...
Select Case expressão
Case lista_de_expressões_1
Instrução_1 ou bloco de instruções_2
………………………………….
Case lista_de_expressões_n
Instrução_n ou bloco de instruções_n
Case ElseInstrução_n+1 ou bloco de in
struções_n+1
End Select
Codificação VBA
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Algumas considerações:
A lista_de_expressões indicada em cada linha iniciada por Case pode apresentar as seguintes
formas:
A A lista_de_expressõeslista_de_expressões indicada em cada linha iniciada por indicada em cada linha iniciada por CaseCase pode apresentar as seguintes pode apresentar as seguintes
formas:formas:
- expressãoexpressão : qualquer expressão da qual resulte um valor;
- expressãoexpressão ToTo expressãoexpressão : permite a especificação duma gama de valores, através da utilização da palavra reservada ToTo;
- IsIs operador relacional expressãoexpressão: a utilização de IsIs seguida dum operador relacional, permite indicar todos os valores que gozam duma determinada relação;
- Case Case ElseElse : destina-se a indicar a instrução ou bloco de instruções a executar no caso da expressão indicada na linha SelectSelect CaseCase, tomar um valor diferente dos referidos nas restantes linhas CaseCase (éopcional).
Nota: se existir mais do que uma linha cuja a expressão adquire o valor da expressão da linha Select Case, serão apenas
executadas a instrução ou o bloco de instruções correspondentes à primeira linha Case com essa expressão.
Nota: se existir mais do que uma linha cuja a expressão adquire o valor da expressão da linha SelectSelect CaseCase, serão apenas
executadas a instrução ou o bloco de instruções correspondentes à primeira linha CaseCase com essa expressão.
Ex.: 4, “batatas” , j+3
Ex.: 12 To 50, “A” To “Z”
Ex.: Case Is >=100Case Is <0, Is >100, 4 To 8, 11 To 15, 18
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.12. Estrutura de Repetição com n.º de iterações pré-definidas3.2.12. Estrutura de Repetição com n.º de iterações pré-definidas
3.2.12.1. For …. Next3.2.12.1. For …. Next
Esta estrutura de controlo permite a repetição duma determinada instrução ou bloco de instruções, o número de vezes que tiverem sido pré-definidas, e duma forma controlada. Cada repetição corresponde a um ciclo.
Esta estrutura de controlo permite a repetição duma determinada instrução ou bloco de instruções, o número de vezes que tiverem sido pré-definidas, e duma forma controlada. Cada repetição corresponde a um ciclo.
Sintaxe:
Algumas considerações:
For variável_de_iteração = valor_i
nicial To valor_final [Step valor_do_passo]
Instrução ou bloco de instruçõ
es
Next
Esta estrutura implica a utilização duma variável_de_iteração ou contador, que em cada nova iteração
(ciclo) toma um novo valor; de acordo com o especificado começa com o valor_inicial e vai até ao
valor_final. O Step (opcional), define o intervalo de incremento (valor_do_passo>0) ou decremento
(valor_do_passo <0) da variável_de_iteração.
Esta estrutura implica a utilização duma variável_de_iteração ou contador, que em cada nova iteração
(ciclo) toma um novo valor; de acordo com o especificado começa com o valor_inicial e vai até ao
valor_final. O Step (opcional), define o intervalo de incremento (valor_do_passo>0) ou decremento
(valor_do_passo <0) da variável_de_iteração.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Exemplo 1
∑=
×−=N
i
iiS1
)2( Cálculo do Somatório dos primeiros N elementos
Codificação VBADescrição Algorítmica
…Inst.1: Somatorio 0
Inst.2: DE i 1 ATÉ N FAZ
Somatorio Somatorio + (2-i)*i
FIM DE
Inst.3: ESCREVER ( “O resultado do somatório é”, & Somatorio)
...
…Inst.1: Somatorio 0
Inst.2: DEDE i 1 ATATÉÉ N FAZFAZ
Somatorio Somatorio + (2-i)*i
FIM DEFIM DE
Inst.3: ESCREVER ( “O resultado do somatório é”, & Somatorio)
...
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
…
‘ Ler matriz AInst.1: DE l 1 ATÉ N_L FAZ
DE c 1 ATÉ N_C FAZESCREVER(“Indique o valor de A(l,c)”)LER(A(l,c))
FIM DE (c)FIM DE (l)
‘Escrever matriz AInst.2: DE l 1 ATÉ N_L FAZ
DE c 1 ATÉ N_C FAZESCREVER(A(l,c))
FIM DE (c)FIM DE (l)
...
…
‘ Ler matriz AInst.1: DEDE l 1 ATATÉÉ N_L FAZFAZ
DEDE c 1 ATATÉÉ N_C FAZFAZESCREVERESCREVER(“Indique o valor de A(l,c)”)LERLER(A(l,c))
FIM DE FIM DE (c)(c)FIM DE FIM DE (l)(l)
‘Escrever matriz AInst.2: DEDE l 1 ATATÉÉ N_L FAZFAZ
DEDE c 1 ATATÉÉ N_C FAZFAZESCREVERESCREVER(A(l,c))
FIM DE FIM DE (c)(c)FIM DE FIM DE (l)(l)
...
Exemplo 2
⎥⎥⎥
⎦
⎤
⎢⎢⎢
⎣
⎡=
333231
232221
221211
aaaaaaaaa
A
Descrição Algorítmica Codificação VBA
- Ler valores da matriz A- Escrever valores da matriz A
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.12.2. For Each…. Next3.2.12.2. For Each…. Next
Sintaxe:For Each variável_contad
or In Variável_estruturada
Instrução ou bloco de instruçõ
es
Next
Para acedermos aos valores contidos numa variável estruturada (Array), podemos utilizar também uma estrutura de controlo deste tipo.
Para acedermos aos valores contidos numa variável estruturada (ArrayArray), podemos utilizar também uma estrutura de controlo deste tipo.
ExemploDescrição Algorítmica Codificação VBA
….‘Escrever matriz AInst.1: DE l 1 ATÉ N_L FAZ
DE c 1 ATÉ N_C FAZESCREVER(A(l,c))
FIM DE (c)FIM DE (l)
...
….‘Escrever matriz AInst.1: DEDE l 1 ATATÉÉ N_L FAZFAZ
DEDE c 1 ATATÉÉ N_C FAZFAZESCREVERESCREVER(A(l,c))
FIM DE FIM DE (c)(c)FIM DE FIM DE (l)(l)
...
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.13. Repetição Condicional 3.2.13. Repetição Condicional
Esta estrutura de controlo, de acordo com as suas variantes, permite a repetição duma instrução ou bloco de
instruções em ciclo, em função do resultado do teste a uma dada condição feito em cada ciclo, no início ou no fim
de cada iteração.
Esta estrutura de controlo, de acordo com as suas variantes, permite a repetição duma instrução ou bloco de
instruções em ciclo, em função do resultado do teste a uma dada condição feito em cada ciclo, no início ou no fim
de cada iteração.
Teste no início - o teste à condição é realizado antes da execução de qualquer instrução contida numa
estrutura de controlo destas.
Teste no fim - o teste à condição é realizado depois de cada instrução contida numa estrutura de controlo
destas ter sido executada, de forma a verificar se se deve avançar para outra iteração.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.13.1. Do …. Loop3.2.13.1. Do …. Loop
Esta variante não tem nenhum teste a uma condição, que possa conduzir ao fim da execução repetitiva da instrução ou bloco de instruções contidas no ciclo. Para suspender a execução numa estrutura de controlo deste tipo, entre as instruções deve existir a instrução Exit Do: força a saída do ciclo.
Esta variante não tem nenhum teste a uma condição, que possa conduzir ao fim da execução repetitiva da instrução ou bloco de instruções contidas no ciclo. Para suspender a execução numa estrutura de controlo deste tipo, entre as instruções deve existir a instrução ExitExit DoDo: força a saída do ciclo.
Sintaxe:Do
Instrução ou bloco de instruçõ
es
Loop
Exemplo
Descrição Algorítmica
( )∑=
+=N
iiS
112
1
…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: REPETIR
SE termo > 0,001 ENTÃOs s+termoi i+1termo 1/(2(n+1))
SENÃOSair do ciclo
FIM SEFIM REPETIR...
…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: REPETIRREPETIR
SESE termo > 0,001 ENTÃOENTÃOs s+termoi i+1termo 1/(2(n+1))
SENÃOSENÃOSair do cicloSair do ciclo
FIM SEFIM SEFIM REPETIRFIM REPETIR...
Somar até que o termo sejainferior a 0,001.
Codificação VBA
Nota: esta variante é raramente utilizada.Nota: esta variante é raramente utilizada.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.13.2. Do While Condição …. Loop3.2.13.2. Do While Condição …. Loop
Esta variante faz o teste duma condição antes de executar a instrução ou bloco de instruções presentes no ciclo, significando: “Enquanto a condição for verdadeira, executar a instrução ou instruções no ciclo”. Se a condição for “False”no início, a instrução ou o bloco de instruções do ciclo nunca serão executadas.
Esta variante faz o teste duma condição antes de executar a instrução ou bloco de instruções presentes no ciclo, significando: “Enquanto a condição for verdadeira, executar a instrução ou instruções no ciclo”. Se a condição for “False”no início, a instrução ou o bloco de instruções do ciclo nunca serão executadas.
Sintaxe:Do While Condição
Instrução ou bloco de instruçõ
es
LoopExemplo
( )∑=
+=N
iiS
112
1
…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: ENQUANTO termo > 0,001
s s+termoi i+1termo 1/(2(n+1))
FIM ENQUANTO...
…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: ENQUANTO ENQUANTO termo > 0,001
s s+termoi i+1termo 1/(2(n+1))
FIM ENQUANTOFIM ENQUANTO...
Somar até que o termoseja inferior a 0,001.
Descrição Algorítmica Codificação VBA
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.13.3. Do …. Loop While Condição3.2.13.3. Do …. Loop While Condição
Esta variante faz o teste da condição no fim de executar pelo menos uma vez a instrução ou bloco de instruções presentes no ciclo, significando: “ Executar a instrução ou bloco de instruções enquanto a condição for verdadeira”. Se a condição for “False” no início, a instrução ou bloco de instruções serão executadas pelo menos uma vez.
Esta variante faz o teste da condição no fim de executar pelo menos uma vez a instrução ou bloco de instruções presentes no ciclo, significando: “ Executar a instrução ou bloco de instruções enquanto a condição for verdadeira”. Se a condição for “False” no início, a instrução ou bloco de instruções serão executadas pelo menos uma vez.
Sintaxe:Do
Instrução ou bloco de instruçõ
es
Loop While Condição
Exemplo( )∑
=+=
N
iiS
112
1
Descrição Algorítmica…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: REPETIR
s s+termoi i+1termo 1/(2(n+1))
ENQUANTO termo > 0,001...
…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: REPETIRREPETIR
s s+termoi i+1termo 1/(2(n+1))
ENQUANTO ENQUANTO termo > 0,001...
Somar até que o termoseja inferior a 0,001.
Codificação VBA
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.13.4. Do Until Condição …. Loop3.2.13.4. Do Until Condição …. Loop
Esta variante faz o teste da condição antes de executar a instrução ou o bloco de instruções presentes no ciclo, significando: “ Até que a condição seja verdadeira executar a instrução ou o bloco de instruções”. Se a condição for “True”logo no início, a instrução ou o bloco de instruções nunca serão executadas.
Esta variante faz o teste da condição antes de executar a instrução ou o bloco de instruções presentes no ciclo, significando: “ Até que a condição seja verdadeira executar a instrução ou o bloco de instruções”. Se a condição for “True”logo no início, a instrução ou o bloco de instruções nunca serão executadas.
Sintaxe:Do Until Condição
Instrução ou bloco de instruçõ
es
Loop
Exemplo( )∑
=+=
N
iiS
112
1
Descrição Algorítmica…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: REPETIR ATÉ termo <= 0,001
s s+termoi i+1termo 1/(2(n+1))
FIM REPETIR...
…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: REPETIR ATREPETIR ATÉÉ termo <= 0,001
s s+termoi i+1termo 1/(2(n+1))
FIM REPETIRFIM REPETIR...
Somar até que o termoseja inferior a 0,001.
Codificação VBA
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.2.13.5. Do …. Loop Until Condição3.2.13.5. Do …. Loop Until Condição
Esta variante faz o teste da condição no fim de executar pelo menos uma vez a instrução ou bloco de instruções presentes no ciclo, significando: “ Executar a instrução ou bloco de instruções até que a condição seja verdadeira”. Se a condição for “True” no início, a instrução ou bloco de instruções serão executadas pelo menos uma vez.
Esta variante faz o teste da condição no fim de executar pelo menos uma vez a instrução ou bloco de instruções presentes no ciclo, significando: “ Executar a instrução ou bloco de instruções até que a condição seja verdadeira”. Se a condição for “True” no início, a instrução ou bloco de instruções serão executadas pelo menos uma vez.
Sintaxe:Do
Instrução ou bloco de instruçõ
es
Loop Until Condição
Exemplo( )∑
=+=
N
iiS
112
1
Descrição Algorítmica…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: REPETIR
s s+termoi i+1termo 1/(2(n+1))
ATÉ termo <= 0,001...
…Inst.1: i 1Inst.2: s 0Inst.3: termo 1/(2(n+1))Inst.4: REPETIRREPETIR
s s+termoi i+1termo 1/(2(n+1))
ATATÉÉ termo <= 0,001...
Somar até que o termoseja inferior a 0,001.
Codificação VBA
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.3. Programação estruturada3.3. Programa3.3. Programaçção estruturadaão estruturada
3.3.1. Estrutura dum programa3.3.1. Estrutura dum programa
Um programa em VBA, corresponde a um conjunto de instruções codificadas, as quais podem estar “concentradas” apenas num procedimento, ou ser distribuídas por vários procedimentos, relacionados entre si. A esta distribuição das instruções codificadas, por vários procedimentos (Sub … End Sub e Function … End
Function), tal como vimos na secção 3.2.3.2), correspondendo à divisão sucessiva da tarefa principal em
tarefas mais elementares, dá-se o nome de programação estruturada.
Um programa em VBA, corresponde a um conjunto de instruções codificadas, as quais podem estar “concentradas” apenas num procedimento, ou ser distribuídas por vários procedimentos, relacionados entre si. A esta distribuição das instruções codificadas, por vários procedimentos (SubSub … EndEnd SubSub e FunctionFunction … EndEnd
FunctionFunction), tal como vimos na secção 3.2.3.2), correspondendo à divisão sucessiva da tarefa principal em
tarefas mais elementares, dá-se o nome de programaprogramaçção estruturadaão estruturada.
Programa num sóProcedimento
Bloco de código
Bloco de código
Procedimento A com o Bloco de código
Procedimento Bcom o Bloco de código
Procedimento Principal
Chamada aos procedimentos A e B
Programação estruturada
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Algumas considerações em relação à programação estruturada:
Existe um procedimento que podemos designar por “procedimento principal”, sendo os restantes
procedimentos definidos à parte;
Existe um procedimento que podemos designar por “procedimento principal”, sendo os restantes
procedimentos definidos à parte;
O “procedimento principal”, além de executar as instruções próprias, chama também os outros
procedimentos, os quais executam outras instruções;
O “procedimento principal”, além de executar as instruções próprias, chama também os outros
procedimentos, os quais executam outras instruções;
Cada um dos outros procedimentos, pode chamar outros procedimentos;Cada um dos outros procedimentos, pode chamar outros procedimentos;
Para que haja comunicação entre os procedimentos é necessário que recebam valores ou variáveis, na
forma de argumentos e/ou devolvam valores quando terminam a respectiva execução.
Para que haja comunicação entre os procedimentos é necessário que recebam valores ou variáveis, na
forma de argumentos e/ou devolvam valores quando terminam a respectiva execução.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Exemplo
Programação não estruturada
Programação estruturada
Declaração dos argumentos
Passagem de argumentos
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.3.2. Definição e chamada de Procedimentos3.3.2. Definição e chamada de Procedimentos
Definição - trata-se da codificação das instruções a executar, quando o procedimento for executado (i.e.:
quando for chamado).
Chamada - trata-se do pedido para que um dado procedimento seja executado a partir de outro, e para que o
controlo de execução passe para as instruções codificadas, que constituem a definição do procedimento.
Algumas considerações:
Um procedimento tem apenas uma definição, mas pode ser chamado (por outros) tantas vezes quantas as
necessárias.
Um procedimento tem apenas uma definição, mas pode ser chamado (por outros) tantas vezes quantas as
necessárias.
Sempre que se chamar um determinado procedimento, tem-se que lhe passar todos os argumentos, que
esse estiver à espera (i.e.: os argumentos declarados na definição, desde que não sejam opcionais).
Sempre que se chamar um determinado procedimento, tem-se que lhe passar todos os argumentos, que
esse estiver à espera (i.e.: os argumentos declarados na definição, desde que não sejam opcionais).
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.3.3. Argumentos3.3.3. Argumentos
Sintaxe de declaração
Nome_argumento_1 As Tipo_argumento_1,...Nome_argumento_1 As Tipo_argumento_1,...
Exemplo: Procedimento que recebe dois
valores do tipo inteiro e calcula a
soma e a subtracção Os argumentos declarados passam a funcionar dentro do procedimento como variáveis.
Este procedimento (Adi_Sub) não pode ser executado só por si, funciona apenas quando lhe forem passados 2 argumentos, tendo por isso de ser chamado a partir dum outro procedimento, que lhepasse os valores.
No que diz respeito aos argumentos temos, que considerar a forma como esse são declarados na definição dum procedimento, e como esses serão fornecidos em cada uma das chamadas, ao respectivo procedimento.
No que diz respeito aos argumentosargumentos temos, que considerar a forma como esse são declarados na definição dum procedimento, e como esses serão fornecidos em cada uma das chamadas, ao respectivo procedimento.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Chamada
Exemplo
Na chamada a um procedimento, indicamos o seu nome seguido da lista de valores correspondentes a cada um dos argumentos, separados por vírgulas.
Na chamada a um procedimento, indicamos o seu nome seguido da lista de valores correspondentes a cada um dos argumentos, separados por vírgulas.
Chamada Definição
x x1y x2
Não existe, nenhuma relação directa entre o nome dos argumentos do procedimento que é chamado e o nome dos argumentos usados na sua chamada.
Podemos passar também, além de variáveis, expressões (desde que o seu tipo seja compatível com o tipo do argumento do procedimento chamado.
Deve-se ter em atenção a ordem pela qual os argumentos são passados. Neste caso os resultados serão naturalmente diferentes.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.3.4. Chamada de procedimentos3.3.4. Chamada de procedimentos
3.3.4.1. Regras para a utilização de parêntesis3.3.4.1. Regras para a utilização de parêntesis
Entende-se por “chamada” a um procedimento o acto de o invocar (dentro de um outro qualquer procedimento). A chamada pode envolver a passagem de argumentos e eventualmente a devolução de um valor (no caso de Function … End Function).
Entende-se por “chamada” a um procedimento o acto de o invocar (dentro de um outro qualquer procedimento). A chamada pode envolver a passagem de argumentos e eventualmente a devolução de um valor (no caso de
FunctionFunction …… EndEnd FunctionFunction).
A ter em atenção:
Adi_Sub x,y e não Adi_Sub(x,y)
Contudo:str=InputBox(“
Escreva algo:”) e não str=InputBox “Escreva algo:
”
E noutras situações é possível:
MsgBox (“Vamos programar”) e também
MsgBox “Vamos programar”
Nota: a utilização de parêntesis (envolvendo os argumentos) nas chamadas aos procedimentos, depende por um lado do n.º de
argumentos, e por outro do contexto em que as chamadas ocorrem.
Nota: a utilização de parêntesis (envolvendo os argumentos) nas chamadas aos procedimentos, depende por um lado do n.º de
argumentos, e por outro do contexto em que as chamadas ocorrem.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Contextos
Utilização correcta de parêntesis, em qualquer contexto
1- um procedimento é chamado simplesmente (com os seus argumentos)
2- um procedimento enquadra-se numa atribuição (caso de FunctionFunction … EndEnd FunctionFunction)
3- um procedimento é chamado usando a instrução CallCall ou serve ele próprio, de argumento a outro (caso de FunctionFunction … EndEnd FunctionFunction)
Adi_Sub 5,7
Res = Fun_Sen(x)
Call Adi_Sub(5,7)
Adi_Sub 6,Fun_Sen(x)
Procedimentos com 1 ou mais argumentos
Procedimentos sem argumentos
Usar parêntesis Se e Só Sea chamada se encontrar numa atribuição ou se estiver a servir de argumento ao Call ou a um outro procedimento.
Não usar parêntesis
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.3.5. Passagem de argumentos3.3.5. Passagem de argumentos
Exemplo
Quando se passam argumentos a um procedimento, o VBA vai adequar cada um desses, aos que se encontram
descritos na definição do procedimento, respeitando a ordem pela qual os argumentos são apresentados: o
primeiro argumento declarado na definição do procedimento toma o valor do primeiro argumento apresentado na
chamada; o segundo vai tomar o valor do segundo; e assim sucessivamente.
Quando se passam argumentos a um procedimento, o VBA vai adequar cada um desses, aos que se encontram
descritos na definição do procedimento, respeitando a ordem pela qual os argumentos são apresentados: o
primeiro argumento declarado na definição do procedimento toma o valor do primeiro argumento apresentado na
chamada; o segundo vai tomar o valor do segundo; e assim sucessivamente.
Definição do procedimento
Chamada dentro de outro procedimento
Sub Proc_Exemplo (v As Single, Msg_1 As String, Msg_2
As String)
Instrução ou bloco de instru
ções
End Sub
Sub Proc_Principal()
Dim str as String
str= “Boa Tarde”
Proc_Exemplo 2.7, str, “Boa Noite”
Outra Instrução ou bloco de
instruções
End Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Sub Proc_Principal()
Dim str as String
str= “Boa Tarde”
Proc_Exemplo v:=2.7, Msg_1:=str, Msg_2:=“
Boa Noite”
Outra Instrução ou bloco de
instruções
End Sub
3.3.5.1. Argumentos nomeados3.3.5.1. Argumentos nomeados
Exemplo
No VBA é possível explicitar exactamente a que argumento da definição do procedimento, se refere cada um dos
argumentos da chamada, através da sua nomeação.
No VBA é possível explicitar exactamente a que argumento da definição do procedimento, se refere cada um dos
argumentos da chamada, através da sua nomeanomeaççãoão.
Sintaxe
Nome_argumento_1:= valor,….Nome_argumento_1:= valor,….
Chamada do procedimento Proc_Exemplo (ver secção 3.3.5) dentro de outro procedimento
Argumentos nomeados
Proc_Exemplo Msg_1:=str, Msg_2:=“Boa Noit
e”, v:=2.7
Graças aos argumentos nomeados, podemos alterar a ordem dos argumentos. Por outro lado, podem-se também, combinar argumentos não nomeados com argumentos nomeados, devendo surgir em primeiro lugar os não nomeados.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.3.5.2. Argumentos opcionais3.3.5.2. Argumentos opcionais
Exemplo de utilização: MsgBox
Entende-se por argumento opcional, o que não necessita de ser contemplado nas chamadas ao respectivo procedimento. A declaração de argumentos opcionais está relacionada com a existência de valores por defeito (defaults).
Entende-se por argumento opcionalargumento opcional, o que não necessita de ser contemplado nas chamadas ao respectivo procedimento. A declaração de argumentos opcionaisargumentos opcionais está relacionada com a existência de valores por defeito (defaults).
MsgBox “Olá a todos”
MsgBox “Olá a todos”, Title:= “Um outro Titl
o”
A função MsgBox tem 5 argumentos; 4 desses são opcionais, sendo apenas obrigatório o argumento referente à
mensagem. Entre os argumentos opcionais, conta-se o Title (permite controlar o titlo na barra superior da caixa
de diálogo), cujo o valor por defeito é “Microsoft Excel”.
A função MsgBoxMsgBox tem 5 argumentos; 4 desses são opcionais, sendo apenas obrigatório o argumento referente à
mensagem. Entre os argumentos opcionais, conta-se o TitleTitle (permite controlar o titlo na barra superior da caixa
de diálogo), cujo o valor por defeito é “Microsoft Excel”.
Nota: uma vez que o argumento Title não é o 2.º argumento, temos que o nomear para que o
VBA, conheça esse argumento como sendo, a que queremos atribuir um valor.
Nota: uma vez que o argumento TitleTitle não é o 2.º argumento, temos que o nomear para que o
VBA, conheça esse argumento como sendo, a que queremos atribuir um valor.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Declaração de argumentos opcionais
Exemplo
Quando se define um procedimento, para que um argumento seja opcional é necessário:
1- escrever a palavra reservada OptionalOptional no início do argumento;
2- que os argumentos opcionais sejam os últimos da lista de argumentos, para que sejamos obrigados a nomear todos os argumentos que surjam depois do primeiro argumento opcional;
3- que os argumentos opcionais sejam do tipo VariantVariant.
A função IsMissing permite detectar (em tempo de execução) se um determinado argumento foi ou não de facto passado ao procedimento: Devolve “True” se o argumento em causa não tiver sido passado, senão devolve “False”.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.3.5.3. Argumentos passados por valor ou por referência3.3.5.3. Argumentos passados por valor ou por referência
- Argumentos alterados dentro dum procedimento
- Argumentos não alterados dentro dum procedimento
No que diz respeito aos argumentos passados na chamada dum procedimento, existem duas possibilidades: os
argumentos da chamada são alteráveis dentro dum procedimento ou os argumentos da chamada não são
alteráveis dentro do procedimento.
No que diz respeito aos argumentos passados na chamada dum procedimento, existem duas possibilidades: os
argumentos da chamada são alteráveis dentro dum procedimento ou os argumentos da chamada não são
alteráveis dentro do procedimento.
Nesta situação, os argumentos têm de ser passados por referência, o que implica a passagem duma referência
(posição na memória) para o argumento original. As alterações realizadas nessa referência irão ter reflexo no
argumento referido.
Neste caso, os argumentos são passados por valor, correspondendo à passagem duma cópia do valor do
argumento apresentado na chamada do respectivo procedimento, para o argumento declarado na definição do
procedimento. Qualquer alteração estará confinada à cópia efectuada, e nunca ao argumento original.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
SintaxesReferência
Valor
Exemplo
- Quando o argumento deve ser passado por referência, usa-se a palavra reservada ByRefByRef a anteceder a sua declaração.
- Quando o argumento deve ser passado por valor, usa-se a palavra reservada ByValByVal a anteceder a sua declaração.
Nota: Por defeito o VBA, efectua a passagem de argumentos por referência (quando não se indica ByRef nem ByVal, assume-se ByRef). Por defeito as variáveis passadas a um procedimento, sujeitam-se a alterações no seu conteúdo.
Nota: Por defeito o VBA, efectua a passagem de argumentos por referência (quando não se indica ByRefByRef nem ByValByVal, assume-se ByRefByRef). Por defeito as variáveis passadas a um procedimento, sujeitam-se a alterações no seu conteúdo.
Sub Proc_Exemplo_Val_Ref(ByVal x As Integer, ByVal
y As Integer)
x=10
y=4
End Sub
Sub Proc_Test()
Dim A As Integer, B AsInteger
A=0:B=2
Proc_Exemplo_Val_Ref A,B
End Sub
Após a execução de Proc_Exemplo_Val_Ref:
•A tem o valor 0•B tem o valor 2
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4. Tópicos avançados3.4. T3.4. Tóópicos avanpicos avanççadosados
3.4.1. Âmbito das variáveis3.4.1. Âmbito das variáveis
Entende-se por âmbito (ou visibilidade) de uma variável, o local onde esta pode ser “reconhecida”. Em VBA,
podem-se identificar 3 âmbitos distintos:
Entende-se por âmbito (ou visibilidade) de uma variável, o local onde esta pode ser “reconhecida”. Em VBA,
podem-se identificar 3 âmbitos distintos:
-- NNíível do procedimentovel do procedimento
-- NNíível do mvel do móódulodulo
-- NNíível do livrovel do livro
LivroLivroMMóódulodulo
ProcedimentoProcedimento
ProcedimentoProcedimento
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.1.1. Nível do Procedimento3.4.1.1. Nível do Procedimento
3.4.1.2. Nível do Módulo3.4.1.2. Nível do Módulo
3.4.1.3. Nível do Livro3.4.1.3. Nível do Livro
As variáveis declaradas dentro dum procedimento, têm como âmbito o próprio procedimento, sendo por isso apenas reconhecidas dentro desse. A estas variáveis é normal atribuir-se a designação de variáveis locais (ao procedimento).
As variáveis declaradas dentro dum procedimento, têm como âmbito o próprio procedimento, sendo por isso apenas reconhecidas dentro desse. A estas variáveis é normal atribuir-se a designação de variáveis locais (ao procedimento).
Para que as variáveis tenham um âmbito ao nível do módulo, a sua declaração deve realizar-se dentro desse e fora de qualquer procedimento. As variáveis com este âmbito são visíveis em todo o módulo e em todos os procedimentos definidos nesse. A estas variáveis atribui-se normalmente a designação de variáveis globais (ao módulo).
Para que as variáveis tenham um âmbito ao nível do módulo, a sua declaração deve realizar-se dentro desse e fora de qualquer procedimento. As variáveis com este âmbito são visíveis em todo o módulo e em todos os procedimentos definidos nesse. A estas variáveis atribui-se normalmente a designação de variáveis globais (ao módulo).
O âmbito destas variáveis corresponde a todo o livro (workbook). Para que uma variável possa adquirir este âmbito, esta deve ser declarada num dos módulos, utilizando a palavra reservada Public (que significa que a
variável é pública em todos os módulos do livro), e pode-se dizer que a variável é global ao livro.
O âmbito destas variáveis corresponde a todo o livro (workbook). Para que uma variável possa adquirir este âmbito, esta deve ser declarada num dos módulos, utilizando a palavra reservada PublicPublic (que significa que a
variável é pública em todos os módulos do livro), e pode-se dizer que a variável é global ao livro.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.1.4. Exemplo3.4.1.4. Exemplo
Public x As IntegerDim y As Integer...
Sub Proc_1()Dim u As Integer
...
End Sub...
Sub Proc_2(z As Integer)Dim v As Integer...
End Sub...
Sub Proc_3()Dim x As Integer
...
End Sub...
Sub Proc_4(x As Integer)...
End Sub
MMóódulodulo
A variável x é visível não só em todo o módulo (portanto em todos os procedimento do módulo), como em todos os outros módulos (portanto também em todos os procedimentos).
A variável y é visível em todo o módulo, sendo por isso também visível em Proc_1, Proc_2, Proc_3 e Proc_4, pelo que pode ser lá utilizada.
A variável u é visível apenas dentro do procedimento Proc_1, não podendo por exemplo ser invocada no Proc_2.
A variáveis z e v são visíveis, apenas dentro do procedimento Proc_2.
Dentro do procedimento Proc_3, quando tivermos que usar a variável x, estaremos a referir-nos à sua variável x.
Dentro do procedimento Proc_4, quando falarmos de x, estamos a referir-nos ao argumento x. Neste caso não podemos criar uma variável x dentro deste procedimento, porque entraríamos em conflito com o argumento x (ambos com o mesmo âmbito).
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.2. Tempo de vida das variáveis3.4.2. Tempo de vida das variáveis
3.4.2.1. Variável declarada ao nível dum dado módulo 3.4.2.1. Variável declarada ao nível dum dado módulo
3.4.2.2. Variável declarada ao nível dum dado procedimento 3.4.2.2. Variável declarada ao nível dum dado procedimento
O tempo de vida das variáveis, está relacionado com o respectivo âmbito de visibilidade.O tempo de vida das variáveis, está relacionado com o respectivo âmbito de visibilidade.
Nesta situação, a variável está sempre activa pelo que se o seu valor sofrer alterações (devido à execução das instruções de algum dos procedimentos do módulo), essas serão sempre preservadas. As alterações só serão perdidas se reeditarmos o módulo, se fizermos a sua reinicializarão (RESET) ou se sairmos do EXCEL e voltarmos a entrar.
Nesta situação, a variável está sempre activa pelo que se o seu valor sofrer alterações (devido à execução das instruções de algum dos procedimentos do módulo), essas serão sempre preservadas. As alterações só serão perdidas se reeditarmos o módulo, se fizermos a sua reinicializarão (RESET) ou se sairmos do EXCEL e voltarmos a entrar.
Qualquer variável nesta situação, é criada quando o procedimento é invocado e morre quando este finaliza a sua execução. Se o procedimento for chamado várias vezes, uma variável é criada e morre, cada vez que este éexecutado.
Por esta razão, nem sempre é possível guardar numa variável declarada dentro dum procedimento, um valor a usar numa sua futura execução. Para que isso seja possível, utiliza-se a palavra reservada Static em vez de
Dim, tornando a variável estática.
Qualquer variável nesta situação, é criada quando o procedimento é invocado e morre quando este finaliza a sua execução. Se o procedimento for chamado várias vezes, uma variável é criada e morre, cada vez que este éexecutado.
Por esta razão, nem sempre é possível guardar numa variável declarada dentro dum procedimento, um valor a usar numa sua futura execução. Para que isso seja possível, utiliza-se a palavra reservada StaticStatic em vez de
DimDim, tornando a variável estática.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.2.3. Exemplo 3.4.2.3. Exemplo
Dim j As Integer...
Sub Proc_Dur_Var()Dim i As IntegerStatic K As Integer
j=0:i=0:k=0i=i+1j=j+1k=k+1MsgBox “O valor de i é “ &iMsgBox “O valor de j é “ &jMsgBox “O valor de k é “ &kEnd Sub
MMóóduloduloÂmbito do MóduloÂmbito do Módulo
Âmbito do ProcedimentoÂmbito do Procedimento
Variável estáticaVariável estática
Uma vez que ii tem o âmbito do procedimento, sempre que se executar este procedimento, o seu valor será sempre 11.
Uma vez que jj tem o âmbito do módulo, sempre que se executar este procedimento, o seu valor será incrementado em 11 unidade.
Uma vez que kk é uma variável estática, sempre que executarmos o procedimento, o seu valor será incrementado em 11 unidade.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.3. Conversões entre tipos de dados3.4.3. Conversões entre tipos de dados
3.4.3.1. Implícitas (automáticas)3.4.3.1. Implícitas (automáticas)
Tal como vimos na secção 3.2.2.1., o tipo de dados que uma variável pode conter, está condicionado pelo tipo com que esta foi declarada. Porém, existe a possibilidade de converter valores dum determinado tipo de dados para um outro tipo.
Tal como vimos na secção 3.2.2.1., o tipo de dados que uma variável pode conter, está condicionado pelo tipo com que esta foi declarada. Porém, existe a possibilidade de converter valores dum determinado tipo de dados para um outro tipo.
O VBA pode levar a cabo algumas conversões, quando atribuímos a uma variável dum determinado tipo de dados, um valor dum outro tipo de dados: conversões implícitas. Entre as várias conversões, salientam-se as seguintes:
O VBA pode levar a cabo algumas conversões, quando atribuímos a uma variável dum determinado tipo de dados, um valor dum outro tipo de dados: conversões implícitas. Entre as várias conversões, salientam-se as seguintes:
- Conversões entre tipos numéricos
- Conversões entre tipos numéricos e tipo String
- Conversões de/para o tipo Variant
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO A conversão de valores entre tipos numéricos é em geral possível, apesar de implicar em alguns casos a perda de
informação.
A conversão de valores entre tipos numéricos é em geral possível, apesar de implicar em alguns casos a perda de informação.
Conversão: inteiro (IntegerInteger ou LongLong) → real (SingleSingle ou DoubleDouble)
3.4.3.2. Conversões entre tipos numéricos 3.4.3.2. Conversões entre tipos numéricos
Conversão: real (SingleSingle ou DoubleDouble) → inteiro (IntegerInteger ou LongLong)
Dim i As Integer, d As Double
i=4
d=i ‘ d passa a valer 4
d=5 ‘ d passa a valer 5
Nota: esta conversão é sempre válida.Nota: esta conversão é sempre válida.
Dim i As Integer, d As Double
d=4.0
i=d ‘ i passa a valer 4
i=5.0 ‘ i passa a valer 5
d=6.3
i=d ‘ i passa a valer 6
i=7.9 ‘ i passa a valer 8
Nota: embora possível esta conversão pode não ser válida.
A conversão dum número real para um inteiro, implica um arredondamento, pelo que o valor que ficará na variável do tipo inteiro não será o mesmo, que lhe foi atribuído.
Nota: embora possível esta conversão pode não ser válida.
A conversão dum número real para um inteiro, implica um arredondamento, pelo que o valor que ficará na variável do tipo inteiro não será o mesmo, que lhe foi atribuído.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.3.3. Conversões entre tipos numéricos e tipo String3.4.3.3. Conversões entre tipos numéricos e tipo String
3.4.3.4. Conversões de/para o tipo Variant3.4.3.4. Conversões de/para o tipo Variant
Dim i As Integer, d As Double, s
As String
i=4
s=i ‘Impossível:dáerro!
s=5 ‘Impossível:dáerro!
s=“4”
i=s ‘Impossível:dáerro!
i=“5” ‘Impossível:dáerro!
Nota: não podemos converter directamente um valor do tipo String em nenhum tipo numérico, nem vice-versa.
Nota: não podemos converter directamente um valor do tipo StringString em nenhum tipo numérico, nem vice-versa.
Dim i As Integer, d As Double, s
As String, v As Variant
v=i:v=d:v=s:v=4
i=v ‘ i passa a valer 4
s=v ‘ s passa a valer “4”
d=v ‘ d passa a valer 4
v=5.3i=v ‘ i passa a vale
r 5 (arredondado)
s=v ‘ s passa a valer “5,3”
d=v ‘ d passa a valer 5.3
v=“5.3”i=v ‘ i passa a vale
r 5 (arredondado)
s=v ‘ s passa a valer “5.3”
d=v ‘ d passa a valer 5.3
v=“olá”i=v ‘ Impossível: dá
erro!
s=v ‘ s passa a valer “olá”
d=v ‘ Impossível: dáerro!
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO • qualquer valor de qualquer tipo, pode ser convertido para o tipo VariantVariant;
• qualquer valor do tipo VariantVariant pode ser convertido no tipo StringString;
• um valor do tipo VariantVariant pode ser convertido num tipo numérico, desde que se possa encontrar um equivalente numérico;
• a conversão para um tipo numérico inteiro (IntegerInteger ou LongLong) está sujeita a arredondamentos.
3.4.3.5. Aspectos a ter em conta nas conversões implícitas3.4.3.5. Aspectos a ter em conta nas conversões implícitas
Regra empírica de conversão VariantVariant
IntegerIntegerLongLongSingleSingleDoubleDouble
StringString
Repare que: embora não se possam efectuar conversões directas entre tipo String ←→ tipos numéricos, ambos podem ser convertidos de/para o tipo Variant.
Para o efeito, podemos usar uma variável auxiliar do tipo Variant, como uma “ponte” entre o tipo String e os tipos numéricos (Integer, Long, Single ou Double).
Repare que: embora não se possam efectuar conversões directas entre tipo StringString ←→ tipos numéricos, ambos podem ser convertidos de/para o tipo VariantVariant.
Para o efeito, podemos usar uma variável auxiliar do tipo VariantVariant, como uma “ponte” entre o tipo StringString e os tipos numéricos (IntegerInteger, LongLong, SingleSingle ou DoubleDouble).
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Nome da FunNome da Funççãoão ConversãoConversãode para
AscAsc StringString Código ASCIICBoolCBool numérico BooleanBooleanCcurCcur numérico CurrencyCurrencyCdateCdate StringString DateDateCDblCDbl numérico ou StringString DoubleDoubleCIntCInt numérico ou StringString IntegerIntegerCLngCLng numérico ou StringString LongLongCSngCSng numérico ou StringString SingleSingleCStrCStr numérico ou StringString StringStringCVarCVar numérico ou StringString VariantVariantStrStr numérico StringStringValVal StringString NumNumééricoricoChrChr Código ASCII StringString
3.4.3.6. Explícitas (funções de conversão)3.4.3.6. Explícitas (funções de conversão)
Tabela de funções de conversão
No VBA existem funções de conversão criadas explicitamente, para permitirem a conversão dos valores entre os diferentes tipos de dados.
No VBA existem funções de conversão criadas explicitamente, para permitirem a conversão dos valores entre os diferentes tipos de dados.
ExemploDim i As Integer,
Dim s As String
...
i=CInt(4.3)
s=CStr(“olá”)
...
...
i=Cint(“4.3”)
S=CStr(65)
...
Utilização redundanteUtilização redundante
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.4. Tipos de dados definidos pelo utilizador3.4.4. Tipos de dados definidos pelo utilizador
Sintaxe de definição
Algumas considerações:
Type Nome_do_Novo_TipoNome_do_Campo_1 ou Nome_do_Array_1 As Tipo_1Nome_do_Campo_2 ou Nome_do_Array_2 As Tipo_2...Nome do Campo_N ou Nome_do_Array_N As Tipo_N
End Type
Type Nome_do_Novo_TipoNome_do_Campo_1 ou Nome_do_Array_1 As Tipo_1Nome_do_Campo_2 ou Nome_do_Array_2 As Tipo_2...Nome do Campo_N ou Nome_do_Array_N As Tipo_N
End Type
No VBA, além dos tipos de dados apresentados numa das secções anteriores, é possível ao utilizador definir os seus próprios tipos de dados, com base nos anteriores.
No VBA, além dos tipos de dados apresentados numa das secções anteriores, é possível ao utilizador definir os seus próprios tipos de dados, com base nos anteriores.
A definição de novos tipos de dados deve ser feita num módulo, fora de qualquer procedimento.A definição de novos tipos de dados deve ser feita num módulo, fora de qualquer procedimento.
Na sintaxe de definição, os Tipo_1, Tipo_2, …e Tipo_N podem ser um tipo de dados do VBA, ou um
outro tipo definido anteriormente, também pelo utilizador.
Na sintaxe de definição, os Tipo_1, Tipo_2, …e Tipo_N podem ser um tipo de dados do VBA, ou um
outro tipo definido anteriormente, também pelo utilizador.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Alguns exemplos Exemplo 1 Criação dum Tipo de Dados, responsável por guardar um ponto no espaço 3D (X,Y,Z)
Para nos referirmos aos campos duma variável dum tipo definido pelo utilizador, indicamos o nome dessa variável seguido por um ponto e pelo nome do campo.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Exemplo 2
X
Z
Y
A=(3,2,3)
O=(1,1,1)
Segmento OAO = (1,1,1)A = (3,2,3)cor = verdetraço = 2
Segmento OAO = (1,1,1)A = (3,2,3)cor = verdetraço = 2
Ponto OPonto O
Ponto APonto A
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Exemplo 3
X
Z
Y
A=(3,2,3)
O=(1,1,1)
Segmento OAO = (1,1,1)A = (3,2,3)cor = verdetraço = 2
Segmento OAO = (1,1,1)A = (3,2,3)cor = verdetraço = 2
Ponto OPonto O
Ponto APonto A
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Algumas considerações:
Podemos também declarar Arrays de tipos definidos pelo utilizador.Podemos também declarar Arrays de tipos definidos pelo utilizador.
Dim Alguns_Segmentos (1 To 5) As Segmento_A
Dim Mais_Segmentos (1 To 10) As Segmento_B
...Alguns_Segment
os(3).cor = “vermelho”
...Mais_Segmentos
(6).extremo(1).x = 2
...
Podem-se efectuar atribuições entre variáveis (ou campos) do mesmo tipo de dados definido pelo utilizador, encarregando-se o VBA de fazer a cópia dos valores campo a campo.
Podem-se efectuar atribuições entre variáveis (ou campos) do mesmo tipo de dados definido pelo utilizador, encarregando-se o VBA de fazer a cópia dos valores campo a campo.
Dim ponto_O As Ponto3D, ponto_A
As Ponto3D
Dim SegOA As Segmento_A
...ponto_O = pont
o_A
...SegOA.origem = ponto_A
Esta instrução é equivalente às instruções:ponto_O.x = ponto_A.x
ponto_O.y = ponto_A.y
ponto_O.z = ponto_A.z
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.4.1. With … End With3.4.4.1. With … End With
Sintaxe
Exemplo
Preenchimento e visualização dos elementos (Nome, Número e Notas) duma lista telefónica.
With Variável.Nome_do_Campo_1 .Nome_do_Campo_2 ....Nome do Campo_N
End With
With Variável.Nome_do_Campo_1 .Nome_do_Campo_2 ....Nome do Campo_N
End With
Exemplo de utilizaçãoExemplo de utilização
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.5. Recursividade3.4.5. Recursividade
Solução não recursiva
A possibilidade de um procedimento poder chamar-se a si próprio, designa-se por recursividade. A sua explicação, será mais explícita se tomarmos como exemplo:
A possibilidade de um procedimento poder chamar-se a si próprio, designa-se por recursividade. A sua explicação, será mais explícita se tomarmos como exemplo:
CÁLCULO DO FACTORIAL DE N : N!
Factorial(
N) = N×(N-
1)×(N-2) ×
… × 1
1
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Solução recursiva
1N
1N
se1)NFactorial(N
se1N)Factorial(
><=
−×=
N=4 N=3 N=2 N=1
(If…ThenFactorial_R(4)=Factorial_R(3)*4
(If…ThenFactorial_R(3)=Factorial_R(2)*3(If…Then
Factorial_R(2)=Factorial_R(1)*2(If…Else
Factorial_R(1)=1
Supondo que N =4, testemos a solução recursiva:
4!=244!=24Nota: apesar das soluções recursivas serem mais elegantes, os programadores tendem a evitá-las, porque um sub-programa recursivo necessita de mais espaço (um conjunto completo de endereços de memória deve ser reservado, cada vez que um sub-programa se chama a si próprio) e é mais lento (devido às operações auxiliares de entrada e saída dum programa) do que um sub-programa não recursivo.
Nota: apesar das soluções recursivas serem mais elegantes, os programadores tendem a evitá-las, porque um sub-programa recursivo necessita de mais espaço (um conjunto completo de endereços de memória deve ser reservado, cada vez que um sub-programa se chama a si próprio) e é mais lento (devido às operações auxiliares de entrada e saída dum programa) do que um sub-programa não recursivo.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Exemplo Solução não recursiva Solução recursiva
Cálculo de Ak, onde A e k são números inteiros, com N > 0.
Potência (A,k) = A × A × A × … × A
N-1 multiplicações
1kse
1kse
k),Potência(AA
Ak),Potência(A
>=
×=
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.6. Arrays dinâmicos3.4.6. Arrays dinâmicos
3.4.6.1. Passos a seguir na utilização de arrays dinâmicos3.4.6.1. Passos a seguir na utilização de arrays dinâmicos
Em geral, quando temos um conjunto de valores dum determinado tipo de dados, sabemos à prióri o seu número. Contudo, o problema surge quando não sabemos (no momento da escrita do programa) o número de valores, e assim quantas células vão ser necessárias: neste caso o tamanho do array tem de ser decidido em tempo de execução (não em tempo de codificação).
A solução para estes casos reside na utilização de arrays dinâmicos, cujo o tamanho pode variar.
Em geral, quando temos um conjunto de valores dum determinado tipo de dados, sabemos à prióri o seu número. Contudo, o problema surge quando não sabemos (no momento da escrita do programa) o número de valores, e assim quantas células vão ser necessárias: neste caso o tamanho do array tem de ser decidido em tempo de execução (não em tempo de codificação).
A solução para estes casos reside na utilização de arraysarrays dinâmicosdinâmicos, cujo o tamanho pode variar.
1- declarar um array sem tamanho, não indicando a gama de índices, significando que este tem 0 células (qualquer tentativa de escrita numa célula, dará origem a um erro de execução);
Dim ArrayReDimensionavel () As Integer
2- redimensionar o array à medida das necessidades, usando a instrução ReDimReDim.
...ReDim ArrayReDimensionavel (4 To 6)...ReDim ArrayReDimensionavel (5 To 9)...
o array passa ter 3 célulaso array passa ter 3 células
o array passa ter 5 célulaso array passa ter 5 células
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.6.2. Palavra reservada: Perserve3.4.6.2. Palavra reservada: Perserve
Exemplificando
Cada vez que se faz o redimensionamento do array, da forma explicada atrás, perde-se o seu conteúdo. Porém, em geral queremos que o conteúdo do array seja preservado, cada vez que este é redimensionado: neste caso utiliza-se Preserve.
A utilização da palavra reservada Preserve, só permite a alteração do limite superior da gama de índices.
Cada vez que se faz o redimensionamento do array, da forma explicada atrás, perde-se o seu conteúdo. Porém, em geral queremos que o conteúdo do array seja preservado, cada vez que este é redimensionado: neste caso utiliza-se PreservePreserve.
A utilização da palavra reservada PreservePreserve, só permite a alteração do limite superior da gama de índices.
Dim OutroArrayRedim() As Integer
...ReDim OutroArrayRedi
m(4 To 6)
‘passa a ter 3 células (da 4
à 6): é a primeira vez, não precisa
de Preserve
...ReDim Preserve OutroArrayRedi
m(4 To 8)
‘agora passa a ter 5 células
(da 4 à 8): o seu conteúdo anterior
foi preservado
...ReDim Preserve OutroArrayRedi
m(4 To 7)
‘agora passa a ter 4 células
(da 4 à 7): o seu conteúdo anterior
foi preservado
...ReDim Preserve OutroArrayRedi
m(2 To 7)
‘Errado! Não se pode mexer n
o limite inferior, quando se
usa Preserve
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
Algumas considerações:
Nos arrays K-D (multi-dimensionais), se usarmos apenas ReDim podemos alterar não só as gamas de cada
uma das dimensões, como até mesmo o número de dimensões.
Nos arrays K-D (multi-dimensionais), se usarmos apenas ReDimReDim podemos alterar não só as gamas de cada
uma das dimensões, como até mesmo o número de dimensões.
Porém, se usarmos ReDim Preserve, tudo o que podemos fazer é alterar apenas o índice superior da
última dimensão.
Porém, se usarmos ReDimReDim PreservePreserve, tudo o que podemos fazer é alterar apenas o índice superior da
última dimensão.
Dim x() As Integer
...ReDim x(2 To 23, 34 To 36, 4 To 10)
...ReDim Preserve x(2 To 23, 34 To 36, 4 To 12)
...ReDim x(1 To 24, 32 To 39, 8 To 9, 1 To 3, 2 To 8)
...ReDim Preserve x(1 To 24, 32 To 39, 8 To 9, 1 To 3, 2 To 5)
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.4.6.3. Exemplo 3.4.6.3. Exemplo
Preenchimento da célula ido Array_Dados com um elemento do tipo Dados_Pessoais.
Inserção de mais uma célula no Array_Dados, preservando os valores contidos nas células já preenchidas.
Declaração dum array Array_Dados sem tamanho.
UBound (nome_array[dimensão])
Devolve o maior índice da célula do array disponível, para uma dada dimensão (por defeito o seu valor é 1).
Ex.: Dim A(1 To 100, 0 To 3, -3 To 4)UBound (A,1) é 100UBound (A,2) é 3UBound (A,3) é 4
LBound (nome_array[dimensão])
Devolve o menor índice da célula do array disponível, para uma dada dimensão (por defeito o seu valor é 1)
Ex.: Dim A(1 To 100, 0 To 3, -3 To 4)LBound (A,1) é 1LBound (A,2) é 0LBound (A,3) é -3
Criação da primeira célula no Array_Dados.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5. Manipulação de variáveis estruturadas: arrays3.5. Manipula3.5. Manipulaçção de varião de variááveis estruturadas: veis estruturadas: arraysarrays
3.5.1. Vectores: Array Unidimensional3.5.1. Vectores: Array Unidimensional
3.5.2. Operações básicas com vectores3.5.2. Operações básicas com vectores
VVV
Dim V(1 To 8) As Integer‘ Array unidimensional c/ 8 células, com valores inteiros
Dim V(1 To 8) As Integer‘ Array unidimensional c/ 8 células, com valores inteiros
V(1) V(8)1 2 3 4 5 6 7 8
- Leitura- Escrita- Máximo e mínimo e respectiva posição- Soma de todos os elementos- Média aritmética dos elementos- Troca de dois elementos
- Inversão- Permutação circular- Remoção dum elemento- Inserção dum novo elemento- Pesquisa dum elemento- Número de elementos repetidos- Ordenação : Bubble Sort
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.1. Leitura dum vector 3.5.2.1. Leitura dum vector
VVV1 2 3 4 5 N-2 N-1 N
? ? ? ? ? ? ? ?………….
Descrição Algorítmica Codificação VBA
…Para índice Desde 1 Até N Faz
ESCREVER (“Insira o elemento” &índice &”do vector”)
LER (v(índice))
Fim do Para
...
…Para índice Desde 1 Até N Faz
ESCREVER (“Insira o elemento” &índice &”do vector”)
LER (v(índice))
Fim do Para
...
Sub Ler_Vector(v()As Integer, ByVal N As Integer)Dim i As Integer
For i=1 To Nv(i)=CInt (InputBox(“Insira o elemento”&i))
Next iEnd Sub
Sub Ler_Vector(v()As Integer, ByVal N As Integer)Dim i As Integer
For i=1 To Nv(i)=CInt (InputBox(“Insira o elemento”&i))
Next iEnd Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.2. Escrita dum vector 3.5.2.2. Escrita dum vector
VVV1 2 3 4 5 N-2 N-1 N
5 7 4 5 1 9 5 3………….
Descrição Algorítmica Codificação VBA
…Para índice Desde 1 Até N Faz
ESCREVER (“v(” &índice &”)=“ &v(índice) &mdl)
Fim do Para
...
…Para índice Desde 1 Até N Faz
ESCREVER (“v(” &índice &”)=“ &v(índice) &mdl)
Fim do Para
...
Sub Escrever_Vector(v()As Integer, ByVal N As Integer)Dim i As Integer
For i=1 To NMsgBox “v(“ &i &”)=“ &v(i) &Chr(13)
Next iEnd Sub
Sub Escrever_Vector(v()As Integer, ByVal N As Integer)Dim i As Integer
For i=1 To NMsgBox “v(“ &i &”)=“ &v(i) &Chr(13)
Next iEnd Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
…Caso opção Tomevalor = “Máximo”: Faz
Aux ← v(1)Pos_aux ← 1Para índice Desde 2 Até N FazSe v(índice)>Aux Então
Aux ← v(índice)Pos_Aux ←índice
Fim do ParaMáximo ← AuxPos_Max ← Pos_aux
Caso opção Tomevalor = “Mínimo”: Faz
Aux ← v(1)Pos_aux ← 1Para índice Desde 2 Até N FazSe v(índice)<Aux Então
Aux ← v(índice)Pos_Aux ←índice
Fim do ParaMáximo ← AuxPos_Max ← Pos_aux
Fim do Caso
…Caso opção Tomevalor = “Máximo”: Faz
Aux ← v(1)Pos_aux ← 1Para índice Desde 2 Até N FazSe v(índice)>Aux Então
Aux ← v(índice)Pos_Aux ←índice
Fim do ParaMáximo ← AuxPos_Max ← Pos_aux
Caso opção Tomevalor = “Mínimo”: Faz
Aux ← v(1)Pos_aux ← 1Para índice Desde 2 Até N FazSe v(índice)<Aux Então
Aux ← v(índice)Pos_Aux ←índice
Fim do ParaMáximo ← AuxPos_Max ← Pos_aux
Fim do Caso
3.5.2.3. Máximo e mínimo dum vector e respectiva posição 3.5.2.3. Máximo e mínimo dum vector e respectiva posição
VVV1 2 3 4 5 N-2 N-1 N
5 7 4 5 1 9 5 3………….
Descrição Algorítmica Codificação VBASub Max_Min_Pos(v()As Integer, ByVal N As Integer,
Max As Integer, Min As Integer, Pos_Max As Integer, Pos_Min As Integer)
Dim Aux As Integer, Pos As IntegerDim i As Integer, opcao As String
opcao = InputBox(“Qual a opcao: Máximo ou Mínimo”)Select Case opcaoCase “Máximo”
Aux=v(1)Pos=1For i=2 To N
If v(i)>Aux ThenAux=v(i)Pos=i
End IfNext iMax=AuxPos_Max=Pos
Case “Mínimo”Aux=v(1)Pos=1For i=2 To N
If v(i)<Aux ThenAux=v(i)Pos=i
End IfNext iMax=AuxPos_Max=Pos
End SelectEnd Sub
Sub Max_Min_Pos(v()As Integer, ByVal N As Integer,Max As Integer, Min As Integer, Pos_Max As Integer, Pos_Min As Integer)
Dim Aux As Integer, Pos As IntegerDim i As Integer, opcao As String
opcao = InputBox(“Qual a opcao: Máximo ou Mínimo”)Select Case opcaoCase “Máximo”
Aux=v(1)Pos=1For i=2 To N
If v(i)>Aux ThenAux=v(i)Pos=i
End IfNext iMax=AuxPos_Max=Pos
Case “Mínimo”Aux=v(1)Pos=1For i=2 To N
If v(i)<Aux ThenAux=v(i)Pos=i
End IfNext iMax=AuxPos_Max=Pos
End SelectEnd Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.4. Soma de todos os elementos dum vector 3.5.2.4. Soma de todos os elementos dum vector
VVV1 2 3 4 5 N-2 N-1 N
5 7 4 5 1 9 5 3………….
Descrição Algorítmica Codificação VBA
5 7 4 5 1 9 5 3………….+ + + + + + + +
…
s ← 0
Para índice Desde 1 Até N Faz
s ← s + v(índice)
Fim do Para
...
…
s ← 0
Para índice Desde 1 Até N Faz
s ← s + v(índice)
Fim do Para
...
Function Soma_elem_vector(v()As Integer, ByVal N As Integer)As LongDim i As Integer, S As Long
S=0For i=1 To N
S=S+v(i)Next iSoma_elem_vector=S
End Function
Function Soma_elem_vector(v()As Integer, ByVal N As Integer)As LongDim i As Integer, S As Long
S=0For i=1 To N
S=S+v(i)Next iSoma_elem_vector=S
End Function
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.5. Média aritmética de todos os elementos dum vector 3.5.2.5. Média aritmética de todos os elementos dum vector
VVV1 2 3 4 5 N-2 N-1 N
5 7 4 5 1 9 5 3………….
Descrição Algorítmica Codificação VBA
5 7 4 5 1 9 5 3………….
N
iVV
N
i∑== 1
)(
…
M ← 0
Para índice Desde 1 Até N Faz
M ← M + v(índice)
Fim do Para
M ← M / N
...
…
M ← 0
Para índice Desde 1 Até N Faz
M ← M + v(índice)
Fim do Para
M ← M / N
...
Function Media_Arit_vector(v()As Integer, ByVal N As Integer)As IntegerDim i As Integer, M As Long
M=0For i=1 To N
M=M+v(i)Next iMedia_Arit_vector=M/N
End Function
Function Media_Arit_vector(v()As Integer, ByVal N As Integer)As IntegerDim i As Integer, M As Long
M=0For i=1 To N
M=M+v(i)Next iMedia_Arit_vector=M/N
End Function
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.6. Troca de dois elementos dum vector 3.5.2.6. Troca de dois elementos dum vector
VVV1 2 I J N
3 5 4 8 7………….
Aux
Descrição Algorítmica Codificação VBA
…ESCREVER(“Indique o índice do 1.º elemento a trocar i<N”)
LER (i)ESCREVER(“Indique o índice do 1.º elemento a trocar j<N”)
LER (j)Aux ← v(i)v(I) ← v(j)v(j) ← Aux...
…ESCREVER(“Indique o índice do 1.º elemento a trocar i<N”)
LER (i)ESCREVER(“Indique o índice do 1.º elemento a trocar j<N”)
LER (j)Aux ← v(i)v(I) ← v(j)v(j) ← Aux...
Sub Troca2elem_vect(v()As Integer, ByVal N As Integer)Dim i As Integer,j As Integer, Aux As Integeri=CInt(InputBox(“O índice do 1.º elem. a trocar i<N”))j=CInt(InputBox(“O índice do 2.º elem. a trocar j<N”))Aux=v(i)v(i)=v(j)v(j)=Aux
End Sub
Sub Troca2elem_vect(v()As Integer, ByVal N As Integer)Dim i As Integer,j As Integer, Aux As Integeri=CInt(InputBox(“O índice do 1.º elem. a trocar i<N”))j=CInt(InputBox(“O índice do 2.º elem. a trocar j<N”))Aux=v(i)v(i)=v(j)v(j)=Aux
End Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.7. Inversão dum vector 3.5.2.7. Inversão dum vector
VVV1 2 3 K 5 N
Descrição Algorítmica Codificação VBA
…
k ← N \ 2 ‘Divisão inteira
Para índice Desde 1 Até k Faz
Aux ← v(índice)
v(índice) ← v(N-índice+1)
v(N-índice+1) ← Aux
Fim do Para
...
…
k ← N \ 2 ‘Divisão inteira
Para índice Desde 1 Até k Faz
Aux ← v(índice)
v(índice) ← v(N-índice+1)
v(N-índice+1) ← Aux
Fim do Para
...
Sub Inverte_vect(v()As Integer, ByVal N As Integer) Dim k As Integer, i As IntegerDim Aux As Integer
k=N\2 ‘Divisão inteiraFor i=1 To k
Aux=v(i)v(i)=v(N-i+1)v(N-i+1)=Aux
Next iEnd Sub
Sub Inverte_vect(v()As Integer, ByVal N As Integer) Dim k As Integer, i As IntegerDim Aux As Integer
k=N\2 ‘Divisão inteiraFor i=1 To k
Aux=v(i)v(i)=v(N-i+1)v(N-i+1)=Aux
Next iEnd Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.8. Permutação circular dum vector 3.5.2.8. Permutação circular dum vector
VVV1 2 3 N-1 N
3 5 4 8 7………….
Descrição Algorítmica Codificação VBA
…
Aux ← v(1)
Para índice Desde 1 Até N-1 Faz
v(índice) ← v(índice+1)
Fim do Para
v(N) ← Aux
...
…
Aux ← v(1)
Para índice Desde 1 Até N-1 Faz
v(índice) ← v(índice+1)
Fim do Para
v(N) ← Aux
...
Sub Permut_circ_Vect(v()As Integer, ByVal N As Integer) Dim Aux As Integer, i As Integer
Aux=v(1)For i=1 To N-1
v(i)=v(i+1)Next iv(N)= Aux
End Sub
Sub Permut_circ_Vect(v()As Integer, ByVal N As Integer) Dim Aux As Integer, i As Integer
Aux=v(1)For i=1 To N-1
v(i)=v(i+1)Next iv(N)= Aux
End Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.9. Remoção dos elementos dum vector 3.5.2.9. Remoção dos elementos dum vector
VVV1 2 K N-1 N
3 5 4 8 7………….………
Descrição Algorítmica Codificação VBA
…
ESCREVER(“Indique o índice do elemento a remover <N”)
LER (k)
Para índice Desde k Até N-1 Faz
v(índice) ← v(índice+1)
Fim do Para
N ← N-1
...
…
ESCREVER(“Indique o índice do elemento a remover <N”)
LER (k)
Para índice Desde k Até N-1 Faz
v(índice) ← v(índice+1)
Fim do Para
N ← N-1
...
Sub Remov_elem_Vect(v()As Integer, N As Integer) Dim k As Integer, i As Integer
k=CInt(InputBox(“O índice do elem. a remover k<N”))For i=1 To N-1
v(i)=v(i+1)Next iN=N-1ReDim v(1 To N)
End Sub
Sub Remov_elem_Vect(v()As Integer, N As Integer) Dim k As Integer, i As Integer
k=CInt(InputBox(“O índice do elem. a remover k<N”))For i=1 To N-1
v(i)=v(i+1)Next iN=N-1ReDim v(1 To N)
End Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.10. Inserção dum novo elemento no vector 3.5.2.10. Inserção dum novo elemento no vector
VVV1 2 K N N+1
3 5 4 8 7………….………
Descrição Algorítmica Codificação VBA
…
ESCREVER(“Indique o índice do elemento a inserir <N”)
LER (k)
Para índice Desde N+1 Até k Faz
v(índice) ← v(índice-1)
Fim do Para
N ← N+1
...
…
ESCREVER(“Indique o índice do elemento a inserir <N”)
LER (k)
Para índice Desde N+1 Até k Faz
v(índice) ← v(índice-1)
Fim do Para
N ← N+1
...
Sub Inserir_elem_Vect(v()As Integer, N As Integer) Dim k As Integer, i As Integer
ReDim v(LBound (v()) To UBound (v())+1)k=CInt(InputBox(“O índice do elem. a adicionar k<N”))For i=N+1 To k Step -1
v(i)=v(i-1)Next iN=N+1
End Sub
Sub Inserir_elem_Vect(v()As Integer, N As Integer) Dim k As Integer, i As Integer
ReDim v(LBound (v()) To UBound (v())+1)k=CInt(InputBox(“O índice do elem. a adicionar k<N”))For i=N+1 To k Step -1
v(i)=v(i-1)Next iN=N+1
End Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.11. Pesquisa dum elemento dum vector 3.5.2.11. Pesquisa dum elemento dum vector
VVV1 2 K N N+1
3 5 ? 8 7………….………
Descrição Algorítmica Codificação VBA
…índice ← 1
Achou ← FalseEnquanto (Não Achou) e (índice <N)
índice ← índice +1
Achou ← (v(índice)=valor)Fim do Enquanto
Se (Achou=True)
Então ESCREVER(“Está na posição” & índice)
Senão ESCREVER(“Não está no vector”)
Fim do Se...
…índice ← 1
Achou ← FalseEnquanto (Não Achou) e (índice <N)
índice ← índice +1
Achou ← (v(índice)=valor)Fim do Enquanto
Se (Achou=True)
Então ESCREVER(“Está na posição” & índice)
Senão ESCREVER(“Não está no vector”)
Fim do Se...
Sub Pesq_elem_Vect(v()As Integer, ByVal N As IntegerElem As Integer)
Dim i As Integer, Achou As Booleani=1Achou=FalseDo While (Not Achou) And (i<N)
i=i+1Achou=(v(i)=Elem)
LoopIf (Achou=True)Then MsgBox “Está na posição “&i
Else MsgBox “Não está no vector”End If
End Sub
Sub Pesq_elem_Vect(v()As Integer, ByVal N As IntegerElem As Integer)
Dim i As Integer, Achou As Booleani=1Achou=FalseDo While (Not Achou) And (i<N)
i=i+1Achou=(v(i)=Elem)
LoopIf (Achou=True)Then MsgBox “Está na posição “&i
Else MsgBox “Não está no vector”End If
End Sub
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.12. Número de elementos repetidos num vector 3.5.2.12. Número de elementos repetidos num vector
VVV1 2 3 4 5 N-2 N-1 N
2 3 2 2 3 4 2 1………….
Descrição Algorítmica Codificação VBA
Ex.: 2 e 3 repetido: 2 elementos repetidos.
←←
…N_Repetidos ← 0Para índice desde 1 Até N-1
j ← índice +1Repetição ← FalseRepetirSe (v(índice)=v(j))
EntãoRepetição ← TrueN_Repetidos ←N_Repetidos+1
Senão j ← j + índice Fim do Se
Até (Repetição =True) ou (j=N+1)Fim do Para
...
…N_Repetidos ← 0Para índice desde 1 Até N-1
j ← índice +1Repetição ← FalseRepetirSe (v(índice)=v(j))
EntãoRepetição ← TrueN_Repetidos ←N_Repetidos+1
Senão j ← j + índice Fim do Se
Até (Repetição =True) ou (j=N+1)Fim do Para
...
Function N_elem_Rep(v()As Integer, ByVal N As Integer)As IntegerDim i As Integer, j As Integer, N_Repetidos As IntegerDim Repeticao As Boolean
N_Repetidos=0For i=1 To N-1
j=j+1Repeticao=FalseDo
If v(i)=v(j) ThenRepeticao=TrueN_Repetidos=N_Repetidos+1
Elsej=j+1
End IfLoop Until (Repeticao=True)OR (j=N+1)
Next iN_Elem_Rep=N_Repetidos
End Function
Function N_elem_Rep(v()As Integer, ByVal N As Integer)As IntegerDim i As Integer, j As Integer, N_Repetidos As IntegerDim Repeticao As Boolean
N_Repetidos=0For i=1 To N-1
j=j+1Repeticao=FalseDo
If v(i)=v(j) ThenRepeticao=TrueN_Repetidos=N_Repetidos+1
Elsej=j+1
End IfLoop Until (Repeticao=True)OR (j=N+1)
Next iN_Elem_Rep=N_Repetidos
End Function
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.2.13. Ordenação dum vector: Bubble Sort3.5.2.13. Ordenação dum vector: Bubble Sort
3 7 5 8 1
VVV3 5 7 1 8
3 5 1 7 8
3 1 5 7 8
1 3 5 7 8
Para a ordenação deste vector de 5 elementos foram necessárias 4 passagens. Por maioria de razão, se o vector tivesse N elementos seriam necessárias N-1 passagens.
Nota: a troca de valores entre 2 variáveis a e b:
Aux=a
a=b
b=Aux
Para a ordenação deste vector de 5 elementos foram necessárias 4 passagens. Por maioria de razão, se o vector tivesse N elementos seriam necessárias N-1 passagens.
Nota: a troca de valores entre 2 variáveis a e b:
Aux=a
a=b
b=Aux
Codificação VBA
Sub Ordenacao_Bubble(v()As Integer, ByVal N As Integer)Dim i As Integer, limite As IntegerDim Aux As IntegerFor limite=N-1 To 1 Step -1For i=1 To limiteIf v(i)>v(i+1) Then
Aux=v(i)v(i)=v(i+1)v(i+1)=Aux
End IfNext i
Next limiteEnd Sub
Sub Ordenacao_Bubble(v()As Integer, ByVal N As Integer)Dim i As Integer, limite As IntegerDim Aux As Integer
For limite=N-1 To 1 Step -1For i=1 To limiteIf v(i)>v(i+1) Then
Aux=v(i)v(i)=v(i+1)v(i+1)=Aux
End IfNext i
Next limiteEnd Sub
Vector inicialVector inicial
1.ª passagem1.ª passagem
2.ª passagem2.ª passagem
3.ª passagem3.ª passagem
4.ª passagem4.ª passagem
Ordenação por ordem crescente
Ordenação por ordem crescente
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.3. Matrizes: Array Bidimensional3.5.3. Matrizes: Array Bidimensional
3.5.4. Operações básicas com matrizes3.5.4. Operações básicas com matrizes
Dim M(1 To 3, 1 To 3) As Integer‘ Array bidimensional c/ 3 x 3 células, com valores inteiros
Dim M(1 To 3, 1 To 3) As Integer‘ Array bidimensional c/ 3 x 3 células, com valores inteiros
- Leitura duma matriz- Escrita duma matriz- Traço duma matriz- Transposta duma matriz- Adição/Subtracção de matrizes- Multiplicação de matrizes
3 9 1
4 7 2
5 9 1
3
1 2 3
1
2LL
CC
MMM
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.4.1. Leitura duma matriz 3.5.4.1. Leitura duma matriz
Descrição Algorítmica Codificação VBA
…
Para ind_l Desde 1 Até L Faz
Para ind_c Desde 1 Até C Faz
ESCREVER (“Insira o elemento” &ind_l &”,” &ind_c &”da matriz”)
LER (M(ind_l, ind_c))
Fim do Para (ind_c)
Fim do Para (ind_l)
...
…
Para ind_l Desde 1 Até L Faz
Para ind_c Desde 1 Até C Faz
ESCREVER (“Insira o elemento” &ind_l &”,” &ind_c &”da matriz”)
LER (M(ind_l, ind_c))
Fim do Para (ind_c)
Fim do Para (ind_l)
...
Sub Ler_Mat(M()As Integer, ByVal L As Integer,ByVal C As Integer)
Dim l As Integer, c As IntegerFor l=1 To L
For c=1 To CM(l,c)=CInt (InputBox(“Insira M &l &”,” &c))
Next cNext l
End Sub
Sub Ler_Mat(M()As Integer, ByVal L As Integer,ByVal C As Integer)
Dim l As Integer, c As IntegerFor l=1 To L
For c=1 To CM(l,c)=CInt (InputBox(“Insira M &l &”,” &c))
Next cNext l
End Sub
? ? ?
? ? ?
? ? ?
3
1 2 3
1
2LL
CC
MMM
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.4.2. Escrita duma matriz 3.5.4.2. Escrita duma matriz
Descrição Algorítmica Codificação VBA
…
Para ind_l Desde 1 Até L Faz
Para ind_c Desde 1 Até C Faz
ESCREVER (“M(” &ind_l &”,” &ind_c &”)=” &M(ind_l,ind_c) &mdl)
Fim do Para (ind_c)
Fim do Para (ind_l)
...
…
Para ind_l Desde 1 Até L Faz
Para ind_c Desde 1 Até C Faz
ESCREVER (“M(” &ind_l &”,” &ind_c &”)=” &M(ind_l,ind_c) &mdl)
Fim do Para (ind_c)
Fim do Para (ind_l)
...
Sub Escreve_Mat(M()As Integer, ByVal L As Integer,ByVal C As Integer)
Dim l As Integer, c As IntegerFor l=1 To L
For c=1 To CMsgBox “M(“ &l &”,” &c &”)=“ &M(l,c) &Chr(13)
Next cNext l
End Sub
Sub Escreve_Mat(M()As Integer, ByVal L As Integer,ByVal C As Integer)
Dim l As Integer, c As IntegerFor l=1 To L
For c=1 To CMsgBox “M(“ &l &”,” &c &”)=“ &M(l,c) &Chr(13)
Next cNext l
End Sub
1 6 6
4 5 2
8 3 1
3
1 2 3
1
2LL
CC
MMM
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.4.3. Traço duma matriz 3.5.4.3. Traço duma matriz
Descrição Algorítmica Codificação VBA
…
Se L=C Então
Traco ← 0Para índice Desde 1 Até L Faz
Traco ← Traco+ M(índice, índice)
Fim do Para (índice)
Senão
Traco ← -1Fim do Se
...
…
Se L=C Então
Traco ← 0Para índice Desde 1 Até L Faz
Traco ← Traco+ M(índice, índice)
Fim do Para (índice)
Senão
Traco ← -1Fim do Se
...
Function Traco_Mat(M()As Integer, ByVal L As Integer, Val C As Integer)As Integer
Dim i As Integer, traco As IntegerIf L=C Then
traco=0For i=1 To L
traco=traco+M(i,i)Next i
Elsetraco=-1
End IfTraco_Mat=traco
End Function
Function Traco_Mat(M()As Integer, ByVal L As Integer, Val C As Integer)As Integer
Dim i As Integer, traco As IntegerIf L=C Then
traco=0For i=1 To L
traco=traco+M(i,i)Next i
Elsetraco=-1
End IfTraco_Mat=traco
End Function
1 6 6
4 5 2
8 3 1
3
1 2 3
1
2LL
CC
MMM+
+
Traço
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.4.4. Transposta duma matriz 3.5.4.4. Transposta duma matriz
Descrição Algorítmica Codificação VBA
…
Para ind_l Desde 1 Até L Faz
Para ind_c Desde 1 Até C Faz
M_T(ind_l,ind_c) ← M(ind_c, ind_l)
Fim do Para (ind_c)
Fim do Para (ind_l)
...
…
Para ind_l Desde 1 Até L Faz
Para ind_c Desde 1 Até C Faz
M_T(ind_l,ind_c) ← M(ind_c, ind_l)
Fim do Para (ind_c)
Fim do Para (ind_l)
...
Sub Transpos_Mat(M()As Integer,M_T()As Integer,ByVal L As Integer,ByVal C As Integer)
Dim l As Integer, c As IntegerFor l=1 To L
For c=1 To CM_T(l,c)=M(c,l)
Next cNext l
End Sub
Sub Transpos_Mat(M()As Integer,M_T()As Integer,ByVal L As Integer,ByVal C As Integer)
Dim l As Integer, c As IntegerFor l=1 To L
For c=1 To CM_T(l,c)=M(c,l)
Next cNext l
End Sub
1 6 6
4 5 2
8 3 6
3
1 2 3
1
2LL
CC
MMM 6 2 6
3 5 6
8 4 1
3
1 2 3
1
2LL
CC
MMMM(l,c) = M (c,l)M(l,c) M(l,c) == M (c,l)M (c,l)
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.5.4.5. Adição/Subtracção de Matrizes 3.5.4.5. Adição/Subtracção de Matrizes
Descrição Algorítmica Codificação VBA
…
Para ind_l Desde 1 Até L Faz
Para ind_c Desde 1 Até C Faz
M_R(ind_l,ind_c)←M1(ind_l,ind_c)+M2(ind_l, ind_c)
Fim do Para (ind_c)
Fim do Para (ind_l)
...
…
Para ind_l Desde 1 Até L Faz
Para ind_c Desde 1 Até C Faz
M_R(ind_l,ind_c)←M1(ind_l,ind_c)+M2(ind_l, ind_c)
Fim do Para (ind_c)
Fim do Para (ind_l)
...
Sub Soma_Mat(MR()As Integer,M1()As Integer, M1()As Integer,ByVal L As Integer,ByVal C As Integer)
Dim l As Integer, c As IntegerFor l=1 To L
For c=1 To CM_R(l,c)=M1(l,c)+ M2(l,c)
Next cNext l
End Sub
Sub Soma_Mat(MR()As Integer,M1()As Integer, M1()As Integer,ByVal L As Integer,ByVal C As Integer)
Dim l As Integer, c As IntegerFor l=1 To L
For c=1 To CM_R(l,c)=M1(l,c)+ M2(l,c)
Next cNext l
End Sub
M_RM_RM_R
1 6 6
4 5 2
8 3 6
3
1 2 3
1
2LL
CC
1 2 1
3 5 0
2 1 5
3
1 2 3
1
2LL
CC
M1M1M1
M_R(l,c) = M1 (l,c) ± M2(l,c)M_R(l,c) M_R(l,c) == M1 (l,c) M1 (l,c) ±± M2(l,c)M2(l,c)
0 4 5
1 0 2
6 2 1
3
1 2 3
1
2LL
CC
M2M2M2
= +
No caso da subtracção basta trocar
o sinal para “–”.No caso da subtracção basta trocar
o sinal para “–”.
Departamento de Informática
2005-2006Capítulo 6
Curso de EMGI
Mic
roso
ft V
BAPR
OG
RAM
AÇÃO
3.6. Objectos, Propriedades e Métodos do EXCEL3.6. Objectos, Propriedades e M3.6. Objectos, Propriedades e Méétodos do EXCELtodos do EXCEL
ObjectoObjectoObjecto: Workbook
Folha de CFolha de Cáálculolculo
AplicaAplicaççãoãoMicrosoft EXCELEXCEL
Livro 1Livro 1Livro 2Livro 2……..Livro nLivro nLi
vros
Livr
os
LivroLivro
ObjectoObjectoObjecto: Application
ObjectoObjectoObjecto: Worksheet
Folha de GrFolha de Grááficofico
Caixa de DiCaixa de Diáálogologo
MMóódulodulo
ObjectoObjectoObjecto: Chart
ObjectoObjectoObjecto: DialogSheet
ObjectoObjectoObjecto: Module