VBA – As diferenças entre Sub e Function

Introdução

O VBA possui dois tipos de estruturas para construção de algoritmos, Sub e Function.

A questão que surge é, quando usar uma ou outra na construção de nossos algoritmos em VBA no Excel? Na prática, Sub e Function trabalham da mesma forma com uma única diferença. A Sub são funções de processamento autônomo enquanto as Functions podem (e devem) retornar valores no final de sua execução.

Veja a estrutura de cada uma:

Sub ExemploSub([parâmetros])
     ' corpo do código
End Sub

onde:

[modificador] são palavras chave que definem o nível de acesso à estrutura de código.

[parâmetros] são variáveis que são passadas na chamada da função e utilizadas dentro. Podem existir vários ou mesmo nenhum parâmetro.

[tipo] é o que informa o tipo de dado a ser retornado pela Function. Pode ser qualquer tipo de dados válido do VBA.

[valor] uma valor que representa o retorno da função. Pode ser uma variável ou um valor constante.

Como saber qual utilizar? Isto depende do contexto da sua aplicação. Quando sua rotina precisar simplesmente executar uma processamento sem emitir qualquer tipo de informação, é aconselhável usar uma Sub. Já quando seu processamento necessitar devolver algum resultado, sem dúvida uma Function é necessária. Supondo uma situação em que você precisa criar funções que executassem operações aritméticas, elas precisariam depois de efetuar os cálculos, devolver o resultado para ser utilizado.

Veja este exemplo:

Public Function SomaSimplesF(x As Long, y As Long) As Long
    SomaSimplesF = x + y
End Function

O código efetua uma operação simples recendo duas variáveis do tipo Long como parâmetro e devolve também um Long (definido na construção da Function) através da chama SomaSimples na linha 2. Para testar as função, basta ir a uma célula da planilha e digitar =SomaSimplesF(1;3). É possível também testar a função através de código VBA, como no código abaixo:

Public Sub TestaSomaSimplesF()
    Dim soma As Long
    'chama a função SomaSimplesF e atribui o resultado à variável soma
    soma = SomaSimplesF(1, 2)
    'mostra o resultado em uma caixa de mensagem
    MsgBox soma
End Sub

Já se este exemplo fosse construído usando uma Sub, não seria possível diretamente retornar o valor como é feito na Function.  A solução então seria mostrá-lo ao usuário, por exemplo em uma caixa de mensagem. Veja este exemplo:

Public Sub SomaSimplesS(x As Long, y As Long)
    MsgBox = x + y
End Sub

Para testar a função, é precisa criar outro bloco de código que faça a chamada a este. Crie a seguinte função para testar o SomaSimplesS:

Public Sub TestaSomaSimplesF()
    'Faz a chamada a Sub SomaSimplesF
    Call SomaSimples(1, 2)
End Sub

Veja que o Sub não tem sequer a opção de mencionar o tipo de dado que pode ser retornado.

No Microsoft Excel, as Functions possuem uma característica especial. Elas podem ser usadas para criação de funções de planilha. A exigência para que isso seja possível, é criá-las com o modificador Public, que é o padrão
caso seja omitido.

Dentro deste entendimento, uma Function sempre poderá assumir o papel de uma Sub, mas não o contrário. Também por isso, o Excel utiliza Functions para criação de funções de planilha personalizadas e Subs para gravação de Macros.

Para superar a limitação do retorno de um único valor ou mesmo conseguir retornar alguns valores em Subs, é necessária a utilização passagem de parâmetros por referência. Este assunto será discutido em outro texto.

Comentários

Alguns podem pensar que por segurança, é melhor sempre criar Functions ao
invés de Subs. Porém, para termos de organização de código e padronização
de suas rotinas em VBA, procure usar a estrutura correta para ter um bom
funcionamento de seu aplicativo.