VBA – Procedimentos Private vs Public (Subs e Funções)
In this Article
Este tutorial explicará a diferença entre as declarações públicas e privadas no VBA e como especificar módulos como privados.
Subprocedimentos Públicos vs. Privados
Os procedimentos (Sub e Funções) podem ser declarados como privados ou públicos no VBA. Se forem públicos (Public), isso significa que você poderá vê-los na janela de macro do Excel e eles poderão ser chamados de qualquer lugar do projeto VBA. Se forem privados (Private), não poderão ser vistos na janela de macro do Excel e só estarão disponíveis para uso no módulo em que foram declarados (usando métodos normais; consulte o final deste artigo para saber como acessar procedimentos privados de outros módulos).
As funções públicas podem ser chamadas como funções internas do Excel na planilha do Excel.
Observação: As variáveis e as constantes também podem ser públicas ou privadas.
Janela de Macro do Excel
Por padrão, as macros do Excel (a maioria dos procedimentos VBA) ficam visíveis para os usuários da pasta de trabalho na janela Macro:
Esses são considerados procedimentos Públicos. Você pode definir explicitamente os procedimentos como públicos adicionando “Public” antes da instrução Sub:
Public Sub OlaMundo()
MsgBox "Olá Mundo"
End Sub
Se você não definir o procedimento como público, ele será considerado público.
Para declarar um procedimento como privado, basta adicionar “Private” antes da instrução Sub do procedimento:
Private Sub OlaPessoal()
MsgBox "Olá Pessoal"
End Sub
O segundo procedimento não seria visível na janela Macro para os usuários do Excel, mas ainda pode ser usado no seu código VBA.
Procedimentos com Argumentos
Os procedimentos secundários podem ter argumentos. Os argumentos são entradas para o subprocedimento:
Sub Ola(strNome as string)
MsgBox "Olá " & strName
End Sub
Se um subprocedimento tiver argumentos, ele nunca aparecerá na janela Macro, independentemente de ter sido declarado como Público, pois não há como declarar os argumentos.
As funções também nunca aparecerão na janela de macro, independentemente de serem declaradas públicas
As funções públicas no Excel podem ser usadas diretamente em uma planilha como uma “Função definida pelo usuário” (UDF). Trata-se basicamente de uma fórmula personalizada que pode ser chamada diretamente em uma planilha. Elas podem ser encontradas na categoria “Definido pelo Usuário” na janela “Inserir função” ou podem ser digitadas diretamente em uma célula.
Uso de Procedimentos entre Módulos em seu Projeto VBA
Os procedimentos públicos podem ser chamados de qualquer módulo ou formulário em seu projeto VBA.
A tentativa de chamar um procedimento privado de um módulo diferente resultará em um erro (Observação: consulte o final deste artigo para obter uma solução alternativa).
Observação: os procedimentos e as variáveis públicas nos módulos de classe têm um comportamento ligeiramente diferente e estão fora do escopo deste artigo.
Módulos diferentes podem armazenar procedimentos com o mesmo nome, desde que ambos sejam privados.
Se dois ou mais procedimentos tiverem o mesmo nome e forem declarados públicos, você receberá um erro de compilação “Nome repetido encontrado” ao executar o código.
Módulos Privados
Por padrão, os módulos são públicos.
Para tornar um módulo privado, você deve colocar a seguinte palavra-chave na parte superior do módulo:
Option Private Module
Se você declarar um módulo como privado, os procedimentos do módulo não serão visíveis para os usuários do Excel. Os procedimentos de função não aparecerão na janela Inserir função, mas ainda poderão ser usados na planilha do Excel, desde que o usuário saiba o nome da função!
Os subprocedimentos não aparecerão na janela Macro, mas ainda estarão disponíveis para serem usados no projeto VBA.
Acesso a um Procedimento Privado de um Módulo Diferente
Conforme mencionado acima, os procedimentos privados são inacessíveis em outros módulos de código por métodos “normais”. No entanto, é possível acessar procedimentos privados usando o comando Application.Run disponível no VBA.
Considere os três módulos a seguir:
O Módulo 2 é um módulo privado com um subprocedimento público, enquanto o Módulo 3 é um módulo público com um subprocedimento privado.
No Módulo1, podemos chamar OlaMundo – a opção Private Module na parte superior não nos impede de chamar o Subprocedimento – tudo o que ela faz é ocultar o Subprocedimento na janela de macro.
Também não precisamos da instrução Call – ela está lá para facilitar a leitura do código.
O código também poderia ter a aparência abaixo.
Sub ChamarOlaDoPrivado()
'Chama uma sub do Módulo Privado
OlaMundo
End Sub
Também podemos executar o subprocedimento OlaMundo usando o comando Application.Run do VBA.
No Módulo 3, entretanto, o procedimento BomDiaMundo foi declarado Private. Não é possível chamá-lo de outro módulo usando meios “normais”, ou seja, a instrução Call.
É necessário usar o comando Application.Run para executar uma Sub Privada de outro módulo.
Sub ChamarBomDia()
'executa uma Sub Privada do módulo público
Application.Run ("BomDiaMundo")
End Sub
Observe que, quando você usa o comando Application.Run, é necessário colocar o nome do subprocedimento entre aspas.
Se tentarmos usar a instrução Call para executar o subprocedimento BomDiaMundo, ocorrerá um erro.