1
Estruturada Quando precisamos de escrever código para resolver um determinado problema, dizemos normalmente que precisamos de um "programa" para esse fim. Programa, aqui, é entendido como um conjunto de código que visa resolver um determinado problema. Embora o programa possa ser concebido usando simplesmente um procedimento, a realidade é que, ou pela sua extensão ou por questões de ordem semântica, em geral preferimos dividir a codificação do programa em vários procedimentos que estão relacionados entre si. Ao fazer a distribuição do código por vários procedimentos, dividindo sucessivamente a tarefa principal em tarefas mais elementares, estamos a fazer aquilo a que se chama de programação estruturada. Podemos definir o nosso programa como sendo um procedimento principal que faz algumas coisas e que chama outros procedimentos para fazer outras coisas. Cada um desses procedimentos pode ainda, se necessário, chamar mais procedimentos. Quando um procedimento precisa de chamar outro, basta-lhe indicar o nome desse tal procedimento e, se necessário, passar-lhe os respectivos argumentos. Deve-se usar a lógica para dividir o programa em vários procedimentos. Um procedimento deve representar uma única operação funcional Decidir quando uma operação particular deve ter uma funcionalidade isolada é em grande parte uma questão de preferência e de experiência. Vantagens em separar o programa em diversas sub-rotinas: Se quisermos usar uma rotina VBA repetidamente, precisamos escrever essa rotina somente uma vez. Fazer isso também facilita a sua edição porque temos que fazer alterações somente num lugar. Podemos separar o código VBA em segmentos pequenos e lógicos que são mais fáceis de ser codificados, corrigidos e mantidos. 2
Estruturada Ao contrário do que acontece em outras linguagens de programação, a definição de um procedimento em VBA nunca pode ser feita dento de outro procedimento. Em VBA a definição dos procedimentos é sempre independente, isto é, a definição de um procedimento só pode começar depois de acabar a definição de outro. 3
Sub ou Function Em VBA, quando precisamos de escrever um procedimento temos duas opções: escrever um Sub ou uma Funtion Sintaxe Tipo do valor a devolver. Não pode ser do tipo Array Sub nome [(lista de argumentos)] [instruções] [Exit Sub] [instruções] Function nome [(lista de argumentos)] [As tipo] [instruções] [nome = expressão] [Exit Function] [instruções] [nome = expressão] End Function Diferenças Function permite devolver um valor ao procedimento que a tiver chamado e Sub não tem essa capacidade. Têm que ser do mesmo tipo! Function pode ser chamada através das fórmulas inseridas nas células do Excel. 4
Sub ou Function Notas: Em ambos os casos o código é incluso entre uma primeira linha que descreve o procedimento (Sub ou Function) e uma linha final que indica o fim do procedimento ( ou End Function). Em ambos os casos existe também a possibilidade de indicar a lista de argumentos com que o procedimento trabalhará. Para que a função devolva um determinado valor é necessário que dentro do seu código se atribua esse valor ao seu nome. Se isso não for feito, o VBA fará com que a função devolva um valor por defeito. Os argumentos e os valores de retorno são do tipo Variant por defeito, senão for especificado nenhum tipo de dado. 5
Definição Versus Chamadas Um procedimento Sub é uma série de instruções Visual Basic delimitada por instruções Sub e, que efectuam acções mas não devolvem um valor. Um procedimento Sub pode aceitar argumentos Um procedimento Function é uma série de instruções Visual Basic delimitada pelas instruções Function e End Function. Um procedimento Function é idêntico a um procedimento Sub, mas uma função pode devolver um valor. Um procedimento Function pode aceitar argumentos. A definição de um procedimento é o código que descreve aquilo que ocorre quando o procedimento for executado, ou seja, quando for chamado. A chamada de um procedimento é um pedido para que o procedimento seja executado, isto é, para que o controlo passe para o código que constitui a definição do procedimento. A chamada pode envolver a passagem de parâmetros e eventualmente a devolução de um valor (no caso das funções). 6
Exemplos: Sub Area() Dim Comp As Double Dim Larg As Double Comp = 10 Larg = 20 CalculaArea Comp, Larg 'Chamada do Procedimento CalculaArea Sub CalculaArea(Ocomp As Double, Alarg As Double) Dim Area As Double ' Declara variável local. If Ocomp = 0 Or Alarg = 0 Then Exit Sub ' Sai do Procedimento imediatamente End If Area = Ocomp * Alarg ' Calcula a área do rectângulo. MsgBox Area ' Mostra a área. Definição do Procedimento CalculaArea 200 7
Exemplos: Sub Multiplicar() Dim Var1 As Integer Dim Var2 As Integer Dim Var3 As Integer Var1 = 5 Var2 = 10 Var3 = Multiplica(Var1, Var2) Chamada da Função Multiplica MsgBox Var3 A instrução em que é feita uma atribuição ao nome da função especifica o valor de retorno da função Função que devolve o produto de dois argumentos Function Multiplica(ByVal Var1, ByVal Var2) Multiplica = Var1 * Var2 End Function Definição da Função Multiplica 9 8
Argumentos Nomedoargumento AS Tipodoargumento, Nomedoargumento AS Tipodoargumento... Exemplo: Sub Subtrai ( x1 As Integer, x2 As Integer) MsgBox x1 x2 Na declaração do Procedimento Este procedimento não pode ser executado só por si, já que só funciona se lhe forem passados dois argumentos (neste caso dois inteiros); logo temos de o chamar a partir de outro procedimento onde lhe possamos fornecer esses valores. Os argumentos declarados passam a funcionar, dentro do procedimento, como variáveis. Sub FazContas () Estes Valores têm de ser do mesmo Tipo do Argumento correspondente na definição do procedimento a ser chamado! Senão dá erro! Subtrai 5, 6 Subtrai 25,12 Na chamada do Procedimento 9
Argumentos Notas: Para chamar o procedimento Subtrai, indicamos uma lista de valores correspondentes a cada um dos argumentos, separados por virgulas. Uma vez concluída a execução do procedimento Subtrai ( com estes argumentos) o controlo é devolvido ao procedimento Fazcontas. Depois é executada a instrução seguinte à chamada do procedimento Subtrai. É muito importante a ordem pela qual os argumentos são passados. O primeiro argumento dado vai corresponder ao primeiro argumento recebido e assim sucessivamente. Subtrai 5, 6 é diferente de Subtrai 6,5. 10
No exemplo anterior apresentámos sempre constantes como argumentos. No entanto, podemos também apresentar variáveis ou mesmo expressões, desde que o seu tipo seja compatível com o tipo do argumento correspondente no procedimento chamado. A regra continua a ser a mesma: aquilo que for apresentado como primeiro argumento a passar vai ser usado como o primeiro argumento no procedimento chamado e assim sucessivamente. Exemplo: Sub FazContas () Dim x As Integer, y As Integer x = 5 y = 6 Subtrai x, y Subtrai x + y, 2 * x Esta chamada vai provocar a execução do procedimento Subtrai usando o valor de x como primeiro argumento e o valor de y como o segundo argumento. -1 Esta chamada vai provocar a execução do procedimento Subtrai usando o valor de x + y como primeiro argumento e o valor de 2 * x como o segundo argumento. 1 11
Argumentos Não existe qualquer relação entre o nome dos argumentos do procedimento chamado e o nome dos argumentos usados na chamada. Ou seja, o facto de termos dado os nomes x1 e x2 aos argumentos do procedimento Subtrai (na sua definição) não quer de forma alguma dizer que este procedimento só possa ser chamado com variáveis que tenham esse mesmo nome! O VBA encarrega-se de fazer as necessárias correspondências. Em geral, quando se passam argumentos a um procedimento, o VBA trata de adequar cada um deles aos que se encontram descritos na definição do dito procedimento. A adequação é feita respeitando a sequência em que os argumentos são representados. Assim, o primeiro argumento declarado na definição do procedimento vai tomar o valor do primeiro argumento apresentado nessa chamada do procedimento; o segundo argumento declarado na definição do procedimento vai tomar o valor do segundo argumento apresentado nessa chamada do procedimento; e assim sucessivamente para cada um dos argumentos. Sub Exemplo ( v As Integer, msg1 As String, msg2 As String)... End sub Dentro de outro procedimento S = Olá Exemplo 3, s, Bom dia 12
Regras Gerais de utilização de parêntesis Ao Utilizar uma função numa expressão do lado direito de uma instrução de atribuição ou como argumento de um procedimento, deve-se colocar os argumentos dessa função entre parêntesis. Também se pode chamar uma função ou procedimento Sub utilizando a palavra - chave Call, caso em que se deve novamente colocar quaisquer argumentos entre parêntesis. Se a função ou procedimento Sub for chamada por ela mesmo não como parte de uma expressão e sem usar a palavra-chave Call -, não se deve colocar os argumentos entre parêntesis. 13
Ficheiro Help On-Line Do VBA: Os procedimentos Sub, as instruções incorporadas e alguns métodos que não devolvem um valor. Quando chama um deles, não necessita de colocar os seus argumentos entre parêntesis, como se mostra no exemplo seguinte. MeuSub "argumentocadeia", ArgumentInteiro Os procedimentos Function, as funções incorporadas e alguns métodos que não devolvem um valor. Não necessita de incluir parêntesis se ignorar o valor devolvido. Neste caso, chama a função da mesma forma que chama um procedimento Sub. Deve omitir os parêntesis e listar os argumentos (se existirem) e não atribuir a função a uma variável, como se mostra no exemplo seguinte. MsgBox "Tarefa concluída!", 0, "Caixa de tarefa" Se quiser utilizar o valor de retorno de uma função, necessita de colocar os argumentos entre parêntesis, como se mostra no exemplo seguinte. Answer3 = MsgBox("Está contente com o seu salário?", 4, "Pergunta 3") Uma instrução num procedimento Sub ou Function pode passar valores a um procedimento chamado, utilizando argumentos com nome. Aplicam-se as linhas de orientação relativas à utilização de parêntesis, quer utilize ou não argumentos com nome. Os argumentos com nome são sempre seguidos de dois pontos e de um sinal de igual (:=) e depois do valor de argumento. O exemplo seguinte chama a função MsgBox, utilizando argumentos com nome e ignora o valor de retorno. MsgBox Title:="Caixa de tarefa", Prompt:="Tarefa completa!" O exemplo seguinte chama a função MsgBox utilizando argumentos com nome e atribui o valor de retorno à variável answer3. answer3 = MsgBox(Title:="Pergunta 3", _ Prompt:="Está contente com o seu salário?", Buttons:=4) 14
Argumentos passados por valor ou por referência Argumento passado por referência Quando se apresenta uma variável como argumento na chamada de um procedimento, é passada uma referência dessa variável ao argumento correspondente no procedimento chamado. Assim, o procedimento chamado pode alterar o valor da variável (passada como argumento) no procedimento chamante. Quando queremos indicar que um argumento deve ser passado por referência utilizamos a palavra-chave ByRef na declaração do procedimento em causa. Argumento passado por valor Quando se apresenta uma variável como argumento na chamada de um procedimento, é passada uma cópia do valor dessa variável ao argumento correspondente no procedimento chamado. Assim, O procedimento chamado não pode alterar o valor da variável (passada como argumento) no procedimento chamante. Quando queremos indicar que um argumento deve ser passado por Valor utilizamos a palavra-chave ByVal na declaração do procedimento em causa. 15
Exemplo: Public Sub Experiência(ByRef X As Integer, ByVal Y As Integer) X = 5 Y = 10 Public Sub Teste() Dim A As Integer, B As Integer A = 0 B = 0 Experiência A, B MsgBox "A = " & A & "; B = " & B O Valor da variável passada como 1º argumento pode ser alterado pelo procedimento chamado. O Valor da variável passada como 2º argumento não pode ser alterado pelo procedimento chamado. A = 5; B = 0 16
Notas: Por defeito, O VBA faz as passagens de argumentos por referência ou seja, quando não se indica ByRef ou ByVal é assumido ByRef. A decisão entre os dois tipos de passagem (para cada argumento) é tomada aquando da definição de cada procedimento. Na chamada dos procedimentos tudo o que temos que fazer é sujeitarmo-nos à forma como o procedimento foi definido. Quando desejarmos que uma variável apresentada como argumento (numa chamada) sofra alterações dentro do procedimento chamado, temos de usar uma passagem por referência. Quando apenas queremos passar o seu valor para o procedimento chamado, utilizamos uma passagem por valor. 17
Exemplo completo: Public Sub Experiência(ByRef X As Integer, ByVal Y As Integer) MsgBox "Xini = " & X MsgBox "Yini = " & Y X = 5 Y = 10 MsgBox "Xfin= " & X MsgBox "Yfin = " & Y Public Sub Teste() Dim A As Integer, B As Integer A = 0 B = 0 MsgBox "Aini = " & A MsgBox "Bini = " & B Experiência A, B MsgBox "Afin = " & A & "; Bfin = " & B 18