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.
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:
Os tipos de Sub disponíveis são Private e Public:
Por padrão se não for declarado o tipo da Sub ela será considerada como Public pelo VBA.
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
Ao criar uma função ela deve ser seguida por um nome que siga os seguintes critérios:
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:
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.
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.
Exercícios Sugeridos
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