VBA Subrotina e Função


Para construção e execução dos códigos, o VBA possui dois tipos de procedimentos: Subrotina (ou simplesmente Sub) e Function.

Os exemplos neste tutorial até o momento foram sempre atrelados a uma Sub. Daqui em diante caso não for explicitado que se trata de uma Function, continuaremos subentendendo que se trata de uma Sub.


Subrotina

Uma Sub pode ser usada para executar outra Sub:

    Sub sub_principal()
        sub_auxiliar1
        sub_auxiliar2
    End Sub
    Sub sub_auxiliar1()
        MsgBox "Uma Sub executando uma Sub"
    End Sub
    Sub sub_auxiliar2()
        MsgBox "Uma Sub executando mais outra Sub"
    End Sub

Para este e demais exemplos adiante execute apenas a sub_principal. Clicando em qualquer lugar entre a linha Sub sub_principal() e o primeiro End Sub.

Sub também aceita um argumento:

    Sub sub_principal()
        sub_argumento(10) '10 é um argumento
    End Sub
    Sub sub_argumento(x as Integer)
        MsgBox x
    End Sub

É possível passar um argumento para a Sub apenas utilizando um espaço simples:

    sub_argumento 10 '10 é um argumento

Ou múltiplos argumentos:

    Sub sub_principal()
        Dim nota As Single
        Dim aluno As String

        nota=10
        aluno="Paulo"
        Call sub_argumento (nota, aluno) 'nota é um argumento, aluno é outro argumento
    End Sub
    Sub sub_argumento(n_prova as Single, nome as String)
        MsgBox nome & " tirou " & n_prova
    End Sub

Para passar mais de um argumento em uma Sub, é necessário utilizar a instrução Call antes do nome da Sub que se quer chamar.

Também é possível executar uma Sub com múltiplos argumentos omitindo a instrução de chamada Call e os parênteses:

sub_argumento nota, aluno

Tenha a prática de declarar as variáveis nos mesmos tipos de dados que a Sub requer como argumentos.
E.g. n_prova e nota.

Subs também podem ser acessadas de módulos diferentes:


Tipos de Sub

Os tipos de Sub disponíveis são Private e Public:

Private Sub

Por padrão se não for declarado o tipo da Sub ela será considerada como Public pelo VBA.


Functions

Functions (ou funções em português) funcionam de forma similar a Subrotinas com argumentos. A principal diferença é que a Function obrigatoriamente irá retornar um valor e deve ser chamada por algum outro procedimento.

    Sub sub_principal()
        resultado = multiplicar_2(10)
        Msgbox resultado
    End Sub
    Function multiplicar_2(x As Single)
        multiplicar_2 = x*2
    End Function

Não é possível passar argumentos para uma função através do espaço simples, se estiver sendo associada a uma variável.

    resultado = multiplicar_2 10 'Resultará em erro!

Note que:

MsgBox resultado 'Não resultará em erro, pois não há associação.

Não é possível executar uma Function sozinha. É necessário ser chamada por outro procedimento.
E.g. Sub sub_principal().

Uma vez definidas, as funções podem ser utilizadas normalmente pelo usuário no ambiente da planilha do Excel. Basta apenas chamar pelo nome da função, como com qualquer outra função pré-definida (SOMA, MÉDIA, etc.).

Podemos também definir na declaração o tipo de resultado que a Function retornará:

  Function multiplicar_2(x As Single) As Integer
      multiplicar_2 = x*2
  End Function

Note que agora a função só retornará resultados arredondados para inteiros, dada especificação de retorno As Integer.

Existem muitas funções pré-definidas do próprio VBA. MsgBox é uma delas.

        Msgbox "Isso deve ser mostrado" 'MsgBox funciona sem os parênteses
        Msgbox ("Isso deve ser mostrado") 'E funciona com os parênteses

Nomeando uma Function

Ao criar uma função ela deve ser seguida por um nome que siga os seguintes critérios:


Erros de Função

Pergunta: E se o usuário introduzir na minha função valores inesperados?

Resposta: Avise-o retornando um erro.

Para retornar um erro podemos utilizar a função pré-definida CVErr, que tem como argumento um valor inteiro (Integer) para especificar de qual erro se trata.

Os possíveis valores que ele aceita são:

Exemplo: Para calcular a área de um triângulo, teríamos a princípio a seguinte função:

Function AreaTriangulo(Base As Single, Altura As Single) As Double
    'As Double acima especifica o tipo de dado de retorno do AreaTriangulo
    AreaTriangulo = (Base * Altura) / 2

End Function

Não é esperado para o cálculo de área valores negativos, portanto, vamos criar um erro caso o usuário venha a inseri-los:

Function AreaTriangulo(Base As Single, Altura As Single) As Variant 
'As Variant está definindo o tipo de dados de AreaTriangulo

    If Base < 0 Or Altura < 0 Then
        AreaTriangulo = CVErr(2036)
    Else
        AreaTriangulo = (Base * Altura) / 2
    End If

End Function

Desta modo, caso o usuário venha a utilizar valores negativos, aparecerá na celula da função o seguinte erro: NÚM!

O tipo de dados de CVErr(2036) é Error. Este tipo de dados, além de não ser comum também não é compatível com dados numéricos (que serão necessários para o calculo da área). Por isso, vamos associar AreaTriangulo ao tipo de dados Variant. Desta forma AreaTriangulo aceitará tanto o tipo de dados de Error, caso ocorra, quanto o tipo Double, caso calcule normalmente área do triângulo.


Sub VS Function

Por padrão as funções do próprio Excel são nomeadas com todas as letras maiúsculas.

Misturar letras minúsculas e maiúsculas é uma boa maneira de diferenciar do padrão Excel, explicitando a função que foi criada pelo usuário.



Fixando o Aprendizado

Exercícios Sugeridos

Soma de Potências Função Fatorial Soma Infinita Fatorial Recursivo


SuperExcelVBA.com é um site voltado ao aprendizado de VBA. Exemplos e explicações podem ter sido simplificados para maior e mais veloz compreensão. Estamos constantemente nos atualizando e corrigindo erros, porém não existe garantia sobre o conteúdo disponível no site. Todos os direitos reservados.

Excel ® é uma marca registrada da Microsoft Corporation.

© 2024 SuperExcelVBA | SOBRE

Protected by Copyscape