Procedimentos

Explicação sobre procedimentos em VBA e dicas em como usá-los.

Introdução

Procedimentos são blocos de código que tem o objetivo de realizar alguma tarefa. Essencialmente, o VBA possui 3 tipos de procedimentos: subprocedimentos, funções e propriedades.

Procedimentos têm início e fim. O nome de sua primeira linha é declaração. Na declaração de um procedimento, devemos obrigatoriamente especificar seu tipo e nome.

O exemplo a seguir mostra dois procedimentos: um chamado MostrarIdade e outro ObterIdade:

O tipo de um procedimento é determinado por uma palavra chave:

  • Sub: Subprocedimento;
  • Function: Função;
  • Property: Propriedade (não mostrado aqui).

As regras para dar nome a um procedimento são:

  • Iniciar com uma letra;
  • Ter de 1 até um máximo de 255 caracteres;
  • Não ter espaços (no entanto, é permitido o uso de sublinhado, exemplo: Gerar_Relatório);
  • Não ter nome igual a uma das palavras chaves do VBA, como If, End, Next, String, etc;
  • Não estar repetido no módulo em que está contido.

Você pode ter vários procedimentos no mesmo módulo, desde que sejam respeitadas as regras acima. Se quiser ver a lista de todos os procedimentos de um módulo em ordem alfabética, abra sua Janela de Código do módulo desejado, selecione (Geral) na caixa de combinação à esquerda e expanda a caixa de combinação à direita:

Se você clicar em algum dos procedimentos dessa lista, o VBE posicionará o cursor de inserção de texto dentro dele.

Como Nomeio meus Procedimentos

Procedimentos devem ter um nome descritivo que corresponda exatamente ao seu papel desempenhado. Invariavelmente, o VBA tem laços estreitos com o inglês, então, é muito comum eu misturar palavras em português com inglês. A regra básica é: use o inglês o máximo que puder, desde que não traduza termos do modelo de negócios do seu projeto.

Exemplo: você pretende criar uma função que te mostre a quantidade de cavalos que há numa fazenda. Um nome ruim seria ObterQuantidadeDeCavalos. Em boas práticas de programação, use algo como GetCavalosCount. Com o tempo, você ganhará uma boa noção que na programação, que no geral, Get é uma palavra chave que indica que você quer obter um valor, e Count seria a quantidade. Traduzir Cavalo para Horse seria demais, porque Cavalo é uma entidade do projeto que você está desenvolvendo.

Analogamente, o nome de um procedimento que exiba um relatório dos Cavalos poderia ser algo como ShowCavaloReport.

Vale a pena relembrar que, para ser um bom programador, seu inglês tem que estar afiado.

Não use abreviações para poupar a quantidade de teclas que você digita. Dessa forma, você irá prejudicar a leitura do seu código. Se você já tem um procedimento que se chama ShowCavaloReport, basta digitar ShowC e pressionar Ctrl+Barra de Espaços para que o editor do VBE mostre uma janela suspensa Intellisense com termos sugeridos para você completar o que está querendo digitar.

O primeiro exemplo dado nesta página (MostrarIdade e ObterIdade) contradiz minhas “boas práticas” de nomenclatura de procedimentos. Desculpe-me, mas isso acontecerá mais vezes. E mais: não seja obcecado por nomenclaturas e formato de código. Estou brincando, seja sim.
Lembre-se desta frase: “Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.

A Posição de um Procedimento num Módulo

Um módulo pode ter uma região chamada de Seção de Declaração. Se essa região existir, ela sempre deverá estar no topo. Os procedimentos devem ser posicionados sempre depois da seção de declaração. O exemplo abaixo mostra o esquema de um módulo com sua seção de declaração e três procedimentos:

Como podem ver, o VBE separa a seção de declaração e procedimentos com uma linha clara cinza (isso pode ser alterado nas configurações do editor).

Costumo chamar de Main o procedimento inicial dos meus códigos.

Subprocedimentos

Subprocedimentos são procedimentos que podem ser executados explicitamente por um usuário ou por outro procedimento. Antes de prosseguir a leitura sobre procedimentos, você deve ler a página a seguir:

Subprocedimentos

Escopo de um Procedimento

O escopo de um procedimento diz respeito sobre sua acessibilidade num projeto. Existem procedimentos locais e procedimentos públicos.

Ele é especificado em sua declaração através de uma palavra chave colocada antes de seu tipo. As palavras chaves são:

  • Private: Procedimentos locais;
  • Public: Procedimentos públicos.

O exemplo a seguir mostra o subprocedimento público Main e a função local IsValid:

Public Sub Main()
End Sub
 
Private Function IsValid()
End Function

Se você não especificar nenhuma palavra chave para definir o escopo de um procedimento, o VBA assume que ele é público. Logo, as declarações abaixo são equivalentes:

Sub Main()
 
'é equivalente a:
 
Public Sub Main()

Procedimentos Públicos

Procedimentos Públicos tem esse nome porque podem ser chamados por qualquer outro procedimento de qualquer módulo de um projeto.

Como já visto, subprocedimentos que são públicos são mostrados na Janela de Macros do aplicativo (Alt+F8), desde que não possuam argumentos (argumentos serão vistos posteriormente).

Se seu projeto possuir dois procedimentos públicos de nome repetido e você chamar de um terceiro procedimento um procedimento com esse nome, o VBA acessará o procedimento local:

No entanto, se o terceiro procedimento estiver num módulo separado, você obterá um erro de compilação, pois o VBA não saberá qual dos procedimentos acessar:

Para contornar essa situação, qualifique o nome do procedimento a chamar utilizando a forma módulo.procedimento. O exemplo a seguir executa o subprocedimento Calcular do módulo mdlDespesas:

Public Sub Main()
  mdlDespesas.Calcular
End Sub

Procedimentos Locais

Procedimentos locais são acessíveis somente a procedimentos que estão no mesmo módulo.

Se você tentar acessar um procedimento local a partir de outro módulo, obterá um erro de compilação como mostrado a seguir:

Um procedimento local pode chamar procedimentos públicos normalmente. No entanto, se existir um procedimento local com o mesmo nome do procedimento público, o VBA executará o procedimento local.

Funções

Função é um procedimento que é capaz de retornar um valor a um procedimento que o chamou.

Você precisa ter conhecimento sobre alguns conceitos importantes antes de iniciar o estudo de funções. Leia as páginas a seguir, em sequência:

Variáveis e Constantes

Argumentos e Parâmetros

Funções

Procedimentos de Eventos

(em breve)

Propriedades

(em breve)

Sobre Felipe Gualberto

Microsoft Most Valuable Professional (MVP) de Excel.
Esta entrada foi publicada em Tutoriais e marcada com a tag , , , , , , , , , . Adicione o link permanente aos seus favoritos.
  • André

    Excelente Artigo Felipe. Uma dúvida, fiz um teste e vi que os procedimentos aceitam o comando ‘static’ em suas declarações…sabe qual é o comportamento do procedimento com essa declaração ?

    • André, explicarei a palavra chave Static ao subir com meu artigo de “Variáveis e Constantes”. Antecipando o assunto, utilize Static para não perder o está de uma variável ao sair de um procedimento. Em outras palavras:

      Sub Main
      Mostrar
      End Sub

      Sub Mostrar
      Static i As Long
      i = i + 1
      Debug.Print i
      End Sub

      Se você rodar Main duas vezes, verá que i incrementa a cada execução e mantém seu valor. Se você trocar Static por Dim, verá que i sempre valerá 1.
      Usar Static como modificador de procedimento é o mesmo que falar ao VBE o seguinte: “todas as variáveis que eu declarar neste procedimento serão estáticas”.

      • André

        Legal Felipe, valeu pela explicação !