• Nenhum resultado encontrado

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 multi- dimensionais. A declaração de vectores multi-dimensionais far-se-á acrescentando di- mensõ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 intei- ros. 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 vec- tor 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 1apara controlar as linhas e a

dos ciclos For. Dessa maneira, vão ser percorridos automaticamente os intervalos de valores dos índices de 1 até nl (variável contendo o no de linhas) e de 1 até nc (variável

contendo o no de colunas).

Listing 9: Soma de matrizes

1 Option Base 1 2 Const L i n h a s = 10 3 Const Colunas = 10 4

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 10 11 n l = Val ( txtNL . Text ) 12 nc = Val ( txtNC . Text ) 13 I f nc < 1 Or nc > Colunas Or n l < 1 Or n l > L i n h a s Then 14 MsgBox " Dimensoes ␣ e r r a d a s ! " 15 Else 16 For i = 1 To n l ’ l e i t u r a da m a t r i z 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 n l ’ l e i t u r a da m a t r i z 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 n l ’ 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

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.

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 capaci- dades 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 legi- bilidade 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:

Figura 33: Funções como caixas pretas

1. A seguir ao nome da função e entre parênteses encontra-se uma lista de argumen- tos, 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).

No documento Programação em VBA Texto Introdutório (páginas 59-63)

Documentos relacionados