VBA - Artigo 002 - Procedimentos: sub-rotina, evento e função


Procedimentos: sub-rotina, evento e função

Se você fez alguma coisa em VBA no Excel certamente você já trabalhou com sub-rotina. Se fez algum formulário, com certeza trabalhou com evento. Ambos são popularmente conhecidos como Sub, pois no código são precedidos por essa palavra chave.
A sub-rotina é a forma mais básica, são procedimentos que independem de um objeto e podem utilizar ou não argumentos:

Sub ProcedimentoPrincipal()

Os eventos são procedimentos relacionados a objetos, como, por exemplo, o evento Worksheet_Activate, que está relacionado ao objeto Worksheet:

Private Sub Worksheet_Activate()

Os eventos podem ou não ter argumentos, que são variáveis associadas ao evento em si. Um exemplo de evento com argumento é Worksheet_SelectionChange, que vem com o argumento Target dentro dos parênteses:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Não vou colocar exemplos de sub-rotinas e eventos porque você deve ter visto as videoaulas do Alessandro Trovato e deve saber  como funcionam. Se não assistiu ainda, assista algumas delas para aprender.
Já as funções são semelhantes a eventos com argumentos:

Function CalcularINSS(ByVal Salario As Currency) As Currency

Note que as funções diferem dos demais porque elas retornam um valor e há uma declaração do tipo de variável que ela retorna ao final da linha. Elas podem inclusive ser utilizadas em fórmulas dentro da própria planilha do Excel. Ou seja, você pode construir suas próprias funções! Use o código da função CalcularINSS abaixo e teste em sua planilha, colocando valores de salários e fazendo a função trazer o cálculo:

Function CalcularINSS(Salario As Currency) as Currency

    Dim sngPercDeducao  As Single
    
    Select Case Salario
        Case Is <= 1556.94
            sngPercDeducao = 0.08
        Case Is <= 2594.92
            sngPercDeducao = 0.09
        Case Else
            sngPercDeducao = 0.11
    End Select
    
    CalcularINSS = CCur(Salario * sngPercDeducao)

    If CalcularINSS > 513.01 Then
        CalcularINSS = 513.01
    End If

End Function

Perceba que o próprio nome da função aparece no código recebendo o resultado de um cálculo. É esse o valor que será retornado pela função.
As funções podem ter mais de um argumento e ainda é possível colocar ter argumentos como opcionais. É importante lembrar que todo parâmetro opcional é sempre colocado no final na lista de argumentos. Vejamos o exemplo da função CalcularIR abaixo:

Function CalcularIR(Salario As Currency , Optional Dependente As Integer = 0) _
   As Currency

    Dim sngPercDeducao  As Single

    Select Case Salario
        Case Is <= 1903.98
            sngPercDeducao = 0
        Case Is <= 2826.65
            sngPercDeducao = 0.075
        Case Is <= 3751.05
            sngPercDeducao = 0.15
        Case Is <= 4664.68
            sngPercDeducao = 0.225
        Case Else
            sngPercDeducao = 0.275
    End Select

    CalcularIR = CCur(Salario * sngPercDeducao - Dependente * 189.59)

    If CalcularIR < 0 Then
        CalcularIR = 0
    End If

End Function

Analisando o código atentamente, vemos que nessa função existem dois parâmetros: Salario e Dependente, sendo este último definido como opcional. O valor zero é atribuido caso esse parâmetro não seja colocado entre os parâmetros da função.
Às vezes é bem mais prático criar uma função no VBA do que colocar uma fórmula grande e complexa, sujeita a erros. As funções também podem ser referenciadas no próprio VBA, você pode atribuir o resultado a uma variável ou ainda incluir no meio de uma operação matemática:

DescontoIR = CalcularIR(SalBruto)
    
SalLiquido = SalBruto - CalcularIR(SalBruto) - CalcularINSS(SalBruto) - _
 DescontoVT + CalcularSalFam(SalBruto)

Em relação ao escopo de procedimento, por padrão, todas as sub-rotinas e funções que você escrever serão públicas, exceto se você acrescentar a palavra Private antes de Sub ou Function. Não há necessidade de escrever Public, a não ser que queira deixar o código mais explícito.
Já os eventos de planilha e de formulário são privados por padrão. Pode-se perceber que sempre aparecem precedidos pela palavra Private.

Qual a melhor forma de utilizar os procedimentos?

O ideal é deixar cada procedimento fazendo uma parte pequena do processamento, de forma que possa ser reutilizado em outra parte e desta forma não haver necessidade de reescrever o código. Por exemplo, se em algum ponto do processamento é necessário reordenar uma tabela, é preferível separar essa parte do código em uma sub-rotina separada. No trecho onde estaria esse código, coloque o nome da sub-rotina, sem parênteses.

Deixe os nomes das suas sub-rotinas o mais explícito possível, de forma que no código fique mais legível o que será feito. É muito melhor ler ReordenarClientes, por exemplo, do que simplesmente Reordenar ou, pior ainda, SortPlan. Eu tenho o hábito de sempre colocar os verbos no infinitivo e o objeto referente, se for o caso.

Imagine uma rotina que acrescente os dados do cliente após apertar um botão. É possível colocar todo o código no evento, mas também é possível colocar trechos em sub-rotinas separadas. Veja como fica mais fácil entender:

Private Sub btn_CadastrarCliente_Click()

Dim bolValidacao As Boolean

ValidarCampos ' realiza a consistência dos campos do formulário

If bolValidacao = True Then
AdicionarCliente ' adiciona o cliente na planilha
Else
Msgbox "Todos os campos devem estar preenchidos"
End If

End Sub

Note que há duas sub-rotinas sendo referenciadas: ValidarCampos e AdicionarCliente. São seções separadas de código onde devem serão codificadas as partes relativas à validação dos campos do formulário e à inserção do cliente na tabela, respectivamente. Perceba como seções de código mais curtas e com procedimentos com nomes amigáveis tornam tudo muito mais legível e fácil de entender.

Antes de começar a digitar o código, sempre é bom fazer um planejamento do que será feito. Isso permite verificar eventuais problemas ou falhas do projeto. Imagine estar digitando o código há duas horas e de repente notar uma falha gritante que impossibilita de continuar ou, pior, força a ter de refazer boa parte do trabalho feito até então. Terrível, não?

Existem diversas metodologias de desenvolvimento de software, sendo relativamente fácil encontrar sobre o assunto na internet. O método ágil, por exemplo, traz as seguintes etapas: planejamento, levantamento de requisitos, projeto, codificação, testes e documentação. Sair codificando sem ter a real noção do que será feito é pular etapas essenciais que garantem a qualidade do serviço. As horas gastas em planejamento, levantamento de requisitos e projeto valem a pena, poupam retrabalho e garante a qualidade do serviço.

Pesquise sobre metodologias, como o método ágil supracitado, gaste um tempo aprendendo sobre algumas delas. Depois olhe qualquer projeto que você já tenha feito e veja como ficaria muito melhor se tivesse feito um planejamento prévio do que seria feito. Sempre é possível melhorar o que já foi feito, mas praticando alguma metodologia permite entregar um serviço com mais qualidade e talvez até nem seja possível ver o que pode ser melhorado.


Pedro Martins

Formado em Tecnologia em Eletrônica Digital, já trabalhou como artefinalista, eletrotécnico, programador de CLP (para máquinas industriais) e analista de sistemas em sistema bancário, programando em COBOL.
Mexe com computadores e programação desde a segunda metade dos anos 1980, quando teve um MSX e aprendeu a programar em BASIC. É a favor da disseminação do conhecimento.


Catálogo de aulas (NOVIDADE)

Criei um catálogo de aulas para ajudar você em seus estudos. Acesse clicando na imagem abaixo ou clique aqui.


Postagem Anterior Próxima Postagem