Este tutorial irá ensiná-lo a criar e usar funções com e sem parâmetros no VBA
O VBA contém uma grande quantidade de funções integradas para você usar, mas você também pode escrever as suas próprias. Ao escrever código em VBA, você pode escrevê-lo em um Sub Procedure ou Function Procedure. Um procedimento de função é capaz de retornar um valor ao seu código. Isso é extremamente útil se você deseja que o VBA execute uma tarefa para retornar um resultado. As funções VBA também podem ser chamadas de dentro do Excel, assim como as funções internas do Excel.
Criando uma função sem argumentos
Para criar uma função, você precisa definir a função dando um nome a ela. A função pode então ser definida como um tipo de dados indicando o tipo de dados que você deseja que a função retorne.
Você pode criar uma função que retorne um valor estático cada vez que for chamada - um pouco como uma constante.
123 | Função GetValue () As IntegerGetValue = 50Função Final |
Se você executasse a função, ela sempre retornaria o valor 50.
Você também pode criar funções que se referem a objetos no VBA, mas você precisa usar Definir palavra-chave para retornar o valor da função.
123 | Função GetRange () como intervaloDefina GetRange = Range ("A1: G4")Função Final |
Se você fosse usar a função acima em seu código VBA, a função sempre retornaria o intervalo de células A1 a G4 em qualquer planilha em que você esteja trabalhando.
Chamando uma função de um subprocedimento
Depois de criar uma função, você pode chamá-la de qualquer outro lugar em seu código usando um Sub Procedure para chamar a função.
O valor de 50 sempre será retornado.
Você também pode chamar a função GetRange de um Sub Procedure.
No exemplo acima, a função GetRange é chamada pelo procedimento Sub para colocar em negrito as células no objeto de intervalo.
Criação de funções
Argumento Único
Você também pode atribuir um parâmetro ou parâmetros à sua função. Esses parâmetros podem ser chamados de Argumentos.
123 | Função ConvertKilosToPounds (dblKilo as Double) as DoubleConvertKiloToPounds = dblKilo * 2.2Função Final |
Podemos então chamar a função acima a partir de um Sub Procedimento para calcular quantas libras é uma quantidade específica de quilos.
Uma função pode ser chamada a partir de vários procedimentos em seu código VBA, se necessário. Isso é muito útil porque evita que você tenha que escrever o mesmo código repetidamente. Também permite dividir procedimentos longos em pequenas funções gerenciáveis.
No exemplo acima, temos 2 procedimentos - cada um deles está usando a função para calcular o valor da libra dos quilos passados a eles no dblKilo Argumento da função.
Argumentos Múltiplos
Você pode criar uma função com vários argumentos e passar os valores para a função por meio de um procedimento sub.
123 | Função CalculateDayDiff (Date1 as Date, Date2 as Date) as DoubleCalculateDayDiff = Date2-Date1Função Final |
Podemos então chamar a função para calcular a quantidade de dias entre 2 datas.
Argumentos Opcionais
Você também pode passar argumentos opcionais para uma função. Em outras palavras, às vezes você pode precisar do argumento e às vezes não - dependendo do código com o qual você está usando a função.
123456 | Função CalculateDayDiff (Date1 as Date, Optional Date2 as Date) as Double'verifique a segunda data e, se não houver, torne a Data2 igual à data de hoje.Se Data2 = 0, então Data2 = Data'calcular diferençaCalculateDayDiff = Date2-Date1Função Final |
Valor de argumento padrão
Você também pode definir o valor padrão dos argumentos opcionais ao criar a função, de modo que, se o usuário omitir o argumento, o valor que você colocou como padrão será usado em seu lugar.
1234 | Função CalculateDayDiff (Date1 as Date, Optional Date2 as Date = "06/02/2020") as Double'calcular diferençaCalculateDayDiff = Date2-Date1Função Final |
ByVal e ByRef
Quando você passa valores para uma função, você pode usar o ByVal ou ByRef palavras-chave. Se você omitir qualquer um deles, o ByRef é usado como padrão.
ByVal significa que você está passando uma cópia da variável para a função, enquanto ByRef significa que você está se referindo ao valor original da variável. Quando você passa uma cópia da variável (ByVal), o valor original da variável é NÃO alterado, mas quando você faz referência à variável, o valor original da variável é alterado pela função.
1234 | Função GetValue (ByRef intA As Integer) As IntegerintA = intA * 4GetValue = intAFunção Final |
Na função acima, o ByRef poderia ser omitido e a função funcionaria da mesma maneira.
1234 | Função GetValue (intA As Integer) As IntegerintA = intA * 4GetValue = intAFunção Final |
Para chamar esta função, podemos executar um subprocedimento.
123456789 | Sub TestValues ()Dim intVal As Integer'preencher a variável com o valor 10intVal = 10'executa a função GetValue e mostra o valor na janela imediataDebug.Print GetValue (intVal)'mostra o valor da variável intVal na janela imediataDebug.Print intValEnd Sub |
Observe que as janelas de depuração mostram o valor 40 ambas as vezes. Quando você passa a variável IntVal para a função - o valor de 10 é passado para a função e multiplicado por 4. Usar a palavra-chave ByRef (ou omiti-la por completo) irá ALTERAR o valor da variável IntVal. Isso é mostrado quando você mostra primeiro o resultado da função na janela imediata (40) e, em seguida, o valor da variável IntVal na janela de depuração (também 40).
Se NÃO quisermos alterar o valor da variável original, temos que usar ByVal na função.
1234 | Função GetValue (ByVal intA As Integer) As IntegerintA = intA * 4GetValue = intAFunção Final |
Agora, se chamarmos a função de um subprocedimento, o valor da variável IntVal permanecerá em 10.
Função de saída
Se você criar uma função que testa uma determinada condição, e uma vez que a condição for considerada verdadeira, você deseja retornar o valor da função, pode ser necessário adicionar uma instrução Exit Function em sua Function para sair da função antes você executou todo o código nessa função.
12345678910111213 | Função FindNumber (strSearch As String) As IntegerDim i As Integer'faz um loop em cada letra da stringPara i = 1 para Len (strSearch)'se a letra for numérica, retorna o valor para a funçãoIf IsNumeric (Mid (strSearch, i, 1)) ThenFindNumber = Mid (strSearch, i, 1)'então saia da funçãoFunção de saídaFim sePróximoFindNumber = 0Função Final |
A função acima fará um loop pela string fornecida até encontrar um número e, em seguida, retornará esse número da string. Ele só encontrará o primeiro número na string, pois então Saída a função.
A função acima pode ser chamada por uma rotina Sub, como a abaixo.
1234567 | Sub CheckForNumber ()Dim NumIs as Integer'passar uma string de texto para a função encontrar númeroNumIs = FindNumber ("Upper Floor, 8 Oak Lane, Texas")'mostra o resultado na janela imediataDebug.Print NumIsEnd Sub |
Usando uma função de dentro de uma planilha do Excel
Além de chamar uma função de seu código VBA usando um subprocedimento, você também pode chamar a função de dentro de sua planilha do Excel. As funções que você criou devem, por padrão, aparecer na sua lista de funções na seção Definida pelo Usuário da lista de funções.
Clique no fx para mostrar a caixa de diálogo Inserir Função.
Selecione Usuário definido da lista de categorias
Selecione a função que você deseja a partir do disponível Funções definidas pelo usuário (UDF's).
Como alternativa, quando você começa a escrever sua função no Excel, a função deve aparecer na lista suspensa de funções.
Se você não quiser que a função esteja disponível em uma planilha do Excel, será necessário colocar a palavra Privada antes da palavra Função ao criar a função em seu código VBA.
123 | Função privada CalculateDayDiff (Date1 as Date, Date2 as Date) as DoubleCalculateDayDiff = Date2-Date1Função Final |
Agora ele não aparecerá na lista suspensa que mostra as funções do Excel disponíveis.
Curiosamente, no entanto, você ainda pode usar a função - ela simplesmente não aparecerá na lista ao procurá-la!
Se você declarou o segundo argumento como Opcional, você pode omiti-lo na planilha do Excel, bem como no código VBA.
Você também pode usar a função a que criou sem argumentos em sua planilha do Excel.