Subprocedimentos

Esta página explica o primeiro tipo de procedimento, que são os subprocedimentos.

Introdução

É recomendável ler a página procedimentos antes de continuar.

Subprocedimentos (ou macros, subrotinas, rotinas, sub) são procedimentos que executam alguma ação. Eles podem ser chamados (isto é, executados) explicitamente por uma ação direta do usuário, por um botão do aplicativo, pela interface da Faixa de Opções do aplicativo, por outro procedimento e várias outras formas.

O prefixo de declaração que você deve usar num subprocedimento é a palavra-chave Sub.

Suponha que você queira criar dois procedimentos: um que preencha dados em células numa planilha e outro que formate as células. Você poderia, nesse caso, criar um subprocedimento para fazer cada uma dessas ações. Um nome adequado ao primeiro seria FillData e ao segundo, FormatData:

Sub FillData()
  Range("A1").Value = "Olá"
  Range("A2").Value = "Mundo!"
End Sub
 
Sub FormatData()
  Range("A1").Font.Bold = True
  Range("A2").Interior.ColorIndex = 27
End Sub

Executar um Subprocedimento

VBE

Para executar um subprocedimento, posicione o cursor de inserção de texto entre o início e o fim do subprocedimento desejado e pressione a tecla F5 (ou clique no ícone verde Play, que pode ser visto na Barra de Ferramentas do VBE). Então, execute primeiramente o procedimento FillData e depois FormatData e veja o resultado numa planilha a seguir (saia do VBE):

Janela do Excel

Você pode executar macros fora do VBE. Para tal, vá à janela inicial do seu aplicativo e então pressione Alt+F8. Será mostrada uma janela de todos os subprocedimentos que você pode executar de todos os projetos abertos no seu aplicativo. Se na sessão do seu aplicativo tiver muitos documentos abertos e seus projetos apresentarem grande número de subprocedimentos de forma a encher a caixa de listagem, você pode filtrar quais subprocedimentos quer listar alterando a caixa de combinação Macros em.

Para executar um subprocedimento, clique sobre ele e, em seguida, Executar:

Volte ao VBE e, na janela de código, clique sobre uma linha que esteja fora de ambos os procedimentos e, então, pressione F5. Você verá novamente a janela mostrada acima. Isso aconteceu porque nesse caso o VBE não sabe qual subprocedimento você quer executar e então ele usa essa janela para você decidir qual ação tomar.

O botão Editar é bastante útil quando você tem muitos módulos e muitos subprocedimentos: basta clicar nele que o VBE abrirá a janela de código com o cursor de inserção de texto dentro do subprocedimento escolhido.

Se você tiver subprocedimentos com o mesmo nome, mas em módulos diferentes no mesmo projeto, essa mesma janela acrescenta o nome do módulo antes do nome de cada subprocedimento repetido, na sintaxe módulo.subprocedimento. No exemplo abaixo, temos dois subprocedimentos chamados GerarRelatório: um no módulo mdlDespesas e outro no módulo mdlProventos:

Vale lembrar que apenas procedimentos do tipo subprocedimento são mostrados nessa lista. Além disso, os subprocedimentos não podem possuir argumentos e devem ser públicos. Esses conceitos serão discutidos nas seções posteriores.

O termo técnico da representação de um item mostrando seus precursores é qualificação. No exemplo, podemos dizer que os procedimentos GerarRelatório estão qualificados pelos seus respectivos módulos.

Se você tiver vários projetos abertos e o nome de alguns módulos e/ou subprocedimentos repetir, essa qualificação poderá ser mais específica, mostrando também de qual documento um subprocedimento faz parte:

Observe que o nome do documento (Diretoria.xlsm ou Contabilidade.xlsm), sempre são o nível mais alto e se separam do nome de um subprocedimento ou módulo com um ponto de exclamação. O VBE qualifica os subprocedimentos na forma arquivo!subprocedimento se o módulo desses subprocedimentos possuírem nomes diferentes ou arquivo!modulo.subprocedimento, se o nome dos módulos for igual. A lista é classificada pelo nome dos subprocedimentos, não importando o nome dos módulos e nem dos documentos.

A forma da janela de macros qualificar os subprocedimentos depende de qual documento está ativo no aplicativo. Por exemplo, se você ativar a pasta de trabalho Contabilidade.xlsm e exibir a janela de macros, o VBE ocultará os qualificadores Contabilidade.xlsm! de seus subprocedimentos pois assume que você sabe que esses subprocedimentos são parte do documento ativo:

Voltando ao VBE, se nesse ambiente você exibir a janela de macros, perceberá que duas diferenças do comportamento da janela de macros do aplicativo:

  • Quando necessário, o qualificador de documento dos subprocedimentos são substituídos pelo nome do projeto do documento, assumindo a forma projeto.módulo.subprocedimento;
  • No filtro Macros em não é possível listar os subprocedimentos de todos os projetos de uma vez.

A figura abaixo mostra essas diferenças:

Depurar um Subprocedimento

Muitas vezes, enquanto estamos em modo de design, fazemos vários testes e estudos antes de termos segurança que a execução do programa seja satisfatória. A depuração é um tipo de execução parcial ou passo a passo de um programa com o objetivo de reduzir defeitos e/ou consertar resultados inesperados.

Para depurar um subprocedimento, pressione a tecla F8 dentro dele. Você também pode depurar usando o guia Depurar >> Depuração total ou clicar em Depurar na Janela de Macros do aplicativo.

Nesse modo, você visualizará passo a passo a execução de seu programa, já que o VBE indica a próxima linha que executará colorindo seu fundo de amarelo:

Para executar a próxima linha de sua rotina, basta pressionar F8 novamente. Faça isso até alcançar a última linha do procedimento, até não haver mais nenhuma linha amarela, caracterizando o término do programa e voltando o VBE ao modo de design.

Atribuir uma Tecla de Atalho a um Subprocedimento

Uma forma prática de executar um subprocedimento é atribuir uma tecla de atalho a ele. Para exemplificar essa funcionalidade, crie o subprocedimento a seguir para Excel:

Sub pFormataçãoLegal()
  Selection.Interior.ColorIndex = 24
  Selection.Font.Italic = True
  Selection.BorderAround LineStyle:=xlContinuous
End Sub

Na Janela de Macros clique no botão Opções:

Você verá a janela abaixo:

Nesse exemplo, atribuí Ctrl+q para um subprocedimento chamado Main. A caixa de texto Descrição é opcional, mas você pode preenchê-la se quiser criar um breve descritivo de suas macros. Isso pode ser útil se outras pessoas utilizam suas macros e seu projeto está protegido.

Barra de Ferramentas de Acesso Rápido

Você pode também criar um botão para executar uma macro pela Barra de Ferramentas de Acesso Rápido. Para tal, primeiro clique no ícone para personalizar a Barra de Ferramentas de Acesso Rápido >> Mais Comandos:

Em seguida, na caixa de combinação Escolher comandos em, selecione Macros:

A lista de subprocedimentos públicos será mostrada. Dê dois cliques no item que deseja acrescentar e verá que ele será acrescentado à lista da direita. Em seguida, clique em OK:

Veja como deverá ficar o layout do seu aplicativo. Com um clique, você poderá executar a macro:

Procedimento Chamando Outro Procedimento

Um procedimento pode chamar outro procedimento. Veja o código abaixo:

Sub Main()
  Introdução
  Formatar
  Despedir
End Sub
 
Sub Introdução()
  MsgBox "Programa de teste de chamada de subprocedimentos."
  MsgBox "Pressione OK para iniciar a formatação."
End Sub
 
Sub Formatar()
  PovoaDados
  FormataDados
End Sub
 
Sub Despedir()
  MsgBox "Tchau!"
End Sub
 
Sub PovoaDados()
  Range("A1").Value = "Olá"
  Range("A2").Value = "Mundo!"
End Sub
 
Sub FormataDados()
  Range("A1").Font.Bold = True
  Range("A2").Interior.ColorIndex = 27
End Sub

Veja que é fácil de deduzir que Main é um programa piloto que chama outros procedimentos. A sequência de chamadas dos subprocedimentos é Main >> Introdução >> Formatar >> PovoaDados >> FormataDados >> Despedir.

Para testar esse exemplo, execute Main. Sugiro que depure (F8) Main, dessa forma, você poderá ver os saltos de procedimentos na execução do código.

Note os saltos que o cursor de depuração sofre. A execução do programa só termina quando se alcança a última linha do procedimento chamado no primeiro nível. Perceba que quando as instruções de End Sub dos subprocedimentos filhos são alcançadas, a instrução seguinte a ser executada é a próxima linha do procedimento que o chamou.

Você pode usar também a palavra-chave opcional Call antes do nome de um procedimento para chamá-lo. O subprocedimento abaixo é equivalente ao exemplo anterior:

Sub Main()
  Call Introdução
  Call Formatar
  Call Despedir
End Sub

Call pode ser usado para lembrar o programador que o procedimento a ser chamado é de VBA, e não um comando interno do VBA. Não use Call. É uma palavra chave obsoleta que dificulta a leitura do código.

Um procedimento pode chamar a si mesmo numa técnica chamada Recursão. Se quiser saber mais sobre recursão, veja recursao (em breve).

Pilha de Chamadas

Uma forma interessante de visualizar a sequência de chamadas de procedimentos é através da Pilha de Chamadas. Clique aqui para saber mais sobre pilha de chamadas.

Por |2018-07-18T08:09:33+00:00julho 18th, 2018|VBA|0 Comentários

Sobre o Autor:

Felipe Costa Gualberto é Microsoft Most Valuable Professional (MVP) desde 2013 e é Diretor Técnico da MLF Soluções Tecnológicas e Educação Corporativa. Áreas de interesse: Power BI, Excel, VBA, Office Addins, Sql Server, .NET

Deixe um comentário