Programação em VBA Texto Introdutório
|
|
|
- Lúcia Lacerda Salgado
- 10 Há anos
- Visualizações:
Transcrição
1 Programação em VBA Texto Introdutório versão 3 António Silva DEI-Isep
2 .
3 Conteúdo 1 Introdução 9 2 Conceitos Básicos O que é um Macro? Técnicas de construção dum Macro Gravação de um Macro A escrita de um Macro O editor de VBA Criação de um Macro Variáveis e Tipos de Dados Conceito de variável Criação das variáveis Âmbito de uma variável Tipos de Dados A operação de Atribuição O uso de constantes Como trabalhar com Objectos Propriedades, Métodos e Eventos Propriedades Métodos Eventos Os objectos do Excel mais comuns Como trabalhar com as propriedades dos objectos Excel Como aplicar métodos aos objectos Objectos gráficos MsgBox InputBox Forms Botões de Comando Rótulos Caixas de Texto Botões de Opção Caixas de Verificação Quadros (Frames) Caixas de Listagem Interface gráfica sem uma Form Estruturas de controlo do programa Estruturas de controlo condicional If...Then...Else If...Then Estruturas condicionais embutidas Estruturas de controlo repetitivo
4 5.2.1 Estruturas de Controlo Do...Loop Ciclos controlados por contador Exemplo integrador Ciclos controlados por sentinela Estrutura de Controlo For..To..Next Estruturas de controlo repetitivo imbricadas Variáveis indexadas - vectores e matrizes Declaração estática de vectores Declaração dinâmica de vectores Processamento de vectores Matrizes Funções e Procedimentos Funções Exemplos de funções criadas pelo programador Passagem de parâmetros ByVal Procedimentos Passagem de parâmetros ByRef Como aceder às funções standard do Excel Programação do Excel usando VBA Trabalhar com objectos Workbook Trabalhar com objectos Worksheet Propriedades de Worksheet Métodos de Worksheet Trabalhar com objectos Range Adicionando uma interface gráfica Instalação da Form Instalação dos Controlos Associação da Form ao procedimento Como visualizar e terminar uma Form Tratamento de eventos através de Event Handlers Como recolher os resultados de uma Form Exemplo de aplicação Exemplo de aplicação mais elaborado Manipulação de texto Funções de manipulação de strings Trim, LTrim e RTrim Len Left, Right Mid InStr UCase, LCase Algoritmos
5 Separação duma string em caracteres Divisão de uma frase em palavras Notas finais 88 5
6 Lista de Figuras 1 Janela de invocação do ambiente de Gravação de Macros Janela de Gestão de Macros Barra de Ferramentas de VBA Editor integrado do VBA Criação de novo Módulo Diferentes tipos de dados e o seu armazenamento em memória Como forçar a declaração explícita automaticamente Uma Form e vários Controlos Janela de Propriedades Lista de eventos disponíveis Objectos e Eventos Exemplo de MsgBox Exemplo de InputBox Vários optionbutton agrupados numa frame Vários checkbox agrupadas numa frame Uma Frame agrupando três botões de comando Exemplo de listbox Interface construída directamente na folha de cálculo Estrutura de controlo condicional If...Then...Else Estrutura de controlo condicional If...Then Estruturas de controlo condicional imbricadas Estrutura de controlo repetitivo Do...While Estrutura de controlo repetitivo Do...Until Ciclos controlados por contador Exemplo integrador - Interface Exemplo integrador - Código Ciclos controlados por sentinela Exemplo de Ciclos Imbricados Um vector é uma variável múltipla Um exemplo de vector de strings Porquê usar ciclos para processar vectores? Ciclos encadeados para processar um vector bidimensional Funções como caixas pretas Utilização da função margemlucro numa fórmula Análise passo a passo da expressão de cálculo das combinações Comunicação da função com o programa que a invoca Resultados do código da Listagem 13 na página Exemplos de utilização da propriedade Offset Criação de uma Form no VBA A UserForm para Entrada Múltipla de Dados Objecto da classe Tabstrip
7 Lista de Tabelas 1 Tipos de dados suportados pelo VBA Propriedades mais comuns dos objectos gráficos VBA Valores de configuração das características de uma Caixa de Mensagem Valores devolvidos por uma Caixa de Mensagem
8 Listings 1 VerificaValor - exemplo de macro verificagama - exemplo de macro Exemplo de aplicação de If..Then..Else imbricados FormataBordo - exemplo de sub-rotina usando For..Next Exemplo usando Ciclos Imbricados Exemplo de Sub-rotina usando Ciclos Imbricados Exemplo de processamento de um vector Outro exemplo de processamento de um vector Soma de matrizes Função mlucro Função factorial Programa de cálculo de Combinações Diferentes resultados na passagem por valor e por referência Sub-rotina InsereLinhas Handler do objecto cmdfechar para o evento click Exemplo de sub-rotina de invocação de uma UserForm Exemplo de sub-rotina de inicialização de uma UserForm Handler do objecto cmdfechar para o evento Click Sub-rotina de inicialização da UserForm Handler associado ao objecto Tabstrip1 para o evento Change Separação de string em caracteres - 1 o Método Separação de string em caracteres - 2 o Método Separação de frase em palavras
9 1 Introdução Este texto tem como objectivo apoiar o ensino das técnicas de programação de computadores, utilizando, como ambiente de aplicação, programas como o gestor de folhas de cálculo Excel. Destina-se, assim, aos alunos que já possuem alguns conhecimentos da utilização e funcionamento desta aplicação. Concretamente, presume-se que estão já familiarizados com os conceitos de folha de cálculo, de livro de trabalho, de fórmulas e de funções standard. A linguagem de programação que vai ser utilizada será o VBA (Visual Basic for Applications). É uma linguagem que permite acrescentar capacidades adicionais a certo tipo de aplicações informáticas, concretamente as pertencentes ao Microsoft Office, entre as quais o Excel e o Word. Permite ainda automatizar a realização de muitas tarefas rotineiras nessas aplicações. Como o próprio nome indica, trata-se duma adaptação da linguagem genérica de programação Visual Basic de modo a poder ser utilizada no ambiente específico das aplicações Office. 2 Conceitos Básicos O VBA constitui uma ferramenta poderosa nas mãos de programadores experimentados mas pode, ao mesmo tempo, ser muito útil a um utilizador normal, mesmo inexperiente. De facto, no dia a dia da utilização destas aplicações, defrontamo-nos com a necessidade de repetir a mesma tarefa várias vezes ao dia ou, de em certas ocasiões, ter que repetir uma determinada tarefa uma série de vezes de seguida. Seja escrever ou formatar um certo texto, seja executar uma série de comandos ou escolher opções de menus, seja ainda realizar a formatação complexa de um documento, são inúmeras as ocasiões em que dava jeito poder automatizar essas tarefas repetitivas. É aqui que entra o VBA, permitindo a construção daquilo que se designa vulgarmente por macros. 2.1 O que é um Macro? Um macro contem uma lista das instruções a realizar para executar uma determinada tarefa. No fundo, é um programa escrito em VBA, que indica a uma aplicação como o Excel quais os passos a dar para atingir um objectivo específico. Pode-se dizer que um macro não é mais que uma descrição formalizada das tarefas que se pretende automatizar. Os macros incluem instruções que interagem com elementos da aplicação. Por exemplo, quando, numa aplicação Office se pretende fechar uma janela, pode-se seleccionar a opção de menu Close. Um macro escrito em VBA, usará a seguinte instrução para obter o mesmo efeito: ActiveWindow.Close Existem duas formas alternativas de criar um macro mas a forma como ele é criado não muda o seu conteúdo, continuando a ser um contentor de uma lista de instruções a realizar pela aplicação em que está instalado. 9
10 2.2 Técnicas de construção dum Macro Se bem que um macro seja um programa em VBA, nem sempre é necessário escrevê-lo de forma explícita, ou seja, detalhando especificamente as instruções VBA que o compõem. Sobretudo quando os macros são simples, é muitas vezes mais prático criá-los de forma automática, gravando a sequência de passos que ele deverá executar na aplicação. Esta forma de criar um macro corresponde a mostrar ao computador o que fazer para conseguir obter o resultado pretendido. O utilizador indica ao programa que se vai entrar num modo de gravação do macro e inicia a execução da sequência de acções que normalmente teria que executar. Quando chega ao fim dessa sequência, indica ao programa que a gravação terminou. Após ter atribuído a essa sequência uma combinação de teclas especial, esse macro estará pronto a ser executado, substituindo assim o conjunto de acções que anteriormente seriam necessárias. Tudo se passa como se estivéssemos a ensinar a aplicação pelo exemplo. Se se investigar, no entanto, o conteúdo desse macro, verificar-se-á que ele é composto precisamente por instruções escritas em VBA, sendo que a cada acção ou comando da aplicação corresponderá uma instrução (ou conjunto de instruções) específica do macro. A forma alternativa de construir um macro será assim introduzir essas instruções num editor de texto apropriado. É essa, de facto, a forma de criar um macro quando o seu âmbito é algo não trivial Gravação de um Macro Quando uma dada operação envolvendo uma série de acções deve ser utilizada frequentemente, faz sentido tentar automatizar a sua execução. Figura 1: Janela de invocação do ambiente de Gravação de Macros Para gravar um macro que seja capaz de efectuar essas acções, haverá que invocar o modo de gravação de macros, mediante o Menu "Tools/Macros/Record a New Macro" (em Excel), o que fará aparecer a janela descrita da Figura 1. Nela se pode especificar o nome do macro, a localização em que será armazenado, uma descrição das suas funções 1 A tratar na Secção 2.6 na página
11 e ainda a combinação de teclas (Shortcut key) que será utilizada para arrancar com o macro, uma vez este construído. Após se premir a tecla OK, aparecerá uma pequena janela que permitirá controlar o processo de gravação e dever-se-á dar início à execução das acções que o macro vai substituir. Quando se tiver executado a última acção a incluir no macro, basta dar, nessa janela, a indicação de que a gravação terminou. Uma vez tal realizado, esse macro passará a estar disponível mediante a invocação da combinação de teclas especificada anteriormente (no caso da Figura 1 na página precedente, seria Ctrl+Shft+M) e realizará, de forma automática, exactamente a mesma sequência de acções que tínhamos efectuado manualmente. Figura 2: Janela de Gestão de Macros Em alternativa, mediante a combinação de teclas ALT-F8, pode ser accionada a janela de Gestão de Macros (Figura 2), onde, entre outras acções, pode ser escolhido o macro a ser executado. Para facilitar o acesso às facilidades de gravação e edição de macros, será conveniente tornar visível de forma permanente a barra de ferramentas de Visual Basic (Figura 3). No Excel, isto poderá fazer-se mediante a opção de Menu "View/Toolbars/Visual Basic". Figura 3: Barra de Ferramentas de VBA 11
12 2.4 A escrita de um Macro Ensinar pelo exemplo ao Excel como fazer as coisas é um método expedito de construir um macro, mas tem as suas limitações. Já que um macro não é mais que um programa escrito em VBA, porque não tratá-lo como tal e aceder ao seu código, alterando-o de forma a melhorar a sua eficiência ou a corrigir problemas. E já agora, porque não criá-los de raiz, aproveitando todo o poder duma linguagem como o VBA? 2.5 O editor de VBA Para aceder ao editor especializado de Visual Basic (Figura 4), que se encontra integrado no próprio Excel, basta utilizar o icone adequado na barra de ferramentas ou usar directamente a combinação de teclas ALT-F11 (tornando a premir esta combinação de teclas, voltaremos à nossa folha de cálculo). A este editor especializado é também dado o nome de Integrated Development Environment (IDE) ou Ambiente de Desenvolvimento Integrado e é semelhante à aplicação autónoma usada para o desenvolvimento de programas em Visual Basic. Figura 4: Editor integrado do VBA Do lado esquerdo na Figura 4 podem-se ver duas janelas, a primeira das quais é designada por Explorador de Projectos e que serve para mostrar o conteúdo do projecto VBA actual. Um projecto em VBA inclui um ficheiro duma aplicação Office (como, por 12
13 Figura 5: Criação de novo Módulo exemplo, uma folha de cálculo do Excel) e todos os ficheiros VBA associados, incluindo os próprios macros e eventuais user forms (janelas de interface próprias utilizadas pelos macros 2 ). Para poder começar a escrever macros usando o VBA é necessário criar um módulo que o possa albergar, o que é conseguido usando a opção de menu "Insert/Module". Como consequência, para além do novo módulo aparecer referido na janela do Explorador de Projectos, será criada uma janela nova onde será possível escrever o código que constitui o novo macro. Se já existir algum módulo criado, bastará seleccionar o módulo pretendido no explorador de projectos, posicionar o cursor na janela do editor correspondente a esse módulo, numa área fora de qualquer macro já existente, e seleccionar a opção de menu "Insert/Procedure". Aparecerá uma janela própria (Figura 5) onde será possível dar o nome ao novo procedimento (o conjunto de instruções que constituirá o macro), especificar o tipo de macro que vai ser construído (função ou procedimento 3 ) e qual o âmbito da sua utilização (privada ou pública, ou seja, limitada ou não ao ficheiro actual). Após premir o botão aparecerá na janela do editor o esqueleto do novo macro, apenas com o cabeçalho e o delimitador final. 2.6 Criação de um Macro Está na hora de construir o primeiro macro em VBA. Suponhamos que se pretende criar um macro que verifique se o valor presente numa determinada célula é superior a um dado limite e que, caso seja, disso notifique o utilizador. A sub-rotina em que esse macro deverá assentar poderá ter o conteúdo apresentado na Listagem 1 na próxima página. Não nos vamos de momento preocupar com os detalhes do código que constitui o macro. Basta verificar, em 1 o lugar, que é constituído por uma linha de cabeçalho que especifica o tipo de macro (neste caso, uma sub-rotina (Sub) ou procedimento) e o seu 2 Sobre o assunto, ver Secção 9. 3 A distinção entre funções e procedimentos (ou sub-rotinas) será abordada na Secção 7 na página
14 nome (verificavalor). O corpo do macro é composto pela estrutura de controle condicional (If...Then 4 ) que vai verificar se o conteúdo da célula B2 5 é ou não maior que o valor 200. Caso essa condição seja verdadeira, o macro apresentará uma mensagem no ecran dizendo que o valor máximo foi excedido. Finalmente, o macro é terminado com uma linha contendo "End Sub". Listing 1: VerificaValor - exemplo de macro 1 Public Sub v e r i f i c a V a l o r ( ) 2 I f C e l l s (2, 2) > 100 Then 3 MsgBox " Valor maximo excedido! " 4 End I f 5 End Sub O que este simples macro faz, portanto, é verificar o conteúdo de uma célula específica da folha de cálculo e avisar o utilizador caso o valor nela contido ultrapassar um valor pré-determinado. Sempre que for necessário fazer esta verificação, bastará invocar a combinação de teclas que tenha sido associada a este macro. É verdade que esta verificação poderia ter sido realizada colocando numa célula uma fórmula contendo a função standard do Excel IF. Mas suponhamos agora que se pretende algo mais complicado, por exemplo, fazer essa verificação num conjunto de células e apenas desencadear o alarme caso mais do que duas dessas células ultrapassem o limite estabelecido. A sub-rotina modificada poderia ser algo como: Listing 2: verificagama - exemplo de macro 1 Public Sub verificagama ( ) 2 Dim i As Integer, c As Integer 3 c = 0 4 For i = 1 To 5 5 I f C e l l s ( i, 3) > 100 Then 6 c = c End I f 8 Next 9 I f c > 2 Then 10 MsgBox c & " v a l o r e s s u p e r i o r e s ao l i m i t e! " 11 End I f 12 End Sub A verificação é agora repetida em todas as células de C1 a C5 graças aos serviços da estrutura de controlo repetitivo For...To...Next 6 que executará 5 vezes as instruções contidas nas linhas 5 a 7. Para além de verificar o conteúdo da célula em análise, é ainda actualizado um contador, baseado na variável c (ver linha 6), sempre que o valor contido nessa célula ultrapasse o limite. Só quando o valor desse contador for maior que 2 será gerada a mensagem de alarme. 4 Ver Secção na página Cells(2,2) refere-se à célula B2 (2 a coluna, 2 a linha) 6 Ver Secção na página
15 Estaremos já em posição de perceber a utilidade de construir os macros usando directamente o VBA. Não seria trivial resolver este problema usando apenas fórmulas e certamente impossível executando comandos e seleccionando menus do Excel. A um macro criado usando directamente o VBA pode também ser associada uma combinação de teclas que facilite o seu acesso. Isso pode ser feito através do botão Options na Janela de Gestão de Macros, invocada mediante a combinação de teclas ALT-F8. 15
16 3 Variáveis e Tipos de Dados A informação processada por um macro pode ser de diferente natureza e existir em diferentes formatos. Genericamente um programa pode utilizar, entre outras, informação numérica e informação chamada alfa-numérica, ou seja texto. A linguagem VBA consegue lidar com informação de diversos tipos, que detalharemos mais adiante na Secção 3.4 na página Conceito de variável Uma variável é uma localização de memória em que a informação pode ser guardada de modo a ser usada por um macro. Cada variável é essencialmente caracterizada pelo seu nome e pelo seu tipo, ou seja, o tipo de dados que pode armazenar 7. Como é sugerido pelo próprio nome, o conteúdo de uma variável pode mudar durante a execução do macro. Existem algumas regras governando a escolha do nome duma variável: 1. Deve obrigatoriamente começar por uma letra; 2. Não pode conter espaços nem caracteres como vírgulas ou pontos; 3. Não pode exceder 255 caracteres; 4. Não pode ser igual a uma palavra reservada para o VBA. O tipo da variável especifica qual o tipo de dados que pode conter. Uma variável de um determinado tipo não está preparada para armazenar dados de um tipo diferente. A razão para este facto é que o espaço necessário para armazenar diferentes tipos de dados não é o mesmo. Enquanto um inteiro simples pode ser guardado em 2 bytes de memória 8, para guardar um número real podem ser necessários 8 bytes (ou mesmo mais, dependendo da precisão requerida). A Figura 6 na página seguinte ilustra graficamente esta realidade. Enquanto que uma idade (valor inteiro) pôde ser guardada numa variável do tipo integer, dimensionada para armazenar valores inteiros, já um peso (valor real) teve que ser guardado numa variável do tipo single, com a dimensão adequada a armazenar valores reais de uma dada precisão Criação das variáveis Ao acto de criação de variáveis chama-se declaração. Criar uma variável envolve dar-lhe um nome e reservar em memória o espaço necessário para que ela possa guardar o tipo de dados para o qual está a ser criada. O acto de declarar a variável informa o VBA àcerca 7 Na Secção 3.3 na página 18 é referida outra característica das variáveis, o seu âmbito, que, em certas situaçoes, faz sentido considerar. 8 Para armazenar números que podem variar entre e 32767, ou seja valores diferentes, há necessidade de dispor de 16 unidades básicas de informação (bits), ou seja dois bytes (1 byte = 8 bits). De facto, se cada bit apenas pode representar um valor binário (0 ou 1), 16 bits poderão representar até 2 16 = valores diferentes. 9 É possível armazenar um valor inteiro dentro de uma variável dimensionada para guardar valores reais. O contrário é que já não é verdadeiro: ocorreria obrigatoriamente a truncagem do valor real, perdendo-se a parte fraccionária. 16
17 Figura 6: Diferentes tipos de dados e o seu armazenamento em memória do nome pelo qual ela será conhecida assim como qual o tipo de dados que ela deverá estar preparada para receber. Como é óbvio, nenhuma variável pode ser utilizada antes de ser criada. A declaração deve, pois, preceder a sua utilização. Desde que se siga esta regra, é possível inserir declarações em qualquer ponto do macro. No entanto, é boa prática agrupar todas as declarações necessárias num bloco a colocar no início, para mais fácil manutenção do programa. Em VBA, existem duas formas de declaração de variáveis: explícita e implícita. A declaração explícita exige a utilização da instrução Dim... As... (Dimensionar... Como...) Por exemplo, a instrução Dim Preço As Integer cria (declara) uma variável com o nome Preço e do tipo Integer, ou seja, dimensionada para receber dados do tipo integer (inteiro simples 10 ). A declaração implícita resume-se a utilizar pela primeira vez uma variável sem qualquer declaração explícita prévia, dando-lhe um nome e atribuindo-lhe um valor. O VBA encarregar-se-á de criar automaticamente a variável do tipo pretendido. Esta segunda forma de declarar variáveis tem, a despeito da sua simplicidade, um 10 A discussão dos vários tipos de dados suportados pelo VBA será feita na Secção
18 problema grave: é possível, por distracção, criar uma variável nova indesejada, quando o que se pretendia era apenas escrever o nome de uma variável já existente. Suponha, por exemplo, que havia criado uma variável "Distancia" mediante a instrução 11 : Distancia=1260 Como é a primeira vez que o VBA encontra esta palavra ("Distancia"), partirá do princípio que se trata de uma variável ainda por declarar e tratará de a criar, substituindose ao programador. Dar-lhe-á o nome "Distancia" e dimensiona-la-á de forma a poder guardar inteiros simples, já que é essa a utilização sugerida na instrução. Agora suponha que adiante no programa, por engano, escrevia "Distncia" ao referir-se à variável em causa. O VBA não emitirá nenhum alerta, já que aceitou tranquilamente "Distncia" como uma nova variável. A forma mais prudente de lidar com declarações de variáveis é, pois, utilizar apenas declarações explícitas, e instruir o VBA para não aceitar declarações implícitas, gerando uma mensagem de erro apropriada. Para tal, deverá ser acrescentada a instrução Option Explicit no início do módulo contendo o macro. Figura 7: Como forçar a declaração explícita automaticamente Se se pretender que seja esse o comportamento automático do VBA em todos os módulos, deverá seleccionar-se no Editor do VBA a opção "Require Variable Declaration"no sub-menu Options do menu Tools, conforme pode ser observado na Figura Âmbito de uma variável Dissemos na Secção 3.1 na página 16 que uma variável se caracterizava pelo seu nome e pelo tipo de dados que estava preparada para guardar. Isso é rigorosamente verdade se considerarmos apenas variáveis contidas num único módulo. Mas se tivermos em conta que vários módulos podem existir, cada um com as suas variáveis, e ainda que as 11 Como se verá na secção 3.5, esta instrução guarda na variável "Distancia"o valor
19 variáveis podem ser declaradas fora de qualquer módulo, então teremos que adicionar uma característica adicional à definição de uma variável: o seu âmbito. Por âmbito entende-se a zona do programa em que a variável é conhecida, ou seja, em que pode ser utilizada. Esta zona está directamente relacionada com o local em que a variável foi declarada. Para esclarecer melhor este ponto, atente-se na Listagem 3.3, em que podemos ver duas sub-rotinas, sub1 e sub2, em que são criadas e utilizadas diversas variáveis, e ainda uma variável n que foi declarada fora de qualquer sub-rotina. 1 Dim n As integer Private Sub sub1 ( ) 5 Dim i As integer, x As s i n g l e 6 7 i = 10 8 n = End Sub Private Sub sub2 ( ) 13 Dim i As integer, c As integer c = n 10 + i End Sub Na sub-rotina sub1 é usada quer a variável i (até aqui, nada de mais já que essa variável foi criada na própria sub-rotina) quer a variável n. Ora, esta segunda variável não lhe pertence, não foi declarada dentro de si. Tal é possível, porque, sendo exterior à sub-rotina, foi declarada como variável dita global, fora de qualquer sub-rotina e, como tal, acessível por qualquer módulo que a ela queira aceder. Por seu lado, a variável i diz-se local já que o seu âmbito se restringe à sub-rotina em que foi declarada. Na instrução da linha 15 da listagem, contida na sub-rotina sub2, são acediadas três variáveis: c pertencendo à própria sub-rotina, a variável global n e a variável i. A utilização da variável global já foi discutida. Vale a pena, porém, discutir a utilização da variável i. Esta variável, se bem que tenha o mesmo nome de outra pertencendo a sub1, é uma entidade diferente. A partilha do nome é mera coincidência. Assim sendo, e não tendo sido guardado previamente qualquer valor na variável i dentro de sub2, o seu valor por defeito será zero, pelo que o resultado da expressão armazenado em c será ( 10 x = 1000 ). Impõe-se uma alerta relativamente à utilização de variáveis globais. O facto de poderem ser acedidas indistintamente por qualquer módulo torna a sua utilização muito flexível e, em certos caso, insubstituível. No entanto, especial atenção deve ser prestada a eventuais interacções indesejáveis entre módulos. Se muitas entidades acederem a uma mesma variável global, modificando o seu conteúdo, pode tornar-se difícil detectar qual o módulo responsável por valores anómalos que possam surgir nessa variável. 19
20 3.4 Tipos de Dados Como já vimos, um macro deverá poder lidar com diferentes tipos de dados. A linguagem VBA suporta, entre outros, o tratamento dos seguintes tipos de dados descritos na Tabela 1. Tipo Descrição Integer Inteiro simples, usado para representar inteiros entre e Long Inteiro longo, ou seja, compreendido entre e Single Real representado com precisão simples, com valores negativos compreendidos entre cerca de -3,4E38 e -1,4E-45 e valores positivos entre cerca de 1,4E-45 e 3,4E38 Double Real representado com precisão dupla, usado para representar números reais muito maiores ou muito mais pequenos que com o tipo single String Usado para representar texto (informação alfanumérica como letras, algarismos e símbolos especiais); strings são apresentadas entre aspas Boolean Usado para representar valores lógicos (True ou False) Date Usado para representar datas ou valores de tempo; são representados entre caracteres # Object Serve para guardar referências a objectos Tabela 1: Tipos de dados suportados pelo VBA Quando declaramos variáveis dever-se-á, em princípio, especificar qual o tipo de dados que ela irá suportar. No entanto, em VBA é possível omitir a especificação do tipo de dados na declaração de variáveis. O VBA criará, nesse caso, uma variável do tipo Variant capaz de armazenar qualquer tipo de dados. O que, à partida, parece uma boa ideia acaba por não o ser porque, entre outros motivos, implica um gasto excessivo de memória e torna a execução dos macros mais lenta. Será, portanto, de evitar, na medida do possível. 3.5 A operação de Atribuição A operação de Atribuição permite guardar um dado numa variável, ou seja, atribuir-lhe um valor. A sintaxe utilizada por esta operação é a seguinte: Variável = Valor O resultado da operação será, portanto, o de guardar Valor em Variável. Valor pode ser um valor constante ou o conteúdo de outra variável. Neste segundo caso, a atribuição consistirá na cópia do conteúdo de uma variável para outra do mesmo tipo. A instrução seguinte copia o valor contido na variável idade para a variável temp (partimos do princípio que ambas são do tipo integer): temp = idade Pode ainda ser atribuído a um variável o resultado de uma expressão ou o valor devolvido por uma função. Atente-se nos seguintes exemplos: 20
21 total = peso1 + peso2 resultado = sqrt(2+peso) No 1 o exemplo, o VBA resolverá em primeiro lugar a expressão à direita do operador de atribuição (=), somando os conteúdos das variáveis peso1 e peso2, após o que copiará esse resultado para a variável total. No 2 o exemplo, a expressão à direita é composta pela função standard do VBA sqrt(). Esta função calcula a raiz quadrada do valor ou expressão que se encontrar dentro dos seus parêntesis. Assim sendo, o VBA calculará em 1 o lugar o resultado da expressão 2 + peso, fornecerá esse valor à função sqrt(), após o que copiará o valor fornecido por essa função para a variável resultado. É importante que se perceba que a operação de atribuição é uma operação destrutiva. Se a variável contiver já um valor, uma operação subsequente de atribuição sobre essa variável, substituirá o valor nela contido pelo novo valor. Convem, assim, lembrar que nesta operação o fluxo da informação se faz sempre da direita para a esquerda e não o contrário. Há ainda que ter em atenção o facto de que não é normalmente aconselhável atribuir um valor de um dado tipo a uma variável de tipo diferente. Os resultados podem ser a perda de informação ou o mau funcionamento do programa. O VBA poderá gerar uma mensagem de erro mas tal nem sempre acontece, podendo produzir-se comportamentos anómalos difíceis de detectar e corrigir. 3.6 O uso de constantes Uma constante consiste num nome que é dado a um valor numérico ou a uma cadeia de caracteres, e que pode ser usado dentro do programa na vez desses valores. Funciona como uma espécie de sinónimo. A utilização de uma constante, em substituição do valor que representa, justifica-se pelo seguinte facto: se um dado valor constante fôr utilizado muitas vezes ao longo dum programa, caso ocorra a necessidade de o modificar, seremos forçados a corrigir manualmente todas as ocorrências desse valor, correndo, além disso, o risco de nos enganarmos. Se, ao invés, for definida uma constante com esse valor, bastará modificar essa definição inicial para que tal mudança automaticamente se repercuta em todas as ocorrências dessa constante no decurso do programa. A sintaxe da definição de constantes é a seguinte: Const Nome As tipo = expressão Por expressão entende-se um valor numérico, uma cadeia de caracteres, ou uma expressão cujo resultado seja um destes tipos de valores. Caso, por exemplo, seja necessário usar ao longo de um macro um mesmo factor em vários cálculos, faz sentido definir esse factor como constante e usar o seu nome em vez dele: Const Factor as Single = Sempre que seja subsequentemente necessário utilizar este factor numa expressão, usar-se-á Factor em vez de
22 4 Como trabalhar com Objectos Para que uma macro possa manipular o ambiente da aplicação, seja modificando a formatação de um documento, modificando opções da aplicação ou introduzindo dados numa gama de células, vai ser preciso interagir com Objectos. Genericamente, pode dizer-se que um objecto é algo que pode ser visto, tocado, sentido. Em VBA, considera-se um objecto tudo aquilo que pode ser visto e que pode ser manipulado de alguma forma. Quer o documento, quer uma célula ou gama de células, quer a própria aplicação são considerados, para os efeitos de programação em VBA, como sendo objectos. Mas podem ainda existir outros objectos, nomeadamente aqueles que permitem construir uma interface gráfica específica do macro. A esses objectos gráficos chamamos controlos e são colocados em janelas especiais chamadas forms. Na Figura 8 podem ser observados vários objectos instalados numa form: uma caixa de texto, dois botões de comando, vários rótulos ou etiquetas e uma caixa de verificação. Através de elementos como estes é possível o macro interagir com o utilizador. Veremos em detalhe mais à frente para que servem e como utilizar estes diferentes objectos. Figura 8: Uma Form e vários Controlos Os objectos podem ser manipulados de várias formas: podemos mudar as suas propriedades, que traduzem características próprias dos objectos; podemos aplicar um método a um objecto, ou seja, executar uma acção sobre ele; podemos especificar uma sub-rotina que será executada sempre que um determinado evento ocorra nesse objecto. Vamos agora utilizar a analogia para introduzir estes conceitos. Consideremos um automóvel: As suas "propriedades" são características físicas como o modelo, o peso ou a cilindrada; 22
23 Os seus "métodos" especificam o que pode ser feito com ele: acelerar, travar, mudar de direcção, etc; Os seus "eventos" são ocorrências que provocarão respostas automáticas por parte do automóvel, como seja, um alarme que dispara (resposta) caso desliguemos o carro com as luzes ligadas (evento). 4.1 Propriedades, Métodos e Eventos Vamos, de seguida, aprofundar estes conceitos de propriedades, métodos e eventos Propriedades As propriedades de um objecto traduzem as suas características físicas e formas de comportamento. Como na vida real, cada objecto possui características próprias ou propriedades, que podem ser quantificadas ou especificadas, como sejam as suas dimensões ou o tipo de letra que usa. A cada objecto está associada uma lista de propriedades a que é possível atribuir valores, determinando a sua aparência, localização e outros detalhes. Pode-se então dizer que as propriedades de um objecto definem a forma como ele se apresenta ou se comporta. Diversas classes de objectos podem partilhar a mesma propriedade. Essa propriedade, no entanto, pode afectar esses objectos de forma diferente. Caption Name Left Top Height Width Font Visible Define o texto a afixar na barra de título das forms, da legenda ( caption ) dos botões de comando, ou nos rótulos ( label ) Define o nome pelo qual o objecto é identificado Define o afastamento entre uma form e o limite esquerdo do ecrã ou entre um controlo e o limite esquerdo da form Define o afastamento entre uma form e o topo do ecrã ou entre um controlo e o topo da form Define a altura do objecto Define a largura do objecto Especifica qual o tipo de letra a usar nos controlos Permite controlar o aparecimento de um dado objecto Tabela 2: Propriedades mais comuns dos objectos gráficos VBA Já vimos que quer os elementos do Excel como folhas de cálculo ou próprio documento, quer elementos constituintes de interfaces gráficas que os macros possam utilizar, são considerados objectos. Na Tabela 2 são descritas algumas das propriedades mais importantes e que são comuns à maior parte dos objectos gráficos. No caso dos objectos gráficos, os valores que as propriedades de um dado objecto tomam podem ser consultados ou modificados usando a janela de propriedades (Figura 9 na próxima página). Nessa janela aparece a lista de propriedades do objecto que estiver nesse momento seleccionado. Nela pode observar, entre outras, algumas das propriedades referidas na lista acima (Caption, Height e Font) e os respectivos valores no momento. 23
24 Figura 9: Janela de Propriedades Quando num programa pretendemos referir-nos a uma propriedade de um objecto, utilizamos a seguinte sintaxe: Objecto.Propriedade Por exemplo, se nos quisermos referir à propriedade que controla o tipo de letra (font) da célula activa duma folha de cálculo, usaremos ActiveCell.Font.Name Métodos Os métodos traduzem acções que um macro pode realizar sobre os objectos. Por exemplo, aplicar o método Save ao objecto ActiveDocument implica desencadear o processo de salvaguarda do conteúdo do documento activo num determinado ficheiro. Aplicar o método Clear a um objecto da classe ListBox (tratada na Secção na página 36) terá como consequência a eliminação de todas as linhas nele contidas. A cada classe de objectos é possível aplicar um determinado conjunto de métodos. Para vermos como um método é aplicado a um objecto, vamos considerar o objecto Worksheet, que representa uma folha de cálculo do Excel. Se pretendermos que o nosso macro mova essa folha para uma nova posição dentro do Livro de Trabalho (Workbook), ele deverá aplicar o método Move a esse objecto, usando a seguinte sintaxe: Worksheet.Move([Before][, After]) Exemplificando, se quisermos que o macro desloque a folha de cálculo "Dados 2009"para a posição imediatamente a seguir à folha "Dados 2008", o comando a inserir no macro será: Worksheets("Dados 2009").Move Before:=Worksheets("Dados 2008") Como veremos mais à frente, o objecto Worksheet é definido como um elemento do 24
25 conjunto de folhas de cálculo contidas no Livro de Trabalho. Este conjunto de folhas é representado por Worksheets(). Assim sendo, Worksheets("Dados 2009") refere-se à folha de cálculo com o nome "Dados 2009". Outro método útil é o que permite referenciar uma célula individual pertencendo a um objecto do tipo "Range"(gama de células) ou Worksheet. Trata-se do método Cells, com a seguinte sintaxe: Objecto.Cells(Linha,Coluna) Se a indicação de Objecto for omitida, partir-se-á do princípio que nos referimos à folha de cálculo activa. A instrução seguinte, por exemplo, copia o valor contido na célula C2 para a variável temp: temp = Cells(2,3) Outra forma de referir uma célula individual é usar a notação utilizada pelo Excel para referenciar células, envolvendo-a em parêntesis rectos. O exemplo anterior ficaria assim: temp = [C2] Eventos Os eventos resultam de acções que, uma vez exercidas sobre um objecto, implicam a possibilidade de ocorrer uma resposta automática por parte dele. Basicamente, um evento é algo que acontece a um objecto. Por exemplo, a abertura de uma folha de um livro de trabalho (workbook) em Excel é um evento. A inserção de uma nova folha no livro de trabalho é outro exemplo de evento. Para que um objecto possa reagir a um dado evento deverá existir, previamente programado, um procedimento especial, chamado event handler (tratador de eventos), que vai especificar o que fazer caso esse evento ocorra. Sem isso, o objecto detectará esse acontecimento mas não saberá o que fazer. Nenhuma resposta será produzida. Figura 10: Lista de eventos disponíveis Na Figura 10 pode ver-se a janela de escrita de código de macros. Na parte de cima, 25
26 à direita, pode ser acedida a lista de eventos disponíveis para o objecto Worksheet 12. Seleccionando um dos eventos, será possível construir o procedimento event handler que permita ao objecto Worksheet reagir a esse evento. O cabeçalho e o delimitador final são criados automaticamente pelo editor do VBA, sendo da responsabilidade do programador a inclusão das instruções necessárias. Na figura são referidos vários eventos que podem ocorrer no objecto Worksheet, tais como o Activate que ocorre sempre que uma folha de cálculo se torna activa, ou o Change que é desencadeado por qualquer alteração ao seu conteúdo. Assim sendo, um mesmo objecto, por exemplo, a Worksheet pode estar preparada para reagir a diferentes eventos, desde que possua event handlers específicos para esses eventos. Figura 11: Objectos e Eventos Para tentar esclarecer melhor o conceito de evento e a questão de como organizar a resposta do objecto a um evento, vamos apresentar um exemplo utilizando apenas objectos gráficos dispostos numa form. Repare-se na Figura 11: o que se pretende aqui é um macro capaz de verificar se um dado número inteiro, introduzido pelo utilizador usando a interface descrita na figura, é ou não um número primo. Parte-se do princípio que todos sabem o que é um número primo e não nos vamos agora debruçar sobre os 12 Isto porque as diferentes classes de objectos não são necessariamente sensíveis aos mesmos tipos de eventos. 26
27 detalhes do código que o event handler deverá conter para produzir o efeito desejado. Preocupemo-nos, de momento, apenas com as interacções entre as várias entidades que intervêm no processo. Como é visível na Figura 11 na página precedente, existem na interface vários objectos (chamados controlos). Entre eles, têm particular interesse para esta discussão a caixa de texto txt1, o rótulo lbl2 e o botão de comando command1. Quando o utilizador pretende utilizar o macro, uma vez este invocado, deverá introduzir o número a testar em txt1 e pressionar ("clicar") o botão command1. Quando isso acontece, diz-se que ocorreu um evento click no botão command1. Se esse botão não dispuser de nenhum event handler para lidar com esse tipo de evento, nada se passará. No entanto, se se tiver previamente associado a esse objecto (command1 ) um event handler adequado, o objecto será já capaz de responder ao evento e produzir o resultado desejado. Neste caso, o resultado deverá ser efectuar os cálculos necessários para concluir se o número introduzido é ou não primo e apresentar essa conclusão no rótulo lbl Os objectos do Excel mais comuns Já vimos que um documento Word ou Excel é, em si mesmo, um objecto. Se bem que não lhe possamos tocar, podemos claramente vê-lo e interagir com ele de múltiplas formas, seja alterando o conteúdo de células (no caso do Excel), seja mudando formatos ou inserindo linhas e colunas. Por sua vez, todos estes elementos são, eles também, objectos. Nas aplicações Office, os objectos estão organizados de forma hierárquica. O objecto mais geral é o Application, e dentro dele existem múltiplos objectos de nível progressivamente inferior Como trabalhar com as propriedades dos objectos Excel Como já vimos, os objectos possuem características próprias, chamadas propriedades. A sintaxe genérica para nos referirmos a uma propriedade de um objecto é a seguinte: Objecto.Propriedade Se nos quisermos referir, por exemplo, à propriedade ActiveWindow do objecto Application, procederemos do seguinte modo: Application.ActiveWindow A propriedade ActiveWindow refere-se à janela da aplicação com que estamos, de momento, a trabalhar. No caso do Excel, podemos ainda referir-nos, por exemplo, à propriedade ActiveSheet para designar a folha de cálculo em que se está a trabalhar ou a ActiveCell para nos referirmos à célula actualmente seleccionada. Se pretendermos, por exemplo, especificar o tipo de letra da célula activa, usaremos a seguinte descrição de objecto: Application.ActiveWindow.ActiveCell.Font.Name Esta descrição ilustra a relação hierárquica existente entre os objectos do Excel. Na prática, quando nos estamos a referir a uma propriedade da janela activa da aplicação como seja a ActiveCell, não precisamos, no entanto, de referir que pertence à 27
28 ActiveWindow e à Application. Podemos omitir esses detalhes e apenas escrever: ActiveCell.Font.Name Se quisermos utilizar esta propriedade para mudar o tipo de letra da célula activa, utilizaremos então uma instrução como a seguinte 13 : ActiveCell.Font.Name = "Helvetica" Note-se que estamos aqui a utilizar uma propriedade como uma variável cujo conteúdo pode ser modificado. De facto, uma propriedade pode ser vista como uma variável especial associada a um dado objecto. Se, ao contrário, quisermos obter o valor de uma dada propriedade, a instrução a usar será do tipo: variavel = Objecto.Propriedade Para obtermos, por exemplo, o conteúdo da célula activa da folha de cálculo, a instrução correcta seria: conteudo = ActiveCell.Value Estaremos, assim, a usar a propriedade Value do objecto ActiveCell. Nessa propriedade encontra-se armazenado o conteúdo da célula Como aplicar métodos aos objectos Vimos na Secção na página 24, que os métodos de uma classe de objectos descrevem as acções que podemos executar sobre eles ou, por outras palavras, aquilo que podemos fazer com eles. Na sua forma mais simples, a sintaxe usada para aplicar um método a um objecto é similar à usada para trabalhar com as suas prorpiedades: Objecto.Método Um exemplo da aplicação de um método a um objecto, usando esta sintaxe, é o seguinte: Worksheets("Leituras").Activate Estamos aqui a aplicar o método Activate ao objecto Worksheets("Leituras"), o que tem como consequência que essa folha de cálculo se tornará activa. No entanto, muitas vezes, os métodos exigem informação adicional para poderem executar o seu trabalho. Essa informação adicional será fornecida através de argumentos, inseridos a seguir ao nome do método aplicado: Objecto.Método (argumento1, argumento2....) O seguinte exemplo abre um Livro de Trabalho pré-existente com o nome "Dados.xls": Workbooks.Open("Dados.xls") 13 Trata-se de uma operação de atribuição, descrita na Secção 3.5 na página 20 28
29 Muitas vezes, os argumentos que se podem fornecer a um método são opcionais. Por exemplo, a instrução abaixo adiciona (insere) uma nova folha de cálculo imediatamente antes da folha com o nome "Dados_Jan": Worksheets.Add Before:=Worksheets("Dados_Jan") No entanto, caso seja omitido o argumento Before, a nova folha será inserida antes da folha de cálculo activa. É esse o comportamento por defeito do método Add. 4.3 Objectos gráficos Vão agora ser apresentados de forma mais sistemática alguns dos objectos e facilidades necessários para realizar interfaces gráficas simples. Essas interfaces vão permitir que os macros tenham uma interacção directa com o utilizador, requerendo e fornecendo informação. A forma mais simples de o macro interagir com o utilizador é através de duas funções: MsgBox e InputBox MsgBox A função MsgBox permite apresentar no ecran uma Caixa de Mensagem (Msg Box). Trata-se de uma pequena janela contendo uma mensagem, pelo menos um botão de comando e eventualmente um pequeno desenho (ícone) ilustrativo do tipo de mensagem. Na Figura 12 encontra-se um exemplo de uma destas janelas. Figura 12: Exemplo de MsgBox Uma Caixa de Mensagem destina-se a apresentar ao utilizador uma mensagem com informação relevante, sejam avisos, resultados, perguntas ou sugestões. Uma janela deste tipo tem um comportamento peculiar: enquanto não for premido um dos seus botões, não será possível qualquer outra interacção com o computador, já que essa janela tomou o controlo. O utilizador é assim obrigado a atender à mensagem apresentada. A sintaxe da função MsgBox é a seguinte: MsgBox(Mensagem, Características, Título) Em que os argumentos são: 29
30 Mensagem Características Título Texto a apresentar (máximo de 1024 caracteres) Valor numérico que especifica o número de botões, o tipo do ícone e o botão de defeito (com o focus ), obtido pela soma de três valores parciais (opcional) Conteúdo da barra de título da janela (opcional) O 2 o argumento será calculado usando os valores da Tabela 3. Assim, para obter o valor do parâmetro características, será preciso somar três valores, um de cada coluna da Tabela 3, cada um deles especificando uma das características (Botões de Comando, Ícone e qual o botão com o "focus" 14 ). Botões de Comando Ícone Botão com o focus 0 - OK 0 - Nenhum 0-1 o Botão 1 - OK, Cancel 16 - Mensagem Crítica o Botão 2 - Abort, Retry, Ignore 32 - Mensagem de Aviso a Botão 3 - Yes, No, Cancel 48 - Mensagem de Aviso Yes, No 64 - Mensagem de Informação 5 - Retry, Cancel Tabela 3: Valores de configuração das características de uma Caixa de Mensagem No caso da Figura 12 na página precedente, os valores a somar seriam os seguintes: = 17 A MsgBox serve então para apresentar uma mensagem ao utilizador. No entanto, permite também recolher informação. Quando a caixa de mensagem apresenta mais do que um botão, está-se a pedir ao utilizador que escolha uma de entre duas ou três alternativas. Dependendo de qual o botão premido pelo utilizador, assim o valor numérico devolvido pela função MsgBox será um de entre 7 valores possíveis, descritos na Tabela 4. Constante Valor Botão seleccionado vbok 1 OK vbcancel 2 Cancel vbabort 3 Abort vbretry 4 Retry vbignore 5 Ignore vbyes 6 Yes vbno 7 No Tabela 4: Valores devolvidos por uma Caixa de Mensagem De notar que caso a tecla ESC (Escape) seja premida o valor devolvido será 2, a que corresponde o botão Cancel (o que indica que as duas acções são equivalentes). 14 O botão com o "focus" ou botão de defeito é aquele que será accionado automáticamente caso o utilizador prima a tecla Enter ou Return. 30
31 Quando se pretende aproveitar o valor devolvido pela função MsgBox será necessário usá-la com a seguinte sintaxe: Variável = MsgBox(Mensagem, Características, Título) Desta maneira, o valor devolvido pela função será guardado (atribuído) em Variável, podendo depois ser avaliado por instruções seguintes. Quando, pelo contrário, não haja interesse em aproveitar o valor devolvido pela função (tipicamente quando há apenas um botão), a sua invocação poderá fazer-se da seguinte forma: MsgBox Mensagem, Características, Título InputBox A função InputBox permite apresentar ao utilizador uma mensagem com uma questão, recolhendo ao mesmo tempo uma string contendo a sua resposta. Assim, ao contrário da função MsgBox (Secção na página 29), esta função produz um resultado do tipo string e não do tipo integer. Figura 13: Exemplo de InputBox Como pode ser visto na Figura 13, esta função cria um objecto composto (uma Caixa de Entrada) incluindo um caixa de texto, dois botões 15 e um rótulo dentro de uma pequena janela. A sua sintaxe é Variável = InputBox (mensagem, título, valor_de_defeito, xpos, ypos) Em que os argumentos são: Mensagem Título valor_de_defeito xpos e ypos Texto da mensagem a afixar na Caixa de Entrada (máximo de 1024 caracteres) Conteúdo da barra de título da janela (opcional) Texto a colocar à partida na caixa de texto da Caixa de Entrada (opcional) Coordenadas da Input Box relativamente aos bordos esquerdo e superior do ecrã (opcionais) 15 Ao contrário da MsgBox, neste caso os dois botões são fixos. Por outro lado, a tecla ESC tem o mesmo comportamento. 31
32 4.3.3 Forms Como vimos no início da Secção 4 na página 22, uma interface gráfica (em terminologia VBA, uma DialogBox) é construída dispondo os objectos adequados (genericamente designados por controlos) sobre uma janela especial, a form. Efectivamente uma form é utilizada como um contentor para outros objectos gráficos. Um objecto da classe User- Form pode ser criado no Editor do VBA através do Menu "Insert/User Form". Esse processo será visto em detalhe na Secção 9 na página 76. A seguir são apresentadas algumas das principais propriedades que podem ser configuradas numa Form: Name Caption BackColor Enabled ShowModal Font Height Width especifica o nome pelo qual a Form será identificada especifica o título que figura no topo da Form permite seleccionar a cor do fundo controla a utilização da Form pelo utilizador permite alterar o comportamento da Form de modo a controlar o acesso à aplicação enquanto a Form estiver activa controla o tipo e tamanho da letra utilizada especifica a altura da Form especifica a largura da Form Nas próximas secções, referiremos com algum detalhe os controlos de uso mais comum na construção de dialogboxes em VBA. Estes são os objectos que mais frequentemente são colocados numa form Botões de Comando Um botão de comando (objecto commandbutton), como o próprio nome sugere, é utilizado para permitir ao utilizador dar ordens (comandos) ao programa. Como se pode verificar na Figura 11 na página 26, é a este tipo de controlos que normalmente se associam as sub-rotinas que permitem responder a eventos como o clicar de um rato. As propriedades normalmente referidas em relação a esta classe de objectos são as que controlam as dimensões (Height e Width) e a propriedade Caption que permite especificar o texto afixado. A instrução seguinte serve de exemplo de como alterar programaticamente o estado de um botão de comando: cmdarranque.enabled = True O que fizemos com a instrução acima foi atribuir o valor booleano (lógico) True à propriedade Enabled 16 do botão de comando cmdarranque Rótulos Os rótulos, também designados por etiquetas (label) são usados para apresentar texto na interface. Mais uma vez, a propriedade mais utilizada é a propriedade Caption, que permite especificar o texto a apresentar. Este controlo é usado não só para apresentar 16 Esta propriedade permite controlar o acesso do utilizador ao botão de comando. 32
33 informação estática, que é escolhida na fase de concepção da interface, como também informação dinâmica, como seja a usada na apresentação de resultados: lblresultado.caption = "O valor total é 235 metros" A instrução acima atribui à propriedade Caption do rótulo lblresultado a string "O valor total é 235 metros", o que vai ter como consequência a sua afixação na interface. Funções Val e Str A linguagem VBA dispõe de um grande número de funções pré-definidas. Duas delas, relacionadas com "strings", são particularmente úteis para lidar com objectos da classetextbox e Label: Função Val() Str() Descrição Retorna como valor numérico um número contido dentro duma string Retorna uma string representando um número Vamos supor que um macro precisa de calcular o peso total à custa de dois valores introduzidos pelo utilizador através de duas TextBox. A tentação seria usar a instrução: pesototal = txt1.text + txt2.text No entanto, o que a propriedade Text das TextBox contem é apenas texto, ainda que contendo algarismos. Para extrair a informação numérica de dentro do texto, haverá que utilizar a função Val(): pesototal = Val(txt1.Text) + Val(txt2.Text) A função str(), por seu lado, converte um valor numérico num texto contendo esse valor. Uma utilização típica é a de permitir compor strings como a do exemplo apresentado na Secção A string "O valor total é de 35 metros"pode ser composta usando o símbolo "+"como operador de concatenação (colagem) de texto, numa instrução como a seguinte: texto = "O valor total é de "+ str(res) + "metros" O símbolo "+"tanto pode ser interpretado como operador de adição como de concatenação. Essa ambiguidade é desfeita pelo VBA, analizando o tipo dos seus operandos. Se forem ambos numéricos, será realizada uma adição. Se forem ambos texto, será feita uma colagem. Se forem de tipo diferente, ocorrerá um erro. Para que na instrução atrás, isso não ocorra, é preciso usar a função str() para converter para string o conteúdo numérico da variável res. Agora, já poderemos perceber qual o resultado da primeira instrução apresentada (pesototal = txt1.text + txt2.text): ocorrerá a colagem do texto contido nas duas TextBox, em vez da soma dos correspondentes valores numéricos Caixas de Texto As caixas de texto (objecto TextBox) são uma classe de controlos muito versáteis que permitem a introdução pelo utilizador de diversos tipos de informação: texto, valores 33
34 numéricos e, no caso do Excel, referências a células e mesmo fórmulas. Algumas das suas propriedades mais importantes são: Text MaxLenght MultiLine Permite obter ou alterar o texto contido no objecto. Especifica o tamanho máximo do texto (em caracteres) que o utilizador pode introduzir. Permite escolher entre permitir ou não a apresentação do texto em várias linhas. Enquanto que os rótulos (Label) são utilizados pelo programa para apresentar informação ao utilizador, já as caixas de texto (Text Box) são geralmente usadas para permitir a leitura de informação pelo programa Botões de Opção Estes objectos permitem ao utilizador efectuar escolhas entre diversas alternativas. São compostos pelo botão propriamente dito (de forma circular) e um pequeno texto que o acompanha, controlado pela propriedade Caption do objecto. Figura 14: Vários optionbutton agrupados numa frame Os botões de opção são geralmente agrupados em conjuntos de dois ou mais, estando interligados entre si, já que, ao mesmo tempo, só é possível que esteja um botão seleccionado dentro do mesmo grupo de botões de opção. Encontram-se muitas vezes inseridos em frames (Secção na página seguinte). Para além de Caption, outra propriedade importante dos botões de opção é a propriedade Value, que pode assumir o valor True ou False conforme o botão se encontre ou não seleccionado Caixas de Verificação Estes objectos comportam-se de forma semelhante à dos botões de opção mas, neste caso, é possível encontrar vários controlos deste tipo activados simultaneamente na mesma form, visto que tais objectos funcionam de forma independente (isto é, não se encontram relacionados entre si). Possuem também uma propriedade Value que, neste caso, pode apresentar os seguintes valores: 34
35 Figura 15: Vários checkbox agrupadas numa frame 0 não activada 1 activada 2 não disponível O texto a inserir junto de cada caixa de verificação deve ser especificado mediante a propriedade Caption Quadros (Frames) Tais objectos destinam-se a agrupar outros objectos (controlos). São usados muitas vezes para organizar um dado conjunto de botões de opção (Secção na página precedente), tornando-os independentes de outros botões de opção eventualmente existentes na mesma form. Figura 16: Uma Frame agrupando três botões de comando É importante criar o quadro antes de aí inserir os controlos. Se o controlo fôr criado antes do quadro, não será possível deslocá-lo para dentro do quadro após este ter sido criado. Uma vez inserido um objecto dentro do quadro, esse quadro passa a constituir o contentor desse objecto. Quer isto dizer que a sua localização passa a ser definida não em relação à form mas em relação ao quadro que o contem. Outra utilidade dos quadros é servir de moldura a um dado conjunto de controlos, de modo a melhorar a aparência e a organização da form em que estão inseridos, agrupando os diversos controlos de acordo com as suas funcionalidades. 35
36 Caixas de Listagem Este objecto serve para apresentar listas e permite que o utilizador escolha uma ou mais opções dentro de uma dada lista. Esta lista é apresentada numa caixa própria (com uma barra de deslocamento vertical à direita, no caso de a lista ser mais extensa que o número de linhas disponível na caixa). Figura 17: Exemplo de listbox Os elementos da lista podem ser especificados à partida usando a propriedade List, ou ser acrescentados durante a execução do programa usando o método AddItem: listbox.additem elemento ou listbox.additem elemento, posição em que elemento posição é o novo elemento a acrescentar à lista refere-se à posição na lista em o elemento vai ser inserido Na primeira variante acima o elemento será inserido a seguir à última linha preenchida, desde que a lista não seja ordenada. Se a propriedade Sorted (ver tabela abaixo) estiver activa (True), qualquer inserção de nova linha será feita na posição adequada para manter a lista ordenada A remoção de um elemento da lista pode ser feita mediante o método RemoveItem: Listbox.RemoveItem posição A remoção simultânea de todas as linhas da caixa de listagem pode ser conseguida aplicando-lhe o método Clear (este método não necessita de qualquer argumento): Listbox.Clear As propriedades mais relevantes desta classe de objectos são: 36
37 ListCount Sorted ColumnCount ColumnHeads MultiSelect ListIndex List Text RowSource permite conhecer em qualquer momento o número de elementos contidos na lista permite especificar se a lista é ou não apresentada de maneira ordenada especifica qual o número de colunas em que a lista é apresentada controla os cabeçalhos das colunas permite controlar a forma de selecção de elementos na lista: 0 - só é possível seleccionar um elemento 1 - é possível seleccionar vários elementos simultaneamente, pressionando cada elemento 2 - é possível seleccionar vários elementos simultaneamente, usando a tecla Ctrl fornece ou especifica qual o índice do item actualmente seleccionado (ou 1 caso nenhum esteja). Sintaxe: objecto.listindex [= indice] permite aceder aos elementos duma lista, quer para os ler, quer para os modificar. Sintaxe: objecto.list(indice) [= string] permite obter o elemento actualmente seleccionado. Sintaxe: variavel = objecto.text especifica qual a gama de células de uma folha de cálculo Excel em que se encontra a informação a incluir na lista, ou seja, a fonte dos dados a apresentar. Na especificação de sintaxe, os parêntesis rectos indicam que o seu conteúdo é opcional. No caso das propriedades ListIndex e List descritas acima, a versão curta destina-se a ser usada do lado direito de uma operação de atribuição, enquanto que na versão completa o que se pretende é atribuir um valor à propriedade. Existe uma variante da ListBox, chamada ComboBox, que combina uma TextBox com uma ListBox. O utilizador pode introduzir um item na TextBox ou seleccioná-lo na lista que, estando normalmente escondida, só aparecerá quando se clica num ícone próprio. É normalmente utilizada quando se pretende dar a possibilidade de escolher um elemento de uma lista mas sem ocupar muito espaço na form. 4.4 Interface gráfica sem uma Form É possível criar uma interface gráfica para um macro sem ter que usar uma form onde se instalem os diferentes controlos. Nesse caso, os controlos serão instalados directamente na própria folha de cálculo, numa área reservada para o efeito. Um exemplo pode ser observado na Figura 18 na página seguinte. A interface descrita utiliza um botão de comando e dois botões de opção. Para a instalação desta interface, deve usar-se a Caixa de Ferramentas dos Controlos activada através da Barra de Ferramentas de VBA descrita na Figura 3 na página 11. Esta Caixa de Ferramentas pode ser vista na parte inferior da Figura 18 na página seguinte. Nesta Caixa é possível escolher-se qual o controlo que se pretende 37
38 Figura 18: Interface construída directamente na folha de cálculo instalar seleccionando o ícone respectivo, após o que se desenhará com o rato na própria folha de cálculo a área que esse controlo vai ocupar. A sua posição e dimensões definitivas poderão ser afinadas quer com o rato quer manipulando as propriedades correspondentes na janela de Propriedades. 38
39 5 Estruturas de controlo do programa Um macro é um programa escrito na linguagem VBA. Vamos agora começar a analizar mais em detalhe a estrutura de um programa. Um programa é composto por um conjunto de instruções, cada uma delas executando uma tarefa específica. A sequência de instruções levará à solução do problema que o programa se propõe resolver. Mas essa sequência não tem que ser necessariamente linear, i.e., composta por uma lista de instruções que serão realizadas uma após outra, de forma imutável. Isso tornaria o programa inflexível, incapaz de se adaptar às circunstâncias ou aos diferentes desejos do utilizador. Já foi introduzida na Secção 3.5 na página 20 a noção de operação de atribuição. Com essa operação podemos criar instruções simples, mediante as quais é possível copiar valores entre variáveis, ou armazenar resultados do cálculo de expressões. Mas um programa flexível não poderá ser construído apenas com instruções desse tipo. É preciso dispor de instruções que permitam alterar o fluxo do programa. Para tal, vamos introduzir estruturas de controlo que possibilitam a alteração desse fluxo. 5.1 Estruturas de controlo condicional Uma estrutura de controlo fundamental é a estrutura condicional, ou de selecção. Usando esta estrutura, as instruções podem ser executadas condicionalmente. Se uma dada condição fôr verdadeira, será executada uma dada sequência de instruções. Se fôr falsa, uma sequência diferente será escolhida If...Then...Else Figura 19: Estrutura de controlo condicional If...Then...Else 39
40 A Figura 19 na página anterior descreve a estrutura condicional If...Then...Else. Como o seu nome sugere, esta estrutura está baseada no teste de uma condição. Se essa condição fôr verdadeira, desencadeará a execução das instruções representadas na figura por Bloco de Instruções1. Em caso contrário, será executado o Bloco de Instruções 2. A sintaxe desta estrutura é: 1 I f condicao Then 2 [ i n s t r u c o e s ] 3 Else 4 [ i n s t r u c o e s a l t e r n a t i v a s ] 5 End I f Quando a condição é verdadeira serão executadas as instruções delimitadas por Then e Else. Em caso contrário, será executado o bloco alternativo de instruções. A condição pode consistir numa comparação ou outra operação lógica, ou ainda em qualquer expressão de que resulte um valor numérico: um valor não nulo será interpretado como Verdadeiro, enquanto um valor nulo será considerado como Falso. A condição é, portanto, uma expressão booleana (lógica). Uma expressão booleana representa um valor booleano, TRUE (verdadeiro) ou FALSE (falso) e pode ser constituída por uma variável, uma função ou uma combinação destas entidades através de operadores If...Then Figura 20: Estrutura de controlo condicional If...Then Quando numa estrutura condicional não existe qualquer acção a executar quando a 40
41 condição seja falsa, usa-se uma variante simplificada, a If...Then. O seu diagrama está descrito na Figura 20 na página precedente. A sua sintaxe será então: 1 I f condicao Then 2 [ i n s t r u c o e s ] 3 End I f Nesta 2 a variante, quando a acção a realizar no caso a condição ser verdadeira puder ser executada com apenas uma instrução, é possível ainda utilizar a seguinte sintaxe simplificada, sem o delimitador End If e sem mudança de linha: If condicao Then instrucao Expressões lógicas As expressões lógicas, utilizadas nas condições das estruturas de controlo, são construídas utilizando operadores lógicos específicos. A linguagem VBA prevê os seguintes operadores lógicos, utilizáveis em expressões: Operador Descrição > Maior que < Menor que = Igualdade <= Menor ou igual >= Maior ou igual <> Desigualdade And E Or Ou Not Negação Dos primeiros seis operadores não haverá muito a dizer. Já do And e do Or haverá alguns detalhes a esclarecer: AND Sintaxe: Expr1 And Expr2 Se Expr1 e Expr2 forem ambas verdadeiras, a expressão será verdadeira Basta que quer Expr1 quer Expr2 seja falsa, para a expressão ser falsa OR Sintaxe: Expr1 Or Expr2 Se Expr1 e Expr2 forem ambas falsas, a expressão será falsa. Basta que quer Expr1 quer Expr2 seja verdadeira, para a expressão ser verdadeira 41
42 5.1.3 Estruturas condicionais embutidas É possível construir estruturas de controlo mais complexas, oferecendo ao programa a capacidade de escolher uma de entre várias alternativas possíveis. Estas estruturas condicionais embutidas ou encadeadas são construídas inserindo estruturas condicionais dentro de outras estruturas condicionais. Isso pode realizar-se de dois modos. O primeiro método implica utilizar a palavra reservada ElseIf. A sintaxe desta estrutura é: 1 I f condicao1 Then 2 Accao1 3 ElseIf condicao2 Then 4 Accao2 5 ElseIf condicao3 Then Else 8 AccaoN 9 EndIf Esta estrutura condicional permite a selecção de uma entre várias alternativas mutuamente exclusivas. As instruções que se seguem à palavra reservada Else (aqui representadas por "AcçãoN") serão executadas apenas se nenhuma das condições se tiver verificado. É possível imbricar um qualquer número de blocos ElseIf dentro de uma dada estrutura condicional. As estruturas condicionais produzidas usando o método alternativo não são tão compactas mas tornam-se talvez mais legíveis, sobretudo se se usar a indentação apropriada: 1 I f condicao1 Then 2 Accao1 3 Else 4 I f condicao2 Then 5 Accao2 6 Else 7 I f condicao 3 8 Accao 3 9 Else 10 Accao4 11 End I f 12 End I f 13 EndIf Na Figura 21 na página seguinte pode-se ver o fluxograma de uma estrutura imbricada com quatro vias alternativas. A Acção 1 é executada caso a 1 a condição seja verdadeira. A Acção 3 será executada caso a Condição 3 for verdadeira e as duas anteriores falsas. A Acção 4 será executada caso todas as quatro condições se tiverem verificado falsas. Chama-se a esta acção, a acção por defeito, ou seja, aquilo que se faz quando todo o resto falha. É muito importante que se compreenda que estamos aqui a tratar de verdadeiras alternativas, i.e., mútuamente exclusivas. Cada vez que uma estrutura deste tipo é executada, 42
43 Figura 21: Estruturas de controlo condicional imbricadas só uma das acções será efectuada. Pode dizer-se que, genericamente, para um programa poder escolher uma de entre N alternativas, será necessário utilizar N - 1 estruturas condicionais encadeadas. O exemplo da Listagem 3 traduz uma situação em que o programa, confrontado com a necessidade de classificar uma nota numérica, pode escolher uma de entre seis notas qualitativas diferentes. Só várias estruturas condicionais encadeadas permitirão resolver esse problema. Listing 3: Exemplo de aplicação de If..Then..Else imbricados 1 I f ( nota < 0) Or ( nota > 20) Then 2 r e s u l t a d o = "Nota I n v a l i d a! " 3 ElseIf nota < 6 Then 4 r e s u l t a d o = "Mau" 5 ElseIf nota < 10 Then 6 r e s u l t a d o = " Mediocre " 7 ElseIf nota < 14 Then 8 r e s u l t a d o = " S u f i c i e n t e " 9 ElseIf nota < 17 Then 10 r e s u l t a d o = "Bom" 11 Else 12 r e s u l t a d o = "Muito Bom" 13 End I f 43
44 5.2 Estruturas de controlo repetitivo Como vimos, as estruturas de controlo condicional permitem alterar o fluxo do programa, ou seja, executar diferentes sequências de instruções conforme as circunstâncias do momento. As estruturas de controlo repetitivo (também conhecidas por estruturas de repetição ou ciclos) permitem repetir um dado conjunto de instruções o número de vezes que fôr necessário. Existem diversas variantes de ciclos, diferindo umas das outras pela forma como é controlada a execução das instruções contidas no corpo do ciclo. Genericamente, pode-se dizer que uma estrutura de controlo repetitiva assegura a execução repetida de um dado conjunto de instruções dependendo do resultado do teste de uma determinada condição de funcionamento. De facto, como veremos, também os ciclos dependem da verificação de uma condição, normalmente de forma explícita, noutros casos definida implicitamente Estruturas de Controlo Do...Loop Estão disponíveis quatro variantes deste ciclo: Do...While e Do...Until, com teste da condição no princípio ou no fim. Vejamos em detalhe as diversas variantes. O fluxograma da primeira encontra-se na Figura 22: Figura 22: Estrutura de controlo repetitivo Do...While Analizando esse fluxograma, pode observar-se que tudo roda à volta do teste a uma condição, descrita como condição de funcionamento. Se a condição for verdadeira na altura em que o teste é realizado, as instruções que compõem o chamado corpo do ciclo serão executadas, após o que novo teste à condição será efectuado. Enquanto a condição se verificar ser verdadeira, o programa não sairá deste ciclo. Na 1 a vez em que a condição se mostrar falsa, o ciclo terminará e o programa poderá continuar com as instruções seguintes. Chama-se corpo do ciclo ao conjunto de instruções que serão executadas em cada iteração (repetição) do ciclo. Esse conjunto pode incluir qualquer número de instruções e de qualquer tipo, mesmo outras estruturas de repetição. Neste último caso, estaremos 44
45 perante o que se designa por ciclos imbricados ou embutidos, que serão tratados em detalhe na Secção na página 52. A sintaxe em VBA desta estrutura de controle é a seguinte: 1 Do While condicao 2 [ i n s t r u c o e s ] 3 Loop A segunda variante é muito semelhante à primeira. A grande diferença diz respeito à condição de controle. Neste caso, temos a chamada condição de termo (ou de paragem) o que faz com que o ciclo funcione enquanto a condição for falsa ou, por outras palavras, até que a condição de termo seja verdadeira (Figura 23). Figura 23: Estrutura de controlo repetitivo Do...Until A sintaxe da variante Do...Until será então: 1 Do 2 [ i n s t r u c o e s ] 3 Loop Until condicao Como nesta variante o teste da condição é feito no fim, as instruções constantes do corpo do ciclo serão garantidamente executadas pelo menos uma vez. Tal pode ou não verificar-se conveniente. É possível transformar uma estrutura Do...While numa Do...Until desde que se substitua a palavra While pela Until e se negue a condição de controlo. Escolher uma ou outra estrutura de controlo depende, no fundo, do jeito do programador e, sobretudo quando se usam condições múltiplas, da forma como a expressão lógica traduz com maior ou menor facilidade a condição expressa em linguagem corrente Ciclos controlados por contador Usando como base estas duas estruturas de controlo repetitivo é possível construir dois tipos de ciclos: ciclos controlados por um contador e ciclos controlados por aquilo que se designa como sentinela. Comecemos pelos primeiros. 45
46 Um ciclo controlado por contador baseado na estrutura Do..While pode assumir a seguinte forma genérica: 1 contador = v a l o r _ i n i c i a l 2 Do While contador <= v a l o r _ f i n a l 3 Corpo do Ciclo 4 contador = contador Loop Figura 24: Ciclos controlados por contador Decorrendo do que vimos na secção anterior, torna-se claro que é igualmente possível construir este ciclo usando a estrutura Do..Until. Há que ter em conta as seguintes questões na construção de um ciclo controlado por contador usando as estruturas de controlo Do...While ou Do...Until: Inicializar a variável contadora Especificar a condição de funcionamento do ciclo Incluir no corpo do ciclo uma instrução que incremente ou decremente a variável contadora. 46
47 Quando se usam estas estruturas, ao contrário do que se passa com a estrutura de repetição For...To...Next, a analizar na Secção na página 50, é da responsabilidade do programador assegurar-se de que tais acções são correctamente executadas conforme está espelhado no diagrama de fluxo representado na Figura 24 na página anterior. Um último aspecto a observar é o seguinte: só é viável construir um ciclo controlado por contador quando se pode conhecer à partida o número de vezes que ele vai funcionar ou, por outras palavras, o número de repetições necessárias. Isso nem sempre é possível. Nesses casos, a alternativa será usar ciclos controlados por sentinela Exemplo integrador Vamos agora considerar o seguinte exemplo que permite integrar a utilização de algumas propriedades importantes do controlo "listbox" com a aplicação de um ciclo controlado por contador para obter a soma dos valores numéricos contidos na "listbox". Aproveitase ainda para ilustrar a forma de tratar certos eventos ocorridos em objectos presentes na interface. A ocorrência desses eventos bem como a resposta que lhes é dada é descrita na Figura 25. Figura 25: Exemplo integrador - Interface O que se pretende do programa é que demonstre o seguinte comportamento: Quando se "clica" directamente na própria listbox a resposta do objecto deverá consistir na apresentação na label "Label1" do conteúdo da linha seleccionada. Se, em vez de um click, ocorrer um duplo click, já a resposta respectiva deverá consistir na apresentação na mesma label do número da linha actualmente seleccionada. Estaremos, assim, perante uma resposta diferenciada do mesmo objecto a dois eventos de tipo diferente. 47
48 Quando se "clica" no botão de comando "cmdtotal", a resposta desse objecto deverá ser o cálculo do somatório do conteúdo de cada linha da listbox e a sua apresentação na label "Label2". Figura 26: Exemplo integrador - Código O código das sub-rotinas tratadoras de eventos associadas à caixa de listagem e ao botão de comando encontra-se na Figura 26. Analizando esse código, são pertinentes as seguintes observações: Na sub-rotina lstvalores_click() é codificada a resposta do objecto lstvalores ao evento Click. Nela, apenas se atribui ao label "Label1" um texto resultante da concatenação (colagem) da string "Conteúdo: " com o conteúdo da linha seleccionada na ListBox, fornecido pela propriedade Text desse objecto. Na sub-rotina lstvalores_dblclick() é codificada a resposta do objecto "lstvalores"ao evento Duplo Click. É realizada uma operação análoga à anterior, usando, desta vez, a propriedade ListIndex da ListBox. A sub-rotina cmdtotal_click() instrui o botão de comando "cmdtotal" sobre o que fazer caso nele ocorra um evento Click. O código utilizado usa uma estrutura de controlo repetitivo, neste caso um ciclo Do..While que, para cada linha da ListBox, actualiza a variável soma com o conteúdo da linha especificada pelo valor contido na variável c. Esta variável é usada para construir um contador que monitorize o número de linhas cujo conteúdo se está a somar. O seu valor inicial é 0 e, para cada iteração (repetição) do ciclo, será incrementada de uma unidade. O ciclo terminará quando 48
49 o conteúdo da variável c for maior que o número de linhas da ListBox menos O número de linhas da ListBox é fornecido pela propriedade ListCount Ciclos controlados por sentinela Quando não é possível conhecer antecipadamente o número de vezes que o ciclo deverá ser executado é necessário usar uma técnica diferente: ciclos controlados por sentinela. Por sentinela deve entender-se um valor limite que assinala o fim de uma dada sequência de valores, mas que não esteja incluído nessa sequência. Exemplo Se o utilizador estiver a introduzir os dados referentes a um conjunto de alunos identificados pelos seus números de matrícula, a introdução de um número com menos de 6 dígitos (no caso do ) como, por exemplo, o valor 1, permitirá indicar ao programa que a presente sequência de introdução de dados deve terminar. Seria esse, neste caso, o valor sentinela escolhido. A selecção do valor sentinela é da responsabilidade do programador, devendo ser escolhido fora do intervalo possível de valores a introduzir, podendo ainda, ter-se em atenção a eventual ocorrência de valores fora desse intervalo que possam resultar de algum eventual erro de digitação. O valor sentinela escolhido não deve pois ser passível de facilmente ocorrer por mero acidente. Conforme pode ser observado na Figura 27 na próxima página um ciclo controlado por sentinela deverá ser precedido da leitura de um elemento da sequência de valores a introduzir. As leituras dos restantes valores dessa sequência serão efectuadas dentro do corpo do ciclo, um em cada iteração. Essa leitura deverá, no entanto, ser feita no fim do corpo do ciclo, após o processamento do valor anteriormente lido. Neste tipo de ciclos, a leitura e o processamento de cada valor lido andam, assim, desfasados de uma iteração do ciclo. No caso de se usar a estrutura Do..While, o ciclo funcionará enquanto o valor lido for diferente do valor sentinela escolhido. O exemplo apresentado acima, poderia ser codificado pelo segmento de programa seguinte: 1 num = InputBox( " D i g i t e o numero", " Matriculas " ) 2 Do While numero <> 1 3 I f numero <> 1 Then l s t b o x 1.AddItem num 4 num = InputBox( " D i g i t e o numero", " Matriculas " ) 5 Loop Geralmente o valor sentinela é um valor preciso. Existem casos, porém, em que a sentinela pode ser qualquer valor dentro de uma determinada gama, por exemplo, todos os números negativos. Um exemplo de um ciclo controlado por uma sentinela com estas características é apresentado na Secção na página Note que a variável contadora foi inicializada com o valor 0. 49
50 Figura 27: Ciclos controlados por sentinela Estrutura de Controlo For..To..Next Esta estrutura permite repetir um dado conjunto de instruções um número pré-determinado de vezes. Como vimos na secção anterior, nem sempre é possível saber de antemão quantas vezes as instruções contidas no corpo do ciclo devem ser repetidas. Nesse caso, deverão ser utilizadas as estruturas de controlo repetitivo estudadas na Secção na página 44. Esta estrutura permite construir ciclos controlados por contador de forma compacta e eficiente. A sua sintaxe é: 1 For contador = v a l o r _ i n i c i a l To v a l o r _ f i n a l 2 [ i n s t r u c o e s ] 3 Next Esta estrutura baseia-se na existência dum contador que incrementa automaticamente o conteúdo da variável contador, chamada variável de controlo do ciclo, cada vez que o ciclo funciona, isto é, cada vez que as instruções contidas no corpo do ciclo são executadas. No início, contador vai conter o valor inicial e após valorfinal - valor inicial iterações atingirá o valor final. Será essa a última iteração do ciclo. A inicialização da variável contadora, o seu incremento/decremento e a verificação da condição de funcionamento do ciclo (contador <= fim) é da responsabilidade da própria 50
51 estrutura de controlo. O programador precisa, apenas, de especificar qual o valor de início e de fim (ou, de forma indirecta, o número de vezes que o ciclo vai funcionar) e quais as instruções que o ciclo vai repetir (o corpo do ciclo). O conteúdo da variável de controlo do ciclo pode ser utilizado por instruções contidas no corpo do ciclo, mas não deve, sob pretexto algum, ser modificado por estas instruções, sob pena de se perder o controlo do funcionamento do ciclo. A estrutura de controlo verifica no início de cada iteração (repetição) do ciclo se a condição de funcionamento do ciclo é ainda verdadeira. Caso seja falsa, o ciclo terminará, e o programa passará a executar as instruções que se lhe seguem. Pode ainda ser utilizada a seguinte sintaxe alternativa: 1 For contador = v a l o r _ i n i c i a l To v a l o r _ f i n a l Step passo 2 [ i n s t r u c o e s ] 3 Next A diferença está na utilização da palavra Step após a especificação do valor final. A sua inclusão é opcional: caso se pretenda que o conteúdo da variável de controlo seja incrementada uma unidade de cada vez, é desnecessário especificar o passo. Em caso contrário, Step passo permitirá incrementar o valor de variável de um valor diferente da unidade (positivo ou negativo). Caso o valor de passo seja positivo a variável contadora será incrementada. Se pretendermos, no entanto, efectuar um decremento, deverá ser utilizado um valor negativo. Obviamente, nesse caso, a condição implícita de funcionamento do ciclo passará a ser contador >= fim. Repare-se que nesta estrutura de controlo, ao contrário das estudadas anteriormente, o incremento ou decremento da variável de controle do ciclo é automático. Outro aspecto interessante é que a condição de funcionamento do ciclo é implícita. Ela existe e é verificada mas não é especificada de forma explícita pelo programador, apenas de forma indirecta ao fixarem-se os valores inicial e final da variável de contagem. Listing 4: FormataBordo - exemplo de sub-rotina usando For..Next 1 Public Sub FormataBordo ( ) 2 Dim c e l l O b j e c t As Range 3 For Each c e l l O b j e c t In S e l e c t i o n 4 c e l l O b j e c t. BorderAround ColorIndex :=3, Weight:= xlthick 5 Next 6 End Sub Existe ainda em VBA uma estrutura de controlo que é uma variante da For..To..Next e que opera numa colecção de objectos. Uma colecção é um conjunto de objectos idênticos, pertencentes à mesma classe, e que são referenciáveis mediante um índice. Por exemplo, um Workbook é constituído por um conjunto de objectos da classe Worksheet 18. A sintaxe desta estrutura é a seguinte: 1 For Each elemento In Coleccao 18 Por sua vez, um workbook é também um objecto. Um objecto pode assim ser ele próprio uma colecção de objectos. 51
52 2 [ i n s t r u c o e s ] 3 Next O bloco de instruções será aplicada a cada elemento da colecção de objectos em causa. Na Listagem 4 na página anterior é apresentado um exemplo de sub-rotina, utilizando esta estrutura de controlo. Nela é utilizada a variável cellobject para guardar um objecto do tipo Range (que representa uma gama de células - assunto tratado na Secção 8.3). O ciclo For Each...Next aplica o método BorderAround a cada uma das células contidas na gama representada por cellobject. Com os argumentos fornecidos no exemplo, este método formata o bordo dessas células a vermelho e usando uma linha grossa Estruturas de controlo repetitivo imbricadas Foi dito anteriormente que o corpo de um ciclo era constituído pelo conjunto de instruções que o ciclo irá executar repetidamente. Foi também dito que nesse conjunto de instruções se poderia incluir qualquer tipo de instruções, mesmo constituindo outras estruturas de controlo repetitivo. Destes ciclos se diz que se encontram imbricados ou embutidos um dentro do outro. Diz-se também que esses ciclos estão encadeados. Figura 28: Exemplo de Ciclos Imbricados Considere-se o problema de calcular uma série de factoriais de números inteiros. O 52
53 cálculo de um factorial é realizado efectuando uma sucessão de multiplicações. Será necessário usar um ciclo para o efeito. Por sua vez, se pretendermos repetir esse cálculo um certo número de vezes, teremos também que usar um ciclo. Teremos assim um ciclo, chamemos-lhe exterior, que se encarrega de produzir uma sequência de factoriais e cujo corpo inclui por sua vez um ciclo, dito interior, que é responsável pelo cálculo de cada factorial. O diagrama de fluxo da Figura 28 na página precedente representa esta realidade. O código necessário para traduzir esse diagrama é o contido na Listagem 5. Listing 5: Exemplo usando Ciclos Imbricados 1 num = InputBox( " Introduza um i n t e i r o p o s i t i v o " ) 2 Do Until num < 0 3 f a c t o r i a l = 1 4 contador = 1 5 Do Until contador > num 6 f a c t o r i a l = f a c t o r i a l contador 7 contador = contador +1 8 Loop 9 num = InputBox( " Introduza um i n t e i r o p o s i t i v o " ) 10 Loop O ciclo exterior é controlado por uma sentinela, no caso qualquer valor inteiro não positivo. É um exemplo de sentinela constituído não por um valor específico mas por uma gama de valores possíveis. O ciclo interior é claramente controlado por contador, funcionando tantas vezes quantas o valor do inteiro cujo factorial se pretende calcular. Listing 6: Exemplo de Sub-rotina usando Ciclos Imbricados 1 Sub FillRange ( ) 2 Num = 1 3 For Row = 1 To 10 4 For Col = 1 To 10 5 C e l l s (Row, Col ). Value = Num 6 Num = Num Next Col 8 Next Row 9 End Sub O exemplo da Listagem 6 ilustra a utilização de dois ciclos imbricados para preencher uma tabela em Excel com valores que vão de 1 até 100 (o número de elementos da tabela). O ciclo interior preenche as células de uma linha da tabela. O ciclo exterior repete isso para cada um das linhas da tabela. O preenchimento das células é efectuado pela instrução 5, que usa o método Cells(Row, Col) para aceder acada célula da gama a que se aplica.. 53
54 6 Variáveis indexadas - vectores e matrizes Até agora, temos trabalhado com variáveis que podemos classificar como individuais. Como essas variáveis não podem conter simultaneamente mais que um dado, a atribuição de um novo valor a essa variável implica o desaparecimento do valor anteriormente nela contido. Mediante a utilização de um novo tipo de variáveis, as variáveis do tipo Array (Vector), passa a ser possível armazenar na mesma variável múltiplos valores desde que sejam do mesmo tipo. Estamos, portanto, a utilizar agora variáveis que se podem classificar como variáveis múltiplas. Na Figura 29 podemos observar representações de uma variável simples do tipo integer e de uma variável múltipla (um vector uni-dimensional) contendo valores inteiros. Cada elemento do vector é identificado por um valor numérico específico. Figura 29: Um vector é uma variável múltipla Um vector é uma lista ordenada de variáveis simples do mesmo tipo. Pode também ser visto como um conjunto de variáveis simples agrupadas. Todos os elementos desse vector partilham o mesmo nome (o nome do vector) e são identificados individualmente mediante o valor dum índice, que determina qual a sua posição dentro do vector. É por isso que estas variáveis são conhecidas por variáveis indexadas. Os valores do índice devem obrigatoriamente ser inteiros. O primeiro valor do índice é zero 19. Um elemento de um vector é identificado utilizando o nome do vector seguido do valor do índice dentro de parêntesis: nome_vector(indice) Exemplos: var_multipla(3) var_multipla(7) notas(14) nomes(0) 4 o elemento do vector var_multipla 8 o e último elemento do vector var_multipla 15 o elemento do vector notas 1 o elemento do vector nomes 19 É possível forçar que os índices dos vectores comecem do valor 1 usando a directiva Option Base 1. 54
55 Figura 30: Um exemplo de vector de strings Os elementos de um vector não têm que ser inteiros, nem sequer valores numéricos. Na Figura 30 é representado um vector contendo strings (texto). Considerando o vector como armazenado os nomes dos membros de uma equipa de futebol, os sucessivos valores do índice podem ser vistos como os correspondentes números das suas camisolas. Note-se que estamos, neste caso, a forçar os valores do índice a iniciar em Declaração estática de vectores Como qualquer outra variável, uma variável do tipo Array deve também ser declarada (criada) antes de poder ser usada. Para tal, deve ser usada a instrução Dim, que reserva espaço em memória suficiente para armazenar o número previsto de elementos do vector 20. Uma das formas de utilizar a instrução Dim para declarar vectores é a seguinte: Dim nome_vector(num_elementos) As Tipo Exemplos: Dim var_multipla(8) As Integer Dim notas(30) As Single Dim nomes(100) As String Note- se que num_elementos não se refere ao valor máximo que a variável índice pode assumir (7, no caso do vector var_multipla) mas sim ao número de elementos do vector (8, neste caso). Por este processo, a declaração do limite inferior faz-se de forma implícita: por defeito assume-se como limite inferior do índice o valor zero (ou 1 se tal for especificado mediante a instrução Option Base 1 ). Uma forma alternativa de utilizar a instrução Dim para declarar vectores implica a utilização da palavra reservada To, permitindo especificar o menor e o maior valor que o índice pode assumir: Dim nome_vector(menorindice To maiorindice) As Tipo Exemplos: 20 Adicionalmente, a instrução Dim atribui valores iniciais a todos os elementos do vector (zeros no caso de vectores numéricos e strings nulas no caso de vectores alfa-numéricos). 55
56 Dim numeros(100 To 200) As Double Dim valores(-100 to 100) As Single 6.2 Declaração dinâmica de vectores As formas de criar variáveis do tipo Array descritas anteriormente partem do princípio que as necessidades de armazenamento de informação são conhecidas previamente, i.e, que o programador pode avaliar antecipadamente qual deverá ser a dimensão do vector a armazenar. Isso nem sempre acontece. Sendo este o caso, e não se querendo errar nem por defeito nem por excesso, tentando adivinhar o que seria uma dimensão adequada, é possível utilizar uma técnica alternativa, a declaração dinâmica de Arrays. Este tipo de declaração é efectuada não inserindo a dimensão entre parêntesis na instrução Dim: Exemplo: Dim vector() As Single Esta declaração será inserida na zona habitual no início do programa. Quando chegar o momento em que seja possível avaliar de forma mais exacta a dimensão necessária para o vector, usar-se-á a instrução ReDim para atribuir essa dimensão ao Array. Exemplo: ReDim vector(100) A instrução ReDim pode igualmente ser usada para re-dimensionar um vector caso se verifique que a dimensão inicialmente atribuída não foi adequada. Nessa situação, caso se pretenda manter os valores já existentes no vector, dever-se-á usar a opção Preserve. Exemplo: ReDim Preserve vector(200) 6.3 Processamento de vectores Sendo um vector uma variável múltipla composta de elementos do mesmo tipo agrupados na mesma estrutura, a forma mais adequada de executar uma mesma acção sobre uma parte ou a totalidade dos seus elementos é utilizar uma estrutura de controlo repetitivo ou ciclo. Para perceber de forma mais clara o porquê da afirmação contida no parágrafo anterior, observe-se o problema descrito na Figura 31 na página seguinte e atente-se nas diferentes soluções propostas. Quando confrontado com o problema de armazenar e actualizar a informação relativa ao preço de 100 produtos, um programador poderia ser tentado a criar 100 variáveis individuais para guardar cada um desses preços. Isso, no entanto, obrigá-lo-ia a incluir no seu programa 100 instruções Dim para criar outras tantas variáveis individuais. Por outro lado, quando necessitasse de actualizar os preços em, por exemplo, 5%, teria que inserir 100 instruções do tipo preçon = preçon * 1,05. 56
57 Figura 31: Porquê usar ciclos para processar vectores? Do atrás exposto facilmente se verificará que esta solução não tem qualquer exequibilidade prática. Analizemos então a solução alternativa usando uma variável indexada: em vez de 100 variáveis individuais teremos apenas um vector de 100 elementos, cada um deles capaz de armazenar o preço de um produto. Consequentemente, teremos apenas uma instrução Dim, no caso, algo como Dim preços As single. E quando for necessário actualizar os preços, como o vector é uma variável múltipla indexada, haverá apenas que construir um ciclo que percorra automáticamente o vector, actualizando cada um dos seus elementos. Listing 7: Exemplo de processamento de um vector 1 Private Sub cmdgo_click ( ) 2 Dim vectorsqr (100) As Double 3 Dim i As Integer 4 Dim r e s As S i n g l e 5 l s t T a b e l a. Clear 6 For i = 0 To txtmaior 7 r e s = Sqr( i ) 8 vectorsqr ( i ) = r e s 9 l s t T a b e l a.additem Format( res, " " ) 10 Next i 11 End Sub O programa descrito na Listagem 7 permite calcular e apresentar sob a forma de uma tabela as raízes quadradas de todos os números inteiros compreendidos entre 0 e um 57
58 limite superior a especificar pelo utilizador na TextBox txtmaior (a largura do intervalo não deve exceder 100, visto ser esta a dimensão do vector). Os valores calculados são armazenados num vector para eventual futura utilização. Listing 8: Outro exemplo de processamento de um vector 1 Private Sub cmdgo_click ( ) 2 Dim v e c t o r (100) As Double 3 Dim i As Integer 4 Dim i n d i c e As Integer 5 Dim r e s As S i n g l e 6 Dim l i n h a As String 7 l s t T a b e l a. Clear 8 i n d i c e = 0 9 For i = txtmenor To txtmaior 10 r e s = Sqr( i ) 11 v e c t o r ( i n d i c e ) = r e s 12 l i n h a = Format( Str ( i ), "##0" ) + " " + _ 13 Format( v e c t o r ( i n d i c e ), " " ) 14 l s t T a b e l a.additem l i n h a 15 i n d i c e = i n d i c e Next i 17 End Sub Na variante desta sub-rotina, contida no exemplo descrito na Listagem 8, é possível especificar também o limite inferior do intervalo, para além de se demonstrarem algumas técnicas de formatação da saída de dados. De notar que na primeira versão do programa se usou a mesma variável i para controlar o ciclo For e para armazenar os valores dos índices do vector. Tal aconteceu porque foi possível estabelecer naquele caso uma correspondência directa entre os valores da variável de controlo do ciclo i e os valores do índice que controla as posições dos elementos do vector. Já na segunda variante do programa tal não era possível, visto que a variável de controlo do ciclo iria conter valores (desde o limite inferior ao limite superior do intervalo) que não deveriam corresponder às posições do vector em que o armazenamento dos resultados se iria efectuar. Em qualquer das variantes apresentadas, o processamento dos elementos do vector consistiu em operações de escrita (de atribuição) que modificaram o seu valor. É igualmente possível efectuar operações de leitura sobre todos ou parte dos elementos dum vector. Neste caso, como é óbvio, a variável do tipo Array deverá encontrar-se do lado direito de uma operação de atribuição: var = vector(indice) A instrução acima copia o conteúdo de vector na posição índice para a variável var. 58
59 6.4 Matrizes As variáveis indexadas descritas anteriormente representam vectores uni-dimensionais. Não há nada, no entanto, que nos impeça de trabalhar com estruturas de dados multidimensionais. A declaração de vectores multi-dimensionais far-se-á acrescentando dimensões adicionais entre os parêntesis das instruções Dim. Um vector bidimensional (vulgarmente designado por matriz) será criado mediante uma instrução do tipo: Dim matriz(numero_de_linhas, Numero_de_colunas) As Tipo Exemplo: Dim matriz(50,50) As Integer O exemplo anterior cria uma matriz quadrada capaz de armazenar 2500 valores inteiros. Para referenciar um elemento de matriz será necessário usar dois índices, um para identificar a linha e outro para a coluna. No que diz respeito ao processamento de uma matriz, se, para processar um vector uni-dimensional, é necessário utilizar um ciclo, para processar uma matriz (vector bidimensional) serão precisos dois ciclos encadeados. Figura 32: Ciclos encadeados para processar um vector bidimensional Na Figura 32 pode ser visto um fragmento de código em VBA que permite calcular a soma de duas matrizes (m1 e m2), colocando o resultado noutra matriz (ms). No diagrama pode ser observada a existência de um ciclo interior que processa uma linha da matriz (correspondendo, no fundo, a um vector uni-dimensional), coluna a coluna, e que se encontra integrado no corpo de um ciclo exterior que repete esse processamento para todas as linhas da matriz. Analizando mais em detalhe o código apresentado na Figura 32, pode verificar-se a existência de dois índices, concretizados nas variáveis i e j (a 1 a para controlar as linhas e a 2 a para as colunas). Estas variáveis foram também utilizadas como variáveis de controle 59
60 dos ciclos For. Dessa maneira, vão ser percorridos automaticamente os intervalos de valores dos índices de 1 até nl (variável contendo o n o de linhas) e de 1 até nc (variável contendo o n o de colunas). 1 Option Base 1 2 Const Linhas = 10 3 Const Colunas = 10 4 Listing 9: Soma de matrizes 5 Private Sub cmdcalc_click ( ) 6 Dim m1( Linhas, Colunas ) As Integer, 7 Dim m2( Linhas, Colunas ) As Integer 8 Dim ms( Linhas, Colunas ) As Integer, l i n h a As String 9 Dim n l As Integer, nc As Integer, i As Integer, j As Integer nl = Val( txtnl. Text ) 12 nc = Val( txtnc. Text ) 13 I f nc < 1 Or nc > Colunas Or n l < 1 Or n l > Linhas Then 14 MsgBox " Dimensoes e r r a d as! " 15 Else 16 For i = 1 To nl l e i t u r a da matriz 1 17 l i n h a = "" 18 For j = 1 To nc 19 m1( i, j ) = Val(InputBox( "M1[ " & i & ", " & j & "]=" ) ) 20 l i n h a = l i n h a & " " & m1( i, j ) 21 Next 22 lstm1.additem l i n h a 23 Next 24 For i = 1 To nl l e i t u r a da matriz 2 25 l i n h a = "" 26 For j = 1 To nc 27 m2( i, j ) = Val(InputBox( "M2[ " & i & ", " & j & "]=" ) ) 28 l i n h a = l i n h a & " " & m2( i, j ) 29 Next 30 lstm2.additem l i n h a 31 Next 32 For i = 1 To nl c a l c u l o da soma de m1 com m2 33 l i n h a = "" 34 For j = 1 To nc 35 ms( i, j ) = m2( i, j ) + m1( i, j ) 36 l i n h a = l i n h a & " " & ms( i, j ) 37 Next 38 lstms.additem l i n h a 39 Next 40 End I f 41 End Sub 60
61 Na Listagem 9 na página precedente pode ser encontrado o código completo de um programa que preenche as duas matrizes m1 e m2 com valores fornecidos pelo utilizador, após o que calcula a matriz soma ms. O programa faz ainda a apresentação do conteúdo das três matrizes noutras tantas caixas de listagem. No código pode ser observada a utilização de constantes para facilitar a escrita e eventual alteração do programa. Foram inicialmente definidas as duas constantes Linhas e Colunas que vão ser em seguida utilizadas por várias vezes ao longo do programa. Se houver necessidade de alterar as dimensões das matrizes, bastará modificar a definição inicial das constantes. As instruções contidas nas linhas 20, 28 e 36 são usadas para acrescentar à string a adicionar às ListBox o conteúdo (devidamente formatado) do elemento da matriz que se encontra a ser processado no momento. 61
62 7 Funções e Procedimentos Nesta secção vamos falar da organização interna de um programa. Em vez de incluir todas as instruções numa única entidade, é possível e aconselhável organizar um programa em vários módulos, divididos de acordo com a sua especialização. A melhor maneira de encontrar a solução para um problema complexo é dividi-lo em subproblemas e estes por sua vez em problemas de ainda menor dimensão até atingir um nível de complexidade suficientemente baixo para ser resolvido sem dificuldade. Uma vez resolvidos os subproblemas de nível mais baixo, começa um processo inverso, de integração de módulos individuais num todo coerente. A construção de um programa baseia-se num processo idêntico. Deve ser seguido o método de subdividir o problema nas suas partes constituintes e encontrar solução para cada uma delas, integrando no fim as partes no todo. Cada uma dessas partes pode constituir um módulo independente que será utilizado pelo programa principal, usando um mecanismo que se pode descrever como de "subcontratação". Usando este mecanismo, o programa principal vai utilizar os serviços dos módulos especializados na realização de certas tarefas. É possível, assim, re-aproveitar as capacidades desses módulos, em vez de ser o próprio programa a assegurar essas tarefas. Por outro lado, organizando o programa dessa forma, é possível melhorar a sua legibilidade e facilitar a sua manutenção, já que quaisquer alterações a cada módulo ficarão circunscritas a esse módulo, evitando efeitos secundários indesejáveis. 7.1 Funções Os programas descritos nos exemplos que têm sido apresentados destinam-se a executar tarefas. Por exemplo, as rotinas descritas na Secção 2.6 na página 13 têm como objectivo a monitorização dos valores contidos em determinadas células da folha de cálculo. Este tipo de rotinas é designado por procedimentos ou sub-rotinas (em linguagem VBA). Destinam-se a realizar tarefas e não têm necessariamente que devolver qualquer resultado. No entanto, não é possível utilizar estes procedimentos em fórmulas duma folha de cálculo, ao contrário do que acontece com as funções standard disponíveis no Excel, como seja a função If referida atrás, ou a função Sum, que calcula a soma do conteúdo numérico das várias células contidas numa dada gama. Isso acontece porque, para poderem ser utilizadas em fórmulas, elas terão que ser estruturadas como funções, e comportarem-se de maneira idêntica à das funções standard. Uma função, seja ela pré-existente no Excel, ou criada pelo utilizador, deve poder receber a informação de que necessita, e de conseguir devolver o resultado do seu trabalho, de modo a esse resultado poder ser utilizado na fórmula ou expressão que a utilize. Uma função devolve obrigatóriamente um, e só um, resultado. Deverá possuir uma estrutura definida pela sintaxe seguinte: 1 Function Nome ( argumento1, argumento2,... ) 2 L i s t a de i n s t r u c o e s 3 Nome = r e s u l t a d o 4 End Function Repare-se que para além das diferenças óbvias no cabeçalho e no delimitador final em relação às sub-rotinas estudadas anteriormemte, verifica-se o seguinte: 62
63 Figura 33: Funções como caixas pretas 1. A seguir ao nome da função e entre parênteses encontra-se uma lista de argumentos, através dos quais a função vai receber as informações essenciais à realização do seu trabalho. 2. O resultado dos cálculos efectuados será entregue à fórmula ou expressão que invocou a função, depositando-o no seu próprio nome, como se este fosse uma variável. Atentemos na seguinte fórmula Excel: = 10 * sin(angulo) Para calcular a fórmula, ir-se-á multiplicar por 10 o resultado fornecido pela função standard sin. Esta, por sua vez, para poder fornecer o resultado deverá ter recebido a informação de qual o ângulo (neste caso em radianos) de que se quer calcular o seno. Quando a função termina o seu trabalho, deixará o resultado do seu cálculo no lugar que ocupava na fórmula. Para o utilizador da função, não interessa conhecer o seu funcionamento interno, mas apenas qual a informação que lhe tem que fornecer e qual o tipo de resultado esperado. Assim sendo, pode dizer-se que do ponto de vista do programa que utiliza a função, ela se comporta como uma caixa preta, à qual é fornecida informação e que, com base nela, produz um resultado (Figura 33). 7.2 Exemplos de funções criadas pelo programador Vamos agora criar uma função que permita calcular a margem de lucro percentual de um determinado produto sabendo o seu custo e o seu preço de venda. Supõe-se que esses dados se encontrarão previamente armazenados em duas células da folha de cálculo. Uma solução possível será a seguinte: Listing 10: Função mlucro 1 Public Function mlucro ( v As s i n g l e, c As s i n g l e ) As s i n g l e 2 mlucro = ( v c ) / v 3 End Function 63
64 Observe-se que função mlucro possui dois parâmetros de entrada, v e c, através dos quais receberá os dados das vendas e dos custos respectivamente. Estes dois parâmetros estão preparados para receber dados do tipo single. Note-se ainda que o resultado da expressão que calcula a margem de lucro é atribuído directamente ao próprio nome da função. É esse o processo pelo qual uma função consegue fornecer o resultado do seu trabalho à entidade que a invocou. O tipo de resultado fornecido pela função é especificado na parte direita do cabeçalho, também do tipo single, neste caso 21. Figura 34: Utilização da função margemlucro numa fórmula Esta função poderá ser utilizada em qualquer fórmula contida numa célula da folha de cálculo, da mesma maneira que qualquer das funções pré-existentes o seria. Um exemplo de uma fórmula utilizando esta função seria a apresentada na Figura 34. A fórmula, que pode ser visualizada na barra de fórmulas da imagem apresentada na Figura 34, contem referências às células D3 e D2, em que estão contidos, respectivamente, o preço de venda e o custo do produto. Quando a função é invocada, cópias do conteúdo destas duas células são passadas à função. Esta recebe-os através dos parâmetros de entrada respectivos, v e c. O resultado do seu cálculo será deixado na fórmula, quando a função termina o seu trabalho. Listing 11: Função factorial 1 Function f a c t o r i a l ( ByVal n as Integer ) as Double 2 Dim i as Integer, f as Double 3 f = 1 4 For i = 2 To n 5 f = f i 6 Next i 7 f a c t o r i a l = f 8 End Function Vamos agora apresentar outro exemplo de função criada pelo programador e de como esta pode ser utilizada num programa. Trata-se de uma função que calcula o factorial de um número inteiro. Já que o factorial de um número é obtido à custa da multiplicação 21 Quer no que respeita ao tipo de resultado devolvido, quer ao tipo de dados recebido pela função através dos parâmetros de entrada, é possível omitir a sua especificação no cabeçalho da função. Isso terá como consequência que o VBA parta do princípio que se trata de dados do tipo Variant. Os inconvenientes de usar este tipo de dados já foram referidos na Secção 3.4 na página
65 de todos os valores inteiros entre 1 e esse número, estamos perante um caso típico de utilização de uma estrutura de repetição. O código da função apresentado na Listagem 11 na página precedente usa um ciclo For para repetir a instrução f = f * i, responsável pela actualização da variável f. No final do ciclo, essa variável conterá o resultado das sucessivas multiplicações, ou seja, o próprio factorial. Atente-se a que essa variável deve ser inicializada com o valor 1, já que é este o elemento neutro na multiplicação. Finalmente, o resultado contido em f é copiado para o nome da função de modo a permitir que ela possa devolver esse resultado ao programa que a invoca. Na Listagem 12 pode ser consultado o código de um programa que calcula combinações, usando a função factorial que acabámos de estudar 22. Este programa codifica a resposta do botão de comando cmdcombina ao evento click. Listing 12: Programa de cálculo de Combinações 1 Private Sub cmdcombina_click ( ) 2 Dim n As Integer, p As Integer 3 n = Abs ( [ D4 ] ) 4 p = Abs ( [ D5 ] ) 5 I f n > 0 And p > 0 And n >= p Then 6 [ D7 ] = f a c t o r i a l (n) / f a c t o r i a l (n p) / f a c t o r i a l (p) 7 Else 8 MsgBox " Erro : dados i n v a l i d o s! ", vbokonly 9 End I f 10 End Sub O programa lê os valores da população e da amostra contidos nas células D4 e D5, respectivamente, após o que, caso os valores de n e p sejam válidos, calcula as combinações de n, p a p, através da instrução na linha 6. Esta instrução guarda na célula D7 o resultado da expressão de cálculo de combinações 23. Para perceber melhor como essa expressão é avaliada, na Figura 35 é descrito o processo passo a passo. Figura 35: Análise passo a passo da expressão de cálculo das combinações 22 Programa adaptado de um exemplo dos textos de apoio do prof. Ângelo Martins. 23 A fórmula de cálculo de combinações é ( ) n p = n! (n p)!p!. 65
66 Em 1 o lugar, são copiados os valores das variáveis do programa principal para os parâmetros de entrada da função 24. Assim n e p são substituídos pelos valores presentes nesse momento nessas variáveis (Passo 1). Como na 2 a invocação da função o que lhe está a ser passado é o resultado da expressão n - p, essa expressão tem que ser calculada. Em seguida, a função é sucessivamente invocada com os valores previamente obtidos. Com esses valores, a função faz o cálculo do factorial e terminando o seu trabalho, deixa no seu lugar o rsultado do cálculo (Passo 4). Só falta agora calcular o resultado da expressão e armazenar o seu resultado na célula D Passagem de parâmetros ByVal Nesta secção vamos analisar em maior detalhe o processo de passagem de parâmetros entre as funções e procedimentos e os programas que os invocam. Para poder trabalhar, uma função precisa de dados, que lhe são passados através de parâmetros. Esses dados são processados, e, no caso das funções, um resultado é produzido e devolvido ao programa que a chamou, através do seu próprio nome. Uma função é invocada numa expressão, usualmente do lado direito de uma operação de atribuição. A instrução que a invoca tem que, ao mesmo tempo, entregar-lhe os dados de que a função necessita para o seu trabalho (no caso da função factorial, o número cujo factorial se pretende conhecer). Esses dados são passados como argumentos da função. No exemplo seguinte, a função factorial é invocada passando-lhe como argumento o conteúdo da variável num: fac = factorial(num) Para poder receber a informação que lhe foi passada como argumento, a função deverá ter sido criada de forma a poder recebê-la adequadamente. Para tal, deverá possuir um parâmetro de entrada por onde essa informação possa entrar. No caso da função factorial, n é esse parâmetro de entrada e está preparado para receber dados do tipo integer. Figura 36: Comunicação da função com o programa que a invoca 24 Para ver em detalhe esse proceeso, consultar a Secção
67 Na Figura 36 na página precedente está assinalado o parâmetro n com o sendo a via de entrada de informação na função bem como a forma pela qual o resultado é fornecido. No código da função factorial pode observar-se a inclusão da palavra reservada ByVal imediatamente antes do nome do argumento. Esta palavra indica que a função espera que um argumento lhe seja passado "por valor", ou seja, que aquilo que venha a receber através daquele parâmetro seja exactamente o dado com que vai trabalhar. Por oposição a ByVal pode usar-se a palavra ByRef ("por referência"). Neste caso, a informação passada à função ou procedimento será não um valor específico mas a indicação de onde esse valor poderá ser encontrado ou, por outras palavras, o endereço da variável em que o valor a utilizar se encontrará. O uso de ByRef tem ainda outras consequências que serão estudadas na Secção Procedimentos Até agora, temos estado a analisar o processo pelo qual as funções e os programas que as invocam comunicam entre si. Uma função, como vimos, devolve um e um só resultado. Há, no entanto, situações em que é conveniente que as rotinas possam devolver mais do que um resultado. Nesses casos, uma função não pode ser utilizada. Teremos que usar um procedimento (ou sub-rotina) 25 e usar a técnica de passagem de parâmetros por referência (ByRef ). Se bem que já tenhamos por várias vezes lidado com procedimentos, está na altura de formalizar o processo da sua criação. A sintaxe utilizada é a seguinte: Sub <nome>(lista_de_argumentos ) i n s t r u c o e s End Sub Antes da palavra reservada Sub é possível acrescentar Private ou Public, conforme o o âmbito do procedimento esteja ou não circunscrito ao módulo em que o procedimento esteja inserido 26. A Lista de argumentos é composta por elementos do tipo "Nome As Tipo" separados por vírgulas. Note-se que um procedimento não tem que devolver resultados. Pode limitar-se a executar uma ou mais tarefas que não implicam o cálculo e devolução de resultados. Nesse caso, podem ser vistos apenas como um sub-programa especializado na execução de uma tarefa específica. Enquanto que uma função apenas pode ser invocada no interior de uma expressão e, portanto, aparece vulgarmente do lado direito de uma operação de atribuição, já um procedimento é invocado como uma instrução. A forma geral será algo como: nome_do_procedimento argumento1, argumento 2,...argumentoN Na Listagem 13 na página seguinte (linha 11) pode ser observado um exemplo de invocação de um procedimento. 25 Como foi referido na Secção 7.1 na página 62 não é obrigatório que um procedimento devolva resultados. Pode limitar-se a executar uma tarefa que não implique fornecer o resultado de um cálculo. 26 Na prática, Public Sub ou Sub têm exactamente o mesmo efeito. 67
68 Uma forma alternativa de chamar um procedimento implica o uso da palavra Call. Nesse caso, a eventual lista de argumentos é passada dentro de parêntesis. Teremos assim: Call nome_do_procedimento(argumento1, argumento 2,...argumentoN) 7.5 Passagem de parâmetros ByRef Dissemos que para um procedimento poder fornecer vários resultados teremos que recorrer à passagem de parâmetros por referência. No fundo, um procedimento receber o endereço de uma variável do programa principal, que é o que acontece quando um argumento lhe é passado ByRef, equivale a receber autorização do programa para que aceda livremente a essa variável, não só para ler o seu conteúdo mas igualmente para o modificar. Se um procedimento for autorizado a aceder a múltiplas variáveis do programa que o invocar, terá oportunidade de devolver resultados múltiplos, colocando um resultado em cada variável. Conforme foi referido na Secção 3.3 na página 18 as variáveis têm um âmbito próprio. Em regra geral, uma variável criada num dado procedimento apenas será conhecida no local em que foi criada e, como tal, só poderá ser acedida nesse procedimento. A excepção são as variáveis globais que, por serem declaradas fora de qualquer módulo, são accessíveis a partir de qualquer um. A passagem de parâmetros ByRef é um mecanismo que permite também o acesso a variáveis exteriores ao módulo em que foram criadas. Listing 13: Diferentes resultados na passagem por valor e por referência 1 Private Sub proc1 ( ) 2 Dim a As Integer 3 Dim b As Integer 4 5 a = b = v a l o r e s de a e b antes da chamada de proc2 9 [ I3 ] = a 10 [ J3 ] = b proc2 a, b v a l o r e s de a e b depois da chamada de proc2 15 [ I4 ] = a 16 [ J4 ] = b 17 End Sub Sub proc2 ( ByRef v1 As Integer, ByVal v2 As Integer ) 20 v1 = v v2 = v End Sub 68
69 Analizemos o código da Listagem 13 na página anterior. O procedimento proc1 trabalha com as variáveis a e b. Copia os seus valores para as células I3 e J3 respectivamente. Em seguida chama o procedimento proc2 passando-lhe dois argumentos: o primeiro é passado por referência ()ByRef ), ou seja, o que é efectivamente enviado é endereço (referência) da variável a ; o segundo é passado por valor (ByVal), i.e, é efectuada uma cópia do conteúdo da variável b. Dentro de proc2 são modificados os valores dos seus parâmetros de entrada v1 e v2 em que, na altura da sua invocação, foram colocados uma referência à variável a e uma cópia do conteúdo de b, respectivamente. Observe-se agora qual o conteúdo de a e b após a invocação de proc2, conforme apresentados na Figura 37. Figura 37: Resultados do código da Listagem 13 na página anterior Verfica-se que enquanto o contéudo de a mudou, o conteúdo de b manteve-se inalterado. De facto, enquanto que através do primeiro parâmetro foi passado a proc2 autorização para alterar a variável a, já no caso do segundo parâmetro o que foi enviado foi meramente uma cópia do conteúdo de b. Esse valor foi alterado dentro de proc2 mas essa alteração fica estritamente circunscrita a esse procedimento. Torna-se assim claro que quando um programa invoca um procedimento passando-lhe como argumentos referências a variáveis suas, está efectivamente a autorizá-lo a manipular essas variáveis. Assim sendo, o procedimento terá agora possibilidade de colocar nessas variáveis os resultados dos seus cálculos. Como não há um limite prático para o número de argumentos que se pode passar a uma rotina, um procedimento poderá devolver múltiplos resultados ao programa que o invocar, contornando a limitação existente no caso das funções. 7.6 Como aceder às funções standard do Excel Se bem que o VBA possua várias dezenas de funções pré-definidas, é muito conveniente poder utilizar num macro qualquer uma das centenas de funções standard oferecidas pelo Excel. Para poder aceder a elas a partir do VBA é necessário utilizar a propriedade WorsheetFunction do objecto Application 27. Por exemplo, para, num macro, calcular o valor médio de uma gama de células (identificada pelo nome "Dados") poderia ser usada a seguinte instrução: med = Application.WorksheetFunction.Average(Range("Dados")) 27 Claro que só as funções do Excel que não se encontram duplicadas no VBA podem ser acedidas por meio da propriedade WorsheetFunction. 69
70 Esta instrução permite aceder à função standard Average do Excel, à qual é passado um objecto do tipo Range, representando a gama de células descritas sob o nome "Dados". O resultado fornecido pela função será a média dos valores contidos nas células que compõem essa gama. 70
71 8 Programação do Excel usando VBA Nesta secção vamos aprender a trabalhar com os objectos do Excel mais comuns: o Workbook (Livro de trabalho), a Worksheet (Folha de cálculo) e o Range (gama de células). São objectos que pertencem, por sua vez, ao objecto principal que é a Application (Aplicação, neste caso, o próprio Excel). 8.1 Trabalhar com objectos Workbook Usando estes objectos, o VBA pode criar novos livros de trabalho, abrir ou fechar existentes, entre outras acções possíveis. Para especificar qual o livro de trabalho com que queremos trabalhar podemos fazê-lo de três maneiras diferentes: Usando o objecto Workbooks que representa o conjunto dos ficheiros Excel abertos naquele momento (Workbooks(Nome)); Usando o objecto ActiveWorkbook que representa o ficheiro com que se está de momento a trabalhar; Usando o objecto ThisWorkbook que representa o ficheiro em que o próprio programa em VBA (e não necessariamente o utilizador) está a operar. Para abrir um Livro de Trabalho aplica-se o método Open ao objecto Workbooks: Sintaxe: Workbooks.Open Nome_do_ficheiro Exemplo: Workbooks.Open "C : \Documentos\Excel\Dados.xls" Os métodos Save e Close são utilizados de forma similar para salvaguardar o conteúdo dum ficheiro e para o fechar, respectivamente. 8.2 Trabalhar com objectos Worksheet Normalmente um livro de trabalho possui mais do que uma folha de cálculo (é normalmente criado logo à partida com três). Para escolher qual a folha de cálculo com que se pretende trabalhar usa-se o objecto Worksheets especificando um índice ou o nome da folha de cálculo em causa, conforme se exemplifica a seguir: Worksheets(2) Worksheets("Custos") Propriedades de Worksheet Nesta secção são referidas algumas das suas propriedades mais úteis: 71
72 Worksheet.Name - permite mudar ou obter o nome da folha de cálculo. O exemplo abaixo muda o nome de "Folha 1" para "Medidas": Worksheets("Folha 1").Name = "Medidas" Worksheet.StandardWidth - permite especificar a largura standard das colunas duma folha de cálculo Métodos de Worksheet Eis alguns dos métodos normalmente aplicados a este tipo de objectos: Worksheet.Activate - torna activa a folha de cálculo especificada 28. O exemplo seguinte torna activa a folha de cálculo "Custos" do livro de trabalho "Dados 2007": Workbook("Dados 2007").Worksheets("Custos").Activate Worksheet.Copy - copia a folha de cálculo especificada para outra posição dentro do livro de trabalho. Sintaxe: Worksheet.Copy [Position] O argumento Position é opcional e pode ter o valor Before ou After indicando a posição onde a cópia será inserida. Caso o argumento não seja incluído, a cópia será inserida num novo livro de trabalho. Exemplo: Worksheets(2).Copy After:=Worksheets(3) O exemplo anterior faz uma cópia da 2 a folha de cálculo e insere-a a seguir à 3 a. O método Move usa uma sintaxe idêntica para mover uma determinada folha de cálculo para outra posição. Worksheet.Delete - permite eliminar a folha de cálculo especificada. Worksheet.Add - permite acrescentar uma nova folha de cálculo ao livro de trabalho. Sintaxe: Worksheet.Add [Position] Também aqui o argumento Position é opcional. Se for omitido, a nova folha de cálculo será inserida imediatamente antes da folha activa. Exemplo: Worksheets.Add After:=Worksheets("Medidas") 28 A folha de cálculo activa é aquela que está visível no momento. 72
73 8.3 Trabalhar com objectos Range Um objecto do tipo Range pode representar uma simples célula, um conjunto de células, uma linha ou uma coluna. Não existe em VBA um objecto específico para representar uma célula individual. Para nos referirmos a uma célula ou gama de células podemos aplicar o método Range ao objecto Worksheet usando uma de duas sintaxes possíveis: Sintaxe 1: Worksheet.Range(Nome) Sintaxe 2: Worksheet.Range(Celula1, Celula2) A 1 a sintaxe usa nomes de gamas pré-definidos 29, enquanto que a 2 a utiliza as referências das células que definem os dois vértices opostos da área rectangular contendo as células que se quer especificar. Caso se omita a referência a Worksheet em qualquer das sintaxes anteriores, o VBA pressupõe que se trata da folha de cálculo activa naquele momento. Exemplos: Range("C5").Value = 100 Range("D1","D10").Value = 0 Worksheets(3).Range("Dados").ClearContents O 1 o exemplo guarda o valor 100 na célula C5 da folha de cálculo activa. O 2 o exemplo atribui o valor zero a todas as células da gama D1 a D10. Nestes dois exemplos é utilizada a propriedade Value dos objectos Range que permite conhecer ou modificar o seu valor. No 3 o exemplo limpa-se o conteúdo das células da gama "Dados" da 3 a folha de cálculo, mediante a aplicação do método ClearContents. Caso queiramos identificar apenas uma célula podemos também utilizar o método Cells. Sintaxe: Objecto.Cells(Linha,Coluna) Na sintaxe acima, a entidadeobjecto pode ser um objecto Worksheet ou Range. Mais uma vez, a sua omissão, leva o VBA a partir do princípio que se trata da folha de cálculo activa. Linha e Coluna são valores numéricos indicando qual a linha e qual a coluna na intersecção das quais a célula se encontra 30. Veja-se o seguinte exemplo: 1 For coluna = 2 To 13 2 C e l l s (2, Coluna ). Value = "Mes " & coluna 1 3 Next O exemplo acima usa um ciclo For...To para preencher todas as células da gama C2 a C13 com o texto "Mês X" em que X é o n o do mês. É usado o operador de concatenação de strings & para efectuar a colagem. 29 Atribuídos em Excel usando o Menu "Insert/Name/Define". 30 Se o objecto for do tipo Range, os argumentos Linha e Coluna referir-se-ão à linha e à coluna dentro da gama de células especificada. 73
74 Caso se pretenda identificar uma linha ou coluna completa, podem ser utilizados os métodos Rows e Columns. Sintaxe: Objecto.Rows(Indice) Objecto.Columns(Indice) Para ilustrar a utilização do método Rows atente-se no seguinte exemplo de subrotina 31 : Listing 14: Sub-rotina InsereLinhas 1 Sub I n s e r e L i n h a s (gama As Range, num As Integer ) 2 Dim num_linhas As Integer, ultima_linha As Integer 3 Dim i As Integer 4 With gama 5 num_linhas =. Rows. Count 6 ultima_linha =. Rows( num_linhas ). Row 7 For i = 1 To num 8. Rows( ultima_linha + i ). I n s e r t 9 Next 10 End With 11 End Sub Esta sub-rotina recebe como argumentos uma gama de células (um objecto do tipo Range) e um inteiro especificando o número de linhas a inserir abaixo da última linha dessa gama. A estrutura With...End...With é muito prática porque permite executar um conjunto de instruções sobre um determinado objecto, neste caso qualquer objecto Range que a sub-rotina receba como argumento. Dentro da estrutura With...End...With omite-se qualquer referência a esse objecto, usando-se apenas os seus métodos e propriedades. Assim,.Rows.Count refere-se ao número total de linhas da gama especificada e.rows(num_linhas).row fornece-nos o índice da última linha dessa gama. For...To repete num vezes a aplicação do método Insert à ultima linha da gama. Para testar a sub-rotina InsereLinhas, use-se a seguinte rotina de teste: 1 Sub i n s e r e T e s t e ( ) 2 I n s e r e L i n h a s Worksheets ( 3 ). Range ( "Dados" ), 3 3 End Sub Apresentamos outro exemplo, agora referido ao método Columns: O ciclo Columns(5).ColumnWidth = 15 Aplicando o método Columns ao objecto Columns(5) (a coluna de índice 5, ou seja, a coluna E) o efeito obtido é a mudança da sua largura para 15. Existe uma propriedade dos objectos Range particularmente útil. Trata-se da propriedade Offset que permite definir um deslocamento em relação a um objecto Range, por exemplo, em relação à célula activa. 31 Adaptado de um exemplo contido em [1]. 74
75 Sintaxe: Range.Offset(linha,coluna) Na Figura 38 podem observar-se dois exemplos de aplicação desta propriedade. Mantendose a célula activa B3, no caso A foi armazenado o valor 2 na célula B5 (duas linhas abaixo de B3 e na mesma coluna) usando a seguinte instrução: ActiveCell.Offset(2,0) = 2 No caso B, foi colocado o valor 2 em A3 (na mesma linha e uma coluna antes de b3), usando a instrução: ActiveCell.Offset(0,-1) = 2 Note-se que nos dois casos a célula activa se manteve inalterada. Apenas se especificou a posição de uma célula em relação a um referencial fixo (B3). Figura 38: Exemplos de utilização da propriedade Offset Usando esta propriedade podemos escolher uma célula especificando a sua coluna ou a sua linha (ou as duas) de forma relativa, ou seja, em relação ao objecto Range a que se aplica. Isto pode não parecer à primeira vista especialmente útil. No entanto, se pensarmos que linha ou coluna podem ser constituídos por variáveis, cujo valor pode ser controlado por uma estrutura de repetição, podemos ver que temos aqui uma forma expedita de executarmos uma mesma acção sobre um conjunto de células definido de forma relativa em relação a uma dada célula, que podemos considerar como uma espécie de âncora. 75
76 9 Adicionando uma interface gráfica O acesso aos macros faz-se, conforme referido na Secção 2.3, mediante a combinação de teclas ALT-F8. Pode ainda associar-se a um macro uma combinação de teclas especial que permite accioná-lo directamente. No entanto, em muitos casos, é mais conveniente poder interagir com o macro através de uma interface própria, concebida especialmente para ele. Usam-se para o efeito objectos gráficos como Dialog Boxes (Caixas de Diálogo) desenhadas à medida, que são versões mais desenvolvidas das já conhecidas Input Boxes e Message Boxes. Vamos nesta secção ver como construir as nossas próprias Dialog Boxes usando objectos da classe UserForm e como as integrar numa aplicação em VBA. 9.1 Instalação da Form Uma Form é uma janela, em si mesma um objecto, utilizada como um contentor para outros objectos gráficos (ver Secção na página 32). Pode-se criar um objecto da classe UserForm no Editor do VBA através do Menu "Insert/User Form". Figura 39: Criação de uma Form no VBA Na Figura 39 pode-se ver uma Form vazia e uma caixa de ferramentas (Toolbox) contendo os vários controlos (objectos gráficos) disponíveis para a construção da interface. Pode ainda ver-se no canto inferior esquerdo a Janela de Propriedades, através da qual é 76
77 possível manipular várias características da Form (como, aliás, de qualquer controlo que esteja seleccionado). 9.2 Instalação dos Controlos Usando a Caixa de Ferramentas (Toolbox), é possível escolher e instalar os controlos na Form. Para o efeito, basta accionar o símbolo do controlo pretendido e desenhá-lo com o rato na Form. A seguir, quer agindo directamente sobre o controlo, quer utilizando a Janela de Propriedades, podem-se fazer os ajustes necessários das suas características. Se bem que cada classe de controlos possua a sua lista específica de propriedades, existem algumas propriedades importantes que são comuns à maioria delas (ver Secção 4.1 na página 23). Conforme referido na Secção 4.3 na página 29 no ambiente de desenvolvimento do VBA encontram-se disponíveis diversos tipos de controlos: botões de comando (Command Buttons), etiquetas (Labels), caixas de texto (Text Boxes), quadros (Frames), botões de opção (Option Buttons), caixas de verificação (Check Boxes) e caixas de listagem (List Boxes), entre outros. 9.3 Associação da Form ao procedimento Uma vez construída a form é preciso associá-la ao programa que a vai utilizar. Nesta fase há três aspectos a considerar: 1. Visualização da Form 2. Tratamento dos eventos que ocorram enquanto a Form estiver visível 3. Processamento dos resultados fornecidos pela Form O 2 o ponto, referente ao tratamento dos eventos, foi já discutido anteriormente. Os restantes serão tratados nas secções seguintes Como visualizar e terminar uma Form Para visualizar a UserForm usa-se o método Show: Exemplo: MinhaForm.Show Se, em alternativa, se pretender arrancar com a Form mas sem a visualizar nesse momento, usa-se a instrução Load: Exemplo: Load MinhaForm Quando se pretender tornar a Form visível, aplicar-se-á então o método Show. Após a sua utilização, quando uma Form deixar de ser necessária, deve-se utilizar a instrução Unload para a desactivar: Exemplo: 77
78 Unload Me No entanto, desactivar uma Form através da instrução Unload não implica que esta deixe de estar em memória. Para garantir a sua efectiva remoção, que se traduzirá na geração do evento Terminate, haverá que se usar a seguinte técnica: 1 Exemplo : 2 Set MinhaForm = Nothing Tratamento de eventos através de Event Handlers Este tema foi já introduzido na Secção na página 25. Pelo menos um controlo instalado na form deve ter um Event Handler associado. Vamos agora considerar o exemplo de um Event Handler utilizando a instrução Unload Me e associado a um controlo (neste caso, como é habitual, um botão de comando) presente na Form. Nesta instrução, a palavra Me indica ao VBA que a Form a desactivar será aquela a que o Event Handler diz respeito. Um exemplo de um Event Handler que termine uma Form pode ser: Listing 15: Handler do objecto cmdfechar para o evento click 1 Private Sub cmdfechar_click ( ) 2 Dim op As Integer 3 op = MsgBox( " S a i r?( Yes/No) ", vbyesno + vbquestion ) 4 I f op = vbyes Then 5 Unload Me 6 End I f 7 End Sub A sub-rotina acima vai especificar a reacção do botão de comando cmdfechar ao evento Click, neste caso apresentar uma MsgBox que confirme a intenção do utilizador de fechar a Form. Outro evento importante é o Change que ocorre sempre que se altera o conteúdo de objectos como as Text Box. Na Secção 9.4 na página 82 encontra-se um exemplo de um Event Handler associado a este tipo de evento. O tratamento de qualquer evento a ocorrer na Form, ou em qualquer dos controlos nela presentes, deverá basear-se num Event Handler que defina a resposta adequada Como recolher os resultados de uma Form Uma UserForm é muitas vezes utilizada para pedir informação ao utilizador. Nesse caso, será necessário recolher os dados introduzidos ou as opções seleccionadas nos controlos apropriados. Para tal é preciso aceder às propriedades Value dos diversos controlos existentes na Form e copiar os seus valores actuais para células da folha de cálculo. O conteúdo da propriedade Value nas principais classes de controlos encontra-se resumida na seguinte tabela: 78
79 Classe CheckBox OptionButton ListBox TextBox TabStrip Conteúdo True ou False conforme esteja ou não activada True ou False conforme esteja ou não activada A posição da linha seleccionada O conteúdo da TextBox (pode-se também usar a propriedade Text) Um inteiro indicando qual a Tab que está activa Recorde-se que nas List Boxes em VBA à 1 a linha corresponde a posição Exemplo de aplicação Vamos finalmente aplicar estes conceitos e técnicas na construção e integração de uma UserForm (descrita na Figura 40 na página seguinte) que permita a introdução conjunta dos dados de um aluno (Nome, Número e Curso) sem necessidade de recorrer a três Input Boxes separadas. Esta UserForm conterá duas Text Boxes para inserção do Nome e Número do aluno e uma Combo Box para selecção do seu Curso. Conforme referido na Secção na página 36, uma Combo Box é um controlo semelhante a uma List Box em que a lista está normalmente invisível, só aparecendo quando o campo superior é activado. Aplicam-se-lhe os mesmos métodos da classe ListBox. Listing 16: Exemplo de sub-rotina de invocação de uma UserForm 1 Public Sub testuserforminput ( ) 2 usrfrminput. Show 3 Set usrfrminput = Nothing 4 End Sub O macro da Listagem 16 chama a UserForm com o nome usrfrminput e remove-a de memória quando ela termine o seu trabalho. Para facilitar a sua invocação, é conveniente associar ao macro uma combinação de teclas específica, usando uma das técnicas já aprendidas (ver parte final da Secção 2.6). Listing 17: Exemplo de sub-rotina de inicialização de uma UserForm 1 Private Sub UserForm_Initialize ( ) 2 cmbcursos.additem " C i v i l " 3 cmbcursos.additem " I n f o r m a t i c a " 4 cmbcursos.additem " E l e c t r o t e c n i a " 5 cmbcursos.additem " Geotecnia " 6 cmbcursos. AddItem " Quimica" 7 cmbcursos.additem " Instrumentacao Medica" 8 End Sub A sub-rotina da Listagem 17 é um event handler especial que trata do evento Initialize. Este evento ocorre quando a UserForm é criada. Assim sendo, esta sub-rotina é executada de forma automática sempre que a UserForm arranca. Neste caso, trata de inicializar a Combo Box "cmbcursos" com os nomes dos diferentes cursos da escola. 79
80 Figura 40: A UserForm para Entrada Múltipla de Dados Listing 18: Handler do objecto cmdfechar para o evento Click 1 Private Sub cmdfechar_click ( ) 2 With Worksheets ( 4 ) 3. [ H5 ] = txtnome. Value 4. [ I5 ] = txtnum. Value 5. [ J5 ] = cmbcursos. Text 6 End With 7 Unload Me 8 End Sub O Event Handler da Listagem 18 está associado ao botão cmdfechar e é chamado quando sobre ele ocorre o evento Click. Antes de fechar a UserForm usando Unload, copia o conteúdo das duas Text Box e o da linha seleccionada da Combo Box para três células contíguas da folha de cálculo, permitindo assim memorizar os dados introduzidos pelo utilizador. Nessa listagem pode observar-se que as três instruções de atribuição a outras tantas células da folha de cálculo "Worksheets(4)" estão encapsuladas pela estrutura With..End With. Esta estrutura permite a omissão da referência ao objecto (neste caso a "Worksheets(4)") a que pertencem as células em causa. Isto é também válido quando queremos especificar propriedades ou aplicar métodos a um mesmo objecto. Veja-se o exemplo na Secção Exemplo de aplicação mais elaborado Neste exemplo mais elaborado vamos introduzir o controlo Tabstrip existente no VBA. Este objecto permite a apresentação de diferentes conjuntos de valores mediante a selecção de diferentes separadores ("tabs"). Na Figura 41 na página seguinte pode-se encontrar um exemplo de um objecto deste tipo. Numa Tabstrip é usual inserirem-se outros controlos, um pouco como se faria numa mini-form ou num quadro. No exemplo da figura, encontram-se três TextBox. 80
81 Figura 41: Objecto da classe Tabstrip Conforme já referido anteriormente (Secção 4.1 na página 23), para que um controlo possa reagir a acções provocadas pelo utilizador, como o "clicar" do rato, é preciso que o programador crie sub-programas especiais, chamados Event Handlers (tratadores de eventos) e que esses sub-programas sejam associados aos controlos respectivos. Esses Handlers contêm as instruções que controlam a reacção do objecto ao evento ocorrido. Vamos apresentar dois exemplos de Event Handlers, sub-programas que permitem especificar o comportamento de controlos em face de certos eventos. Em primeiro lugar, apresentar-se-á o Event Handler da form "UserForm" para o evento Initialize (Listagem 19). Este evento ocorre automaticamente quando, após o arranque do programa, a form é criada. Listing 19: Sub-rotina de inicialização da UserForm 1 Private Sub UserForm_Initialize ( ) 2 With TabStrip1 3. Tabs ( 0 ). Caption = " C i v i l " 4. Tabs ( 1 ). Caption = " I n f o r m a t i c a " 5. Tabs.Add " E l e c t r o t e c n i a " 6 End With 7 With Worksheets ( 4 ) 8 txtnumalunos. Text =. [ D5 ] 9 txtpercaprov. Text =. [ D6 ] txtmedia. Text =. [ D7 ] 11 End With 12 End Sub Este procedimento vai inicializar os dois separadores do controlo Tabstrip1 com que ele é criado por defeito, mudando-lhe os nomes para "Civil" e "Informática". De seguida, acrescenta um terceiro separador e dá-lhe o nome "Electrotecnia". Por fim, são atribuídos a cada uma das TextBox contidas na Tabstrip1 os conteúdos das três células da folha de 81
82 cálculo referentes ao curso referente ao 1 o separador. Mais uma vez, repare-se na utilização da estrutura With..End que permite simplificar a escrita das instruções 3,4 e 5. Sem ela, cada uma dessas instruções deveria vir precedida do nome do objecto a que se aplicam (TabStrip1 ). Da mesma forma, nas instruções 8,9 e 10, as referências às células D5, D6 e D7 teriam que ser precedidas da indicação de qual a folha de cálculo a que pertenciam (Worksheets(4)). O próximo procedimento (Listagem 20) é o Event Handler do controlo Tabstrip1 para o evento Change que ocorre sempre que alguma alteração ocorre nesse controlo, concretamente, uma mudança de separador activo. A propriedade Value dos objectos Tabstrip contem um valor numérico inteiro que traduz qual o separador que está activo. Em função do valor recolhido na variável v, a estrutura condicional imbricada If...Then...Else irá escolher o conjunto de valores correspondente e armazená-los nas caixas de texto respectivas. Listing 20: Handler associado ao objecto Tabstrip1 para o evento Change 1 Private Sub TabStrip1_Change ( ) 2 Dim v As Integer 3 With Worksheets ( 4 ) 4 v = TabStrip1. Value 5 I f v = 0 Then 6 txtnumalunos =. [ D5 ] 7 txtpercaprov =. [ D6 ] txtmedia =. [ D7 ] 9 ElseIf v = 1 Then 10 txtnumalunos =. [ E5 ] 11 txtpercaprov =. [ E6 ] txtmedia =. [ E7 ] 13 Else 14 txtnumalunos =. [ F5 ] 15 txtpercaprov =. [ F6 ] txtmedia =. [ F7 ] 17 End I f 18 End With 19 End Sub 82
83 10 Manipulação de texto O VBA representa texto através de strings (cadeias de caracteres). Não existe um tipo de dados específico para representar caracteres individuais, pelo que se utiliza o mesmo tipo usado para cadeias de caracteres Funções de manipulação de strings Nesta secção são introduzidas algumas funções especializadas no tratamento de strings e que serão utilizadas nos exemplos de programas de manipulação de texto apresentados na Secção 10.2 na página Trim, LTrim e RTrim Estas funções retornam uma cópia da string original, mas sem os eventuais espaços no início ou fim da string. Exemplos: Dim s1 As String, s2 As String s1 = " C i v i l " s2 = Trim( s1 ) Resultado : " C i v i l " s2 = LTrim( s1 ) Resultado : " C i v i l " s2 = RTrim( s1 ) Resultado : " C i v i l " Os espaços que ocorram no interior da string não são afectados por estas funções. A string original mantem-se inalterada Len Retorna o número de caracteres de uma string ou, por outras palavras, o seu comprimento.. Exemplos: Dim s1 As String, n As Integer s1 = " C i v i l " n = Len( s1 ) Resultado : n = 14 n = Len(Trim( s1 ) ) Resultado : n = Left, Right Estas funções copiam n caracteres da string s a partir da esquerda (Left) ou da direita (Right). Sintaxe: Left(s As String, n As Integer) As String Exemplos: 83
84 Dim s1 As String, s2 As String, n As Integer s1 = " C i v i l " n = 2 s2 = Left ( st1, n ) Resultado : s2 = " IS " s2 = Right ( st1, n ) Resultado : s2 = " i l " Eliminar o primeiro c a r a c t e r de uma s t r i n g. s1 = Right ( s1, Len( s1 ) 1) Resultado : s1 = "SEP C i v i l " Esta última instrução usa a função Right para seleccionar os primeiros Len(s1)-1 caracteres contados a partir da direita. Se Len(s1) nos dá o número de caracteres da string então os caracteres seleccionados serão todos menos o primeiro. Como esta nova string é de novo guardada em s1, estamos efectivamente a eliminar o 1 o caracter da string s Mid Sintaxe: Mid(s As String, i As Integer [, n As Integer]) As String Copia n caracteres da string s a partir da posição inicial i. Se n não for indicado (o 3 o argumento é opcional), será copiado tudo desde i até ao fim da string. Exemplos: Dim s1 As String, s2 as String s1 = " C i v i l " s2 = Mid( s1, 2, 2) Resultado : s2 = "EP" s2 = Mid( s1, 6, 10) Resultado : s2 = " C i v i l " s2 = Mid( s1, 6) Resultado : s2 = " C i v i l " InStr Sintaxe: Instr([i as Integer, ] s1 As String, s2 As String) As Integer Procura um padrão s2 dentro de uma string (s1) a partir da posição i. Se essa posição i não for definida (o 1 o argumento é opcional), a pesquisa começará no princípio da string. Se a pesquisa tiver sucesso, a função devolverá um valor numérico indicando a posição na string s1 em que o padrão s2 começa. Caso não tenha sucesso, será devolvido o valor zero. Exemplos: Dim s As String, n As Integer s = " C i v i l " n = Instr ( s, " " ) Resultado : n = 5 n = Instr (5, s, " " ) Resultado : 0 n = InStr ( s, " C i v i l " ) Resultado : 6 84
85 UCase, LCase Sintaxe: UCase(s As String) As String LCase(s As String) As String Retorna uma cópia da string original s, mas com letras convertidas para maiúsculas (UCase) ou minúsculas (LCase). Obviamente os valores numéricos e os caracteres de pontuação mantem-se inalterados. Exemplos: Dim s1 As String, s2 As String s1 = " i109123x " s2 = UCase( s1 ) Resultado : s2 = "I100Y" s2 = LCase( s1 ) Resultado : s2 = " i100y " 10.2 Algoritmos Nesta secção são discutidos métodos que permitem dividir uma string nos caracteres que a constituem e dividir uma frase em palavras Separação duma string em caracteres Para decompor uma string nos caracteres que a compõem, vamos apresentar dois métodos diferentes: 1. Método destrutivo da string original, usando um ciclo e as funções Left e Right - Listagem Método não-destrutivo, usando um ciclo e a função Mid - Listagem 22 na página seguinte Listing 21: Separação de string em caracteres - 1 o Método 1 Dim s As String, c As String 2 Do While s <> "" 3 c = Left ( s, 1) 4 Processamento do c a r a c t e r que acabou de ser i s o l a d o 5 s = Right ( s, Len( s ) 1) 6 Loop O método baseia-se na repetição das instruções nas linhas 3 e 5 para cada elemento da string. A 1 a instrução usa a função Left para isolar o 1 o caracter da string, copiando-o para a variável c. Conforme analizado na Secção na página 83 a 2 a instrução vai armazenar a string s uma vez expurgada do 1 o caracter. Será essa string amputada que vai ser processada na próxima iteração do ciclo. Este terminará quando s contiver a string vazia. O conteúdo da string original ficará assim perdido. 32 Os exemplos desta Secção são adaptações dos incluídos nos textos de apoio do prof. Ângelo Martins. 85
86 Listing 22: Separação de string em caracteres - 2 o Método 1 Dim s t As String, c As String, v As Integer 2 For v = 1 To Len( s ) 3 c = Mid( s, v, 1) 4 Processamento do c a r a c t e r que acabou de ser i s o l a d o 5 Next Este 2 o método baseia-se na instrução da linha 3, que usa a função Mid. Como descrito na Secção na página 84, esta função vai copiar um caracter (3 o argumento) da string s a partir da posição especificada pelo conteúdo da variável v. Esta variável, que é ao mesmo tempo a variável de controle do ciclo For, vai conter, ao longo do seu funcionamento, todos os valores desde 1 até Len(s), ou seja, a posição do último caracter da string. Não há qualquer alteração do conteúdo da string original Divisão de uma frase em palavras Para efeitos desta secção, considera-se uma palavra qualquer destes conjuntos: caracteres entre espaços, entre o início da string e o primeiro espaço, entre o último espaço e o fim da string, ou ainda todos os caracteres da string, se esta não contiver espaços. Listing 23: Separação de frase em palavras 1 Dim s As String, p a l As String, p As Integer 2 3 s = Trim( s ) 4 Do While s <> "" 5 p = InStr ( s, " " ) 6 I f p > 0 Then 7 pal = Left ( s, p 1) 8 s = LTrim( Right ( s, Len( s ) p ) ) 9 Else 10 pal = s 11 s = "" 12 End I f 13 Processamento da palavra contida em p a l 14 Loop O algoritmo descrito na Listagem 23 usa um método destrutivo, segundo o qual se procura sistematicamente o 1 o espaço contido na string (instrução 5). Sabendo nós que o início da string e esse espaço delimitam uma palavra, está achada a 1 a palavra, que é copiada para a variável pal (instrução 7) e de seguida eliminada da string (instrução 8). Nesta última instrução vale a pena atentar no seguinte: 1. Len(s) - p é o comprimento da string restante se lhe retirarmos a 1 a palavra 2. Right(s, Len(s) - p) copia a parte da string s que vai do seu fim até à posição p, ou seja, tudo menos a palavra que foi já copiada para pal. 86
87 3. A função LTrim limita-se a descartar o espaço existente entre a 1 a palavra e o resto da string. 4. A atribuição a s desta string truncada destroi a string original, preparando as condições para que na próxima iteração do ciclo seja destacada uma nova palavra. A utilização da estrutura If..Then..Else permite detectar se existem ou não espaços na string, testando o conteúdo da variável p. Se a função InStr encontrar um espaço (p > 0) é porque (ainda) existe uma palavra na string. Se não encontrar (p = 0) é porque a string é constituída por uma só palavra. Nesse caso as instruções executadas serão as que se encontram entre Else e End If (linhas 10 e 11), a 1 a copiando s para pal, a 2 a atribuindo a s a string vazia, o que terá como consequência a paragem do ciclo. 87
88 11 Notas finais Alguns dos exemplos apresentados foram inspirados no livro de Paul McFreddies[1]. Foram ainda reutilizados e adaptados materiais contidos na Sebenta de Introdução à Computação da minha autoria[2]. Referências [1] Paul McFredies. VBA for the Microsoft Office System, QUE. [2] António Silva. Sebenta de Introdução à Computação - Visual Basic,. 88
Programação em VBA Texto Introdutório. António Silva DEI-Isep 2009-10-28
Programação em VBA Texto Introdutório António Silva DEI-Isep 2009-10-28 1 . Conteúdo 1 Introdução 8 2 Conceitos Básicos 8 2.1 O que é um Macro?.............................. 8 2.2 Técnicas de construção
Informática de Gestão 1º ano / 1º semestre Ano letivo: 2014/2015. Visual Basic VBA
Informática de Gestão 1º ano / 1º semestre Ano letivo: 2014/2015 Visual Basic VBA Macros Funções Conjunto de instruções que são executadas sempre que se desejar e pela ordem apresentada As funções são
MICROSOFT ACCESS MICROSOFT ACCESS. Professor Rafael Vieira Professor Rafael Vieira
MICROSOFT ACCESS MICROSOFT ACCESS Professor Rafael Vieira Professor Rafael Vieira - Access - Programa de base de dados relacional funciona em Windows Elementos de uma Base de Dados: Tabelas Consultas Formulários
Utilização do SOLVER do EXCEL
Utilização do SOLVER do EXCEL 1 Utilização do SOLVER do EXCEL José Fernando Oliveira DEEC FACULDADE DE ENGENHARIA DA UNIVERSIDADE DO PORTO MAIO 1998 Para ilustrar a utilização do Solver na resolução de
Capítulo Tabelas e Gráficos
Capítulo O menu de tabelas e gráficos torna possível criar tabelas numéricas de funções guardadas na memória. Poderá também utilizar funções múltiplas para criar tabelas. Como utiliza a mesma lista de
A VISTA BACKSTAGE PRINCIPAIS OPÇÕES NO ECRÃ DE ACESSO
DOMINE A 110% ACCESS 2010 A VISTA BACKSTAGE Assim que é activado o Access, é visualizado o ecrã principal de acesso na nova vista Backstage. Após aceder ao Access 2010, no canto superior esquerdo do Friso,
Guia de Estudo Folha de Cálculo Microsoft Excel
Tecnologias da Informação e Comunicação Guia de Estudo Folha de Cálculo Microsoft Excel Estrutura geral de uma folha de cálculo: colunas, linhas, células, endereços Uma folha de cálculo electrónica ( electronic
COMPETÊNCIAS BÁSICAS EM TIC NAS EB1
COMPETÊNCIAS BÁSICAS EM TIC NAS EB1 Oficina do Correio Para saber mais sobre Correio electrónico 1. Dicas para melhor gerir e organizar o Correio Electrónico utilizando o Outlook Express Criar Pastas Escrever
Múltiplos Estágios processo com três estágios Inquérito de Satisfação Fase II
O seguinte exercício contempla um processo com três estágios. Baseia-se no Inquérito de Satisfação Fase II, sendo, por isso, essencial compreender primeiro o problema antes de começar o tutorial. 1 1.
Usando o Excel ESTATÍSTICA. Funções
Funções Podemos usar no Excel fórmulas ou funções. Anteriormente já vimos algumas fórmulas. Vamos agora ver o exemplo de algumas funções que podem ser úteis para o trabalho de Excel. Para começar podemos
Aplicações de Escritório Electrónico
Universidade de Aveiro Escola Superior de Tecnologia e Gestão de Águeda Curso de Especialização Tecnológica em Práticas Administrativas e Tradução Aplicações de Escritório Electrónico Folha de trabalho
Ministério das Finanças Instituto de Informática. Departamento de Sistemas de Informação
Ministério das Finanças Instituto de Informática Departamento de Sistemas de Informação Assiduidade para Calendários Específicos Junho 2010 Versão 6.0-2010 SUMÁRIO 1 OBJECTIVO 4 2 ECRÃ ELIMINADO 4 3 NOVOS
Microsoft Excel Macro V. Índice 16-) Formulários... 42 17-) Gerando código para o Formulário... 49
Microsoft Excel Macro V Índice 16-) Formulários... 42 17-) Gerando código para o Formulário... 49 16-) Formulários A forma mais comum de comunicação de um sistema com o usuário é por meio de caixas de
No final desta sessão o formando deverá ser capaz de aceder ao Word e iniciar um novo documento.
Sessão nº 2 Iniciar um novo documento Objectivos: No final desta sessão o formando deverá ser capaz de aceder ao Word e iniciar um novo documento. Iniciar um novo documento Ao iniciar-se o Word, este apresenta
MICROSOFT POWERPOINT
MICROSOFT POWERPOINT CRIAÇÃO DE APRESENTAÇÕES. O QUE É O POWERPOINT? O Microsoft PowerPoint é uma aplicação que permite a criação de slides de ecrã, com cores, imagens, e objectos de outras aplicações,
Manipulação de Células, linhas e Colunas
Manipulação de Células, linhas e Colunas Seleccionar células Uma vez introduzidos os dados numa folha de cálculo, podemos querer efectuar alterações em relação a esses dados, como, por exemplo: apagar,
Criando um formulário no VBA
Criando um formulário no VBA No dia-a-dia, não queremos nem ouvir falar em formulários: imediatamente nos vem à mente qualquer idéia relacionada com burocracia... Mas, na hora de criar interfaces de macros,
SISTEMA DE INFORMAÇÃO DAS PARTICIPAÇÕES DO ESTADO
SISTEMA DE INFORMAÇÃO DAS PARTICIPAÇÕES DO ESTADO SIPART (versão Setembro/2004) Manual de Utilização ÍNDICE 1. INTRODUÇÃO...3 2. ACEDER À APLICAÇÃO...4 3. CRIAR NOVO UTILIZADOR...5 4. CARACTERIZAÇÃO GERAL
O AMBIENTE DE TRABALHO DO WINDOWS
O AMBIENTE DE TRABALHO DO WINDOWS O Windows funciona como um Sistema Operativo, responsável pelo arranque do computador. Um computador que tenha o Windows instalado, quando arranca, entra directamente
Programação 2ºSemestre MEEC - 2010/2011. Programação 2º Semestre 2010/2011 Enunciado do projecto
Mestrado Integrado em Engenharia Electrotécnica e de Computadores Programação 2º Semestre 2010/2011 Enunciado do projecto O projecto a desenvolver pelos alunos consistirá numa sistema de monitorização,
Pesquisa e organização de informação
Pesquisa e organização de informação Capítulo 3 A capacidade e a variedade de dispositivos de armazenamento que qualquer computador atual possui, tornam a pesquisa de informação um desafio cada vez maior
Orientação a Objetos
1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou
Usando o Excel ESTATÍSTICA. A Janela do Excel 2007. Barra de título. Barra de menus. Barra de ferramentas padrão e de formatação.
Barra de deslocamento ESTATÍSTICA Barra de menus Barra de título Barra de ferramentas padrão e de formatação Barra de fórmulas Conjuntos e Células (Intervalos) Área de trabalho Separador de folhas Barra
Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos
TUTORIAL Memória Flash Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br [email protected]
APROG - Civil. Excel. Técnicas de pesquisa de informação em tabelas. Instituto Superior de Engenharia do Porto 2000-2007
APROG - Civil Excel Técnicas de pesquisa de informação em tabelas Instituto Superior de Engenharia do Porto 2000-2007 Elaborado por: António Silva (DEI-ISEP) Pesquisa de Informação em Tabelas O Excel
Manual de Utilização. Site Manager. Tecnologia ao serviço do Mundo Rural
Manual de Utilização Site Manager Tecnologia ao serviço do Mundo Rural Índice 1. Acesso ao Site Manager...3 2. Construção/Alteração do Menu Principal...4 3. Inserção/ Alteração de Conteúdos...7 4. Upload
Tarefa 18: Criar Tabelas Dinâmicas a partir de Listas de Excel
Tarefa 18: Criar Tabelas Dinâmicas a partir de 1. Alguns conceitos sobre Tabelas Dinâmicas Com tabelas dinâmicas podemos criar dinâmica e imediatamente resumos de uma lista Excel ou de uma base de dados
SAMUO APP: MANUAL DO ADMINISTRADOR
as novas tecnologias ao serviço do desenvolvimento de projectos w w w. i m a d i p. c o m CABO VERDE: REALIZAÇÃO DE UMA ACÇÃO- PILOTO PARA A MELHORIA DA GESTÃO NUM GABINETE TÉCNICO SELECCIONADO OFITEC
1. Criar uma nova apresentação
MANUAL DO Baixa da Banheira, 2006 1. Criar uma nova apresentação Para iniciar uma sessão de trabalho no PowerPoint é necessário criar uma nova apresentação para depois trabalhar a mesma. Ao iniciar uma
MANUAL DO UTILIZADOR
MANUAL DO UTILIZADOR Versão 1.6 PÁGINA DE PESQUISA A página principal do PacWeb permite a realização de um número muito variado de pesquisas, simples, ou pelo contrário extremamente complexas, dependendo
GUIA PARA O PREENCHIMENTO DOS FORMULÁRIOS ENTIDADE GESTORA ERP PORTUGAL
GUIA PARA O PREENCHIMENTO DOS FORMULÁRIOS ENTIDADE GESTORA ERP PORTUGAL Versão: 1.0 Data: 05-06-2009 Índice Acesso e estados dos Formulários... 3 Escolha do Formulário e submissão... 4 Bases para a navegação
SAFT para siscom. Manual do Utilizador. Data última versão: 07.11.2008 Versão: 1.01. Data criação: 21.12.2007
Manual do Utilizador SAFT para siscom Data última versão: 07.11.2008 Versão: 1.01 Data criação: 21.12.2007 Faro R. Dr. José Filipe Alvares, 31 8005-220 FARO Telf. +351 289 899 620 Fax. +351 289 899 629
Deverá ser apresentada uma caixa de combinação para auxiliar o utilizador a escolher o distrito de residência do entrevistado.
4.º PASSO PROGRAMAÇÃO DO CAMPO DISTRITO : PROJECTO COM ADO Deverá ser apresentada uma caixa de combinação para auxiliar o utilizador a escolher o distrito de residência do entrevistado. 1) Abra o formulário
CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES
CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 3.1 - IDENTIFICADORES Os objetos que usamos no nosso algoritmo são uma representação simbólica de um valor de dado. Assim, quando executamos a seguinte instrução:
Neste tutorial irá criar uma animação simples com base num desenho do Mechanical Desktop.
Neste tutorial irá criar uma animação simples com base num desenho do Mechanical Desktop. Inicialize o 3D Studio VIZ. Faça duplo clique no ícone de 3D Studio VIZ Abre-se a janela da figura seguinte. Esta
Os elementos básicos do Word
Os elementos básicos do Word 1 Barra de Menus: Permite aceder aos diferentes menus. Barra de ferramentas-padrão As ferramentas de acesso a Ficheiros: Ficheiro novo, Abertura de um documento existente e
Aplicações de Escritório Electrónico
Universidade de Aveiro Escola Superior de Tecnologia e Gestão de Águeda Curso de Especialização Tecnológica em Práticas Administrativas e Tradução Aplicações de Escritório Electrónico Folha de trabalho
Folha de Cálculo (Excel)
Tecnologias de Informação e Comunicação Folha de Cálculo (Excel) Professor: Rafael Vieira. 1. Introdução à folha de cálculo o nome folha de cálculo atribuído a este tipo de programas, deve-se, principalmente,
Excel - VBA. Macrocomandos (Macros) O que é uma macro? São programas que executam
Excel - VBA Docente: Ana Paula Afonso Macrocomandos (Macros) O que é uma macro? São programas que executam tarefas específicas, automatizando-as. Quando uma macro é activada, executa uma sequência de instruções.
Tarefa Orientada 2 Criar uma base de dados
Tarefa Orientada 2 Criar uma base de dados Objectivos: Criar uma base de dados vazia. O Sistema de Gestão de Bases de Dados MS Access Criar uma base dados vazia O Access é um Sistema de Gestão de Bases
Oficina de Construção de Páginas Web
COMPETÊNCIAS BÁSICAS EM TIC NAS EB1 Oficina de Construção de Páginas Web Criação e Publicação Guião Páginas WWW com o editor do Microsoft Office Word 2003 1. Introdução. 2. Abrir uma página Web. 3. Guardar
SECUNDÁRIA DE CAMARATE DIGIT@L. Plataforma Office 365. Alojamento de ficheiros - OneDrive para Empresas
SECUNDÁRIA DE CAMARATE DIGIT@L Plataforma Office 365 Alojamento de ficheiros - OneDrive para Empresas Conteúdo Nota prévia... 2 Alojamento de ficheiros o OneDrive para Empresas... 2 Funcionalidades do
Fluxo de trabalho do Capture Pro Software: Indexação de OCR e separação de documentos de código de correção
Este procedimento corresponde ao fluxo de trabalho de Indexação de OCR com separação de código de correção no programa de treinamento do Capture Pro Software. As etapas do procedimento encontram-se na
Associação Educacional Dom Bosco Curso de Engenharia 1º ano
Formatação condicional utilizando o valor da célula O que é? Algumas vezes é preciso destacar os valores, ou seja, como colocar em vermelho ou entre parênteses, os negativos, e de outra cor os positivos,
ZS Rest. Manual Avançado. Menus. v2011 - Certificado
Manual Avançado Menus v2011 - Certificado 1 1. Índice 2. Introdução... 2 3. Iniciar o ZSRest... 3 4. Menus... 4 b) Novo Produto:... 5 i. Separador Geral.... 5 ii. Separador Preços e Impostos... 7 iii.
Projecto de Programação MEEC - 2010/2011-1ºSemestre. Mestrado Integrado em Engenharia Electrotécnica e de Computadores
Mestrado Integrado em Engenharia Electrotécnica e de Computadores Programação 2010/2011 Enunciado do projecto O projecto a desenvolver pelos alunos consistirá numa sistema de monitorização do estado de
Iniciar o Data Adapter Configuration Wizard. Toolbox Data Duplo clique em OleDbDataAdapter. Botão next na caixa de diálogo
Iniciar o Data Adapter Configuration Wizard Toolbox Data Duplo clique em OleDbDataAdapter Botão next na caixa de diálogo Se carregar em Cancel, o wizard é cancelado e podemos depois definir as propriedades
Display de 7. PdP. Autor: Tiago Lone Nível: Básico Criação: 16/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos
TUTORIAL Display de 7 Segmentos Autor: Tiago Lone Nível: Básico Criação: 16/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br [email protected]
BARRA DE PROGRESSO EM VBA
BARRA DE PROGRESSO EM VBA Quando elaboramos uma programação em VBA e não sabemos o tempo de execução podemos utilizar uma alternativa para a visualização do progresso da tarefa, uma barra de progressão
PACWEB Módulo de Pesquisa MANUAL DO UTILIZADOR
MANUAL DO UTILIZADOR Versão 1.3 ÍNDICE 1. INTRODUÇÃO 2 2. INSTALAÇÃO E CONFIGURAÇÃO 3 2.1 INSTALAÇÃO 3 Instalar o Pacweb 3 Alterar o Ficheiro Default.htm 3 Criar um Virtual Directory 3 2.2 CONFIGURAÇÃO
MÓDULO 1 - Folha de Cálculo
ANUAL ANO LETIVO DE 2013/2014 Curso Profissional de Técnico de Apoio à Gestão Desportiva Curso Profissional de Técnico de Restauração Cozinha - Pastelaria Disciplina de Tecnologias da Informação e Comunicação
Folha de cálculo. Excel. Agrupamento de Escolas de Amares
Folha de cálculo Excel Agrupamento de Escolas de Amares Índice 1. Funcionalidades básicas... 3 1.1. Iniciar o Excel... 3 1.2. Criar um livro novo... 3 1.3. Abrir um livro existente... 3 1.4. Inserir uma
1 Code::Blocks Criação de projetos
Programação MEEC Índice 1Code::Blocks Criação de projetos...1 2Code::Blocks Localização do projeto...5 3Code::Blocks Abertura de projetos já existentes...7 4Code::Blocks Funcionamento...8 5Code::Blocks
Fluxo de trabalho do Capture Pro Software: Indexação de código de barras e separação de documentos
Este procedimento corresponde ao fluxo de trabalho de Indexação de código de barras e de separação de documentos no programa de treinamento do Capture Pro Software. As etapas do procedimento encontram-se
AMBIENTE DE PROGRAMAÇÃO PYTHON
Computadores e Programação Engª Biomédica Departamento de Física Faculdade de Ciências e Tecnologia da Universidade de Coimbra Ano Lectivo 2003/2004 FICHA 1 AMBIENTE DE PROGRAMAÇÃO PYTHON 1.1. Objectivos
Fórmulas e Funções 7
Fórmulas e Funções 7 7.9. Visualização automática do resultado Para visualizar rapidamente o resultado das funções mais simples média, soma, contar, mínimo e máximo: 1. Menu de contexto sobre a barra de
NOÇÕES ELEMENTARES DE BASES DE DADOS
1 NOÇÕES ELEMENTARES DE BASES DE DADOS Este primeiro capítulo aborda conceitos elementares relacionados com bases de dados. Os conceitos abordados neste capítulo são necessários para trabalhar adequadamente
Aplicações de Escritório Electrónico
Universidade de Aveiro Escola Superior de Tecnologia e Gestão de Águeda Curso de Especialização Tecnológica em Práticas Administrativas e Tradução Aplicações de Escritório Electrónico Folha de trabalho
Oficina de Construção de Páginas Web
COMPETÊNCIAS BÁSICAS EM TIC NAS EB1 Oficina de Construção de Páginas Web Criação e Publicação Actividades de exploração Objectivo Explorar as funcionalidades essenciais do Programa, na perspectiva da construção/actualização
Iniciação à Informática
Meu computador e Windows Explorer Justificativa Toda informação ou dado trabalhado no computador, quando armazenado em uma unidade de disco, transforma-se em um arquivo. Saber manipular os arquivos através
ZS Rest. Manual Profissional. BackOffice Mapa de Mesas. v2011
Manual Profissional BackOffice Mapa de Mesas v2011 1 1. Índice 2. Introdução... 2 3. Iniciar ZSRest Backoffice... 3 4. Confirmar desenho de mesas... 4 b) Activar mapa de mesas... 4 c) Zonas... 4 5. Desenhar
Banco de Dados Microsoft Access: Criar tabelas. Vitor Valerio de Souza Campos
Banco de Dados Microsoft Access: Criar tabelas Vitor Valerio de Souza Campos Objetivos do curso 1. Criar uma tabela no modo de exibição Folha de Dados. 2. Definir tipos de dados para os campos na tabela.
ÍNDICE... 2 INTRODUÇÃO... 4
Mic crosoft Excel 201 0 ÍNDICE ÍNDICE... 2 INTRODUÇÃO... 4 Interface... 4 Guias de Planilha... 5 Movimentação na planilha... 6 Entrada de textos e números... 7 Congelando painéis... 8 Comentários nas Células...
Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas
Microsoft Power Point 2003 No Microsoft PowerPoint 2003, você cria sua apresentação usando apenas um arquivo, ele contém tudo o que você precisa uma estrutura para sua apresentação, os slides, o material
Google Sites. A g r u p a m e n t o C a m p o A b e r t o 2 0 1 0 / 2 0 1 1
Google Sites A g r u p a m e n t o C a m p o A b e r t o 2 0 1 0 / 2 0 1 1 1. Google Sites A Google veio anunciar que, para melhorar as funcionalidades centrais do Grupos Google, como listas de discussão
PLANIFICAÇÃO ANUAL DE CONTEÚDOS
ESCOLA SECUNDÁRIA DE MANUEL DA FONSECA Curso Profissional: Técnico de Gestão e Equipamentos Informáticos PLANIFICAÇÃO ANUAL DE CONTEÚDOS GRUPO 550 CICLO DE FORMAÇÃO 2012/2015 ANO LECTIVO 2012/2013 DISCIPLINA:
Módulo III. Folhas de Cálculo
Módulo III Ferramentas do Office Folhas de Cálculo Ferramentas de produtividade 1 Folhas de Cálculo O que é: Uma Folha de Cálculo é, por tradição, um conjunto de células que formam uma grelha ou tabela
Administração da disciplina
Administração da disciplina Agrupamento Vertical de Escolas de Tarouca Documento disponível em: http://avetar.no-ip.org 1.Acesso e utilização da plataforma:. Seleccione a opção Entrar, que se encontra
1. Ambiente de Trabalho
1 Ambiente de Trabalho 1. Ambiente de Trabalho Ao nível do ambiente de trabalho, depois de o Excel 2007 ter introduzido novos componentes (e.g., Botão Office e Friso) e eliminado alguns dos componentes
TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO - TIC 10º C. Planificação de. Curso Profissional de Técnico de Secretariado
Escola Básica e Secundária de Velas Planificação de TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO - TIC Curso Profissional de Técnico de Secretariado 10º C MÓDULO 1 FOLHA DE CÁLCULO Microsoft Excel Conteúdos
Lição 1 - Criação de campos calculados em consultas
1 de 5 21-08-2011 22:15 Lição 1 - Criação de campos calculados em consultas Adição de Colunas com Valores Calculados: Vamos, inicialmente, relembrar, rapidamente alguns conceitos básicos sobre Consultas
FICHA ORIENTADA Nº1. Barra de fórmulas. Área de trabalho T E C N O L O G I A S D E I N F O R M A Ç Ã O E C O M U N I C A Ç Ã O
T E C N O L O G I A S D E I N F O R M A Ç Ã O E C O M U N I C A Ç Ã O FICHA ORIENTADA Nº1 INTRODUÇÃO À FOLHA DE CÁLCULO CRIAÇÃO DE UMA FOLHA DE CÁLCULO O Microsoft Excel é um programa que faz parte das
Banco de Dados Microsoft Access: Criar tabelas
Banco de Dados Microsoft Access: Criar s Vitor Valerio de Souza Campos Objetivos do curso 1. Criar uma no modo de exibição Folha de Dados. 2. Definir tipos de dados para os campos na. 3. Criar uma no modo
Aplicações de Escritório Electrónico
Universidade de Aveiro Escola Superior de Tecnologia e Gestão de Águeda Curso de Especialização Tecnológica em Práticas Administrativas e Tradução Aplicações de Escritório Electrónico Microsoft Word Folha
Primeiramente lemos a seguinte citação, copiada de Excel-Ajuda:
33 Capítulo 3 Procedimentos (macros) Primeiramente lemos a seguinte citação, copiada de Excel-Ajuda: O objetivo de uma macro é automatizar as tarefas usadas com mais freqüência. Embora algumas macros sejam
Dim formulário As Object formulário = Me Me.Text = "Título"
1.1.1 OBJECT As variáveis do tipo Object representam referências a objectos alojados na memória, em endereços reservados. A partir do momento em que atribuímos um objecto a uma variável deste tipo, podemos
Esta aplicação permite desempenhar tarefas relacionadas com o cálculo, análise e apresentação gráfica de dados, de uma forma rápida e eficaz.
Apresentação do programa A folha de cálculo Excel é um componente do pacote Office. Esta aplicação permite desempenhar tarefas relacionadas com o cálculo, análise e apresentação gráfica de dados, de uma
7.3. WINDOWS MEDIA PLAYER 12
7.3. WINDOWS MEDIA PLAYER 12 Este programa permite gerir toda a sua colecção de músicas, vídeos e até mesmo imagens, estando disponível para download no site da Microsoft, o que significa que mesmo quem
Migrar para o Access 2010
Neste Guia Microsoft O aspecto do Microsoft Access 2010 é muito diferente do Access 2003, pelo que este guia foi criado para ajudar a minimizar a curva de aprendizagem. Continue a ler para conhecer as
Banco de Dados BrOffice Base
Banco de Dados BrOffice Base Autor: Alessandro da Silva Almeida Disponível em: www.apostilando.com 27/02/2011 CURSO TÉCNICO EM SERVIÇO PÚBLICO Apostila de Informática Aplicada - Unidade VI Índice Apresentação...
1. Estilos 1. 2. Índices 7
Carlos Maia Índice 1. Estilos 1 1.1. Considerações gerais 1 1.2. Aplicar estilos 1 1.3. Modificar estilos 2 1.4. Criar um novo estilo 3 1.5. Cópia de estilos 5 1.6. Retirar todos os estilos presentes num
Índice. Como aceder ao serviço de Certificação PME? Como efectuar uma operação de renovação da certificação?
Índice Como aceder ao serviço de Certificação PME? Como efectuar uma operação de renovação da certificação? Como efectuar uma operação de confirmação de estimativas? Como aceder ao Serviço de Certificação
Formação Microsoft Excel Nível Intermédio
Formação Microsoft Excel Nível Intermédio António Araújo Silva - 2010 INTRODUÇÃO O presente documento procura efectuar a Planificação de uma acção de formação a decorrer nas instalações da Escola EBI de
Utilizar o Microsoft Offi ce OneNote 2003: Iniciação rápida
Utilizar o Microsoft Offi ce OneNote 2003: Iniciação rápida Utilizar a iniciação ao OneNote 1 O MICROSOFT OFFICE ONENOTE 2003 OPTIMIZA A PRODUTIVIDADE AO PERMITIR QUE OS UTILIZADORES CAPTEM, ORGANIZEM
MANUAL DE UTILIZADOR Aplicativo: Análise do Estudo da Lição da Escola Sabatina. 0. INTRODUÇÃO... 2 1. ARRANQUE DO APLICATIVO... 2 1.1. Início...
Índice 0. INTRODUÇÃO... 2 1. ARRANQUE DO APLICATIVO... 2 1.1. Início... 2 1.2. Perguntas de segurança... 2 2. FORMULÁRIO PRINCIPAL DO APLICATIVO... 4 2.1. Caixa de Texto: Nome da Igreja... 4 2.2. Botão:
Abaixo do Objeto WorkSheet temos a coleção Cells, que representa todas as células de uma planilha.
Aula 1 O modelo de objetos do Excel APPLICATION É o próprio Excel. Temos diversas propriedades e métodos importantes nesse objeto. Destacamos dois exemplos: Application.DisplayAlerts Se for true, o Excel
Ministério Público. Guia de Consulta Rápida
Ministério Público Ministério Público Guia de Consulta Rápida Versão 3 (Outubro de 2009) - 1 - ÍNDICE 1. ACEDER AO CITIUS MINISTÉRIO PÚBLICO... 4 2. BARRA DE TAREFAS:... 4 3. CONFIGURAR O PERFIL DO UTILIZADOR...
Tarefa Orientada 18 Tabelas dinâmicas
Tarefa Orientada 18 Tabelas dinâmicas Análise de dados através de tabelas dinâmicas. Conceitos teóricos As Tabelas Dinâmicas são tabelas interactivas que resumem elevadas quantidades de dados, usando estrutura
Microsoft Access 2010. Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento
Microsoft Access 2010 Para conhecermos o Access, vamos construir uma BD e apresentar os conceitos necessários a cada momento 1 Principais objetos do Access Tabelas Guardam a informação da BD (Base de Dados)
Excel VBA - Parte IV:Inserindo um formulário e seus comandos
Page 1 of 9 Excel VBA - Parte IV:Inserindo um formulário e seus comandos desenvolvendo VBA através de um exemplo prático Nesta parte do artigo vamos ver como inserir formulários e seus componentes. Conteúdo
02 - Usando o SiteMaster - Informações importantes
01 - Apresentação do SiteMaster - News Edition O SiteMaster foi desenvolvido para ser um sistema simples de gerenciamento de notícias, instalado em seu próprio computador e com configuração simplificada,
Direcção Regional de Educação do Algarve
MÓDULO 1 Folha de Cálculo 1. Introdução à folha de cálculo 1.1. Personalização da folha de cálculo 1.2. Estrutura geral de uma folha de cálculo 1.3. O ambiente de da folha de cálculo 2. Criação de uma
Guia para a declaração de despesas no Programa SUDOE
Guia para a declaração de despesas no Programa SUDOE CAPÍTULO 1: INTRODUÇÃO... 2 CAPÍTULO 2: ACESSO AO MÓDULO DE GESTÃO DE DESPESAS PAGAS... 3 CAPÍTULO 3: GESTÃO DAS DESPESAS PAGAS... 4 3.1 Incorporação
TIC Unidade 2 Base de Dados. Informação é todo o conjunto de dados devidamente ordenados e organizados de forma a terem significado.
Conceitos relativos à Informação 1. Informação O que á a informação? Informação é todo o conjunto de dados devidamente ordenados e organizados de forma a terem significado. 2. Dados Em informática designa-se
Microsoft Office FrontPage 2003
Instituto Politécnico de Tomar Escola Superior de Gestão Área Interdepartamental de Tecnologias de Informação e Comunicação Microsoft Office FrontPage 2003 1 Microsoft Office FrontPage 2003 O Microsoft
Aplicações de Escritório Electrónico
Universidade de Aveiro Escola Superior de Tecnologia e Gestão de Águeda Curso de Especialização Tecnológica em Práticas Administrativas e Tradução Aplicações de Escritório Electrónico Folha de trabalho
Manual SAGe Versão 1.2 (a partir da versão 12.08.01)
Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Submissão de Relatórios Científicos Sumário Introdução... 2 Elaboração do Relatório Científico... 3 Submissão do Relatório Científico... 14 Operação
AMBIENTE. FORMULÁRIO: é a janela do aplicativo apresentada ao usuário. Considere o formulário como a sua prancheta de trabalho.
DELPHI BÁSICO VANTAGENS Ambiente de desenvolvimento fácil de usar; 1. Grande Biblioteca de Componentes Visuais (VCL - Visual Component Library), que são botões, campos, gráficos, caixas de diálogo e acesso
Seu manual do usuário EPSON LQ-630 http://pt.yourpdfguides.com/dref/1120693
Você pode ler as recomendações contidas no guia do usuário, no guia de técnico ou no guia de instalação para. Você vai encontrar as respostas a todas suas perguntas sobre a no manual do usuário (informação,
Identificação das variáveis de entrada; resultados/variáveis de saída e método ou solução. (procedimentos e funções)
Aulas anteriores... Formulação adequada do problema Identificação das variáveis de entrada; resultados/variáveis de saída e método ou solução Definição do algoritmo Método de decomposição hierárquica utilizando
