Este tutorial explicará a diferença entre as declarações públicas e privadas no VBA e como especificar os módulos como privados.
Subprocedimentos públicos vs. privados
Procedimentos (Sub e Funções) podem ser declarados Privados ou Públicos no VBA. Se eles forem públicos, significa que você poderá vê-los de dentro da janela macro do Excel e eles podem ser chamados de qualquer lugar dentro de seu projeto VBA. Se forem Privados, não podem ser vistos na janela Macro do Excel e só estão disponíveis para serem usados dentro do 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: Variáveis e 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) são visíveis para os usuários da pasta de trabalho na janela Macro:
Estes são considerados Público procedimentos. Você pode definir explicitamente os procedimentos como públicos, adicionando "Público" antes da instrução Sub:
123 | Public Sub HelloWorld ()MsgBox "Hello World"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 "Privado" antes da subinstrução do procedimento:
123 | Sub particular HelloEveryone ()MsgBox "Olá a todos"End Sub |
O segundo procedimento não seria visível na janela Macro para usuários do Excel, mas ainda pode ser usado em seu código VBA.
Procedimentos com Argumentos
Subprocedimentos podem ter argumentos. Os argumentos são entradas para o subprocedimento:
123 | Sub Hello (strName as string)MsgBox "Hello" & strNomeEnd Sub |
Se um subprocedimento tiver argumentos, ele nunca aparecerá na janela Macro, independentemente de ser declarado Público, porque não há como declarar os argumentos.
As funções também nunca aparecerão na janela 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). Esta é basicamente uma fórmula personalizada que pode ser chamada diretamente em uma planilha. Eles podem ser encontrados na categoria "Definido pelo usuário" na janela "Inserir função" ou podem ser digitados diretamente em uma célula.
Programação VBA | O Code Generator funciona para você!
Usando procedimentos entre módulos em seu projeto VBA
Os procedimentos públicos podem ser chamados de qualquer módulo ou formulário dentro do seu projeto VBA.
Tentar 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 variáveis públicos nos módulos de classe se comportam de maneira um pouco 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 ambíguo detectado’ 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ê coloca a seguinte palavra-chave na parte superior do módulo.
1 | Módulo Privado Opcional |
Se você declarar um módulo como privado, quaisquer procedimentos no módulo não ficarão visíveis para os usuários do Excel. Os procedimentos da função não aparecerão na janela Inserir Função, mas ainda podem 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.
Acessando 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, você pode acessar procedimentos privados usando o Application.Run comando disponível em VBA.
Considere os 3 módulos a seguir.
Módulo 2 é um Privado Módulo com um Público Subprocedimento, enquanto o Módulo 3 é Público módulo com um Privado Subprocedimento.
No Módulo 1, podemos chamar Hello World - o Módulo Privado Opcional na parte superior não nos impede de chamar o Sub Procedure - tudo o que ele serve para fazer é ocultar o Sub Procedure na janela Macro.
Também não precisamos da instrução Call - ela existe para tornar o código mais fácil de ler.
O código também pode ter a seguinte aparência:
1234 | Sub CallHelloFromPrivate ()'chamar um sub de um Módulo PrivadoOlá MundoEnd Sub |
Também podemos executar o Subprocedimento HelloWorld usando o VBA Application.Run comando.
No Módulo 3, entretanto, o procedimento GoodMorningWorld foi declarado privado. Você não pode chamá-lo de outro módulo usando meios 'normais', ou seja, a instrução Call.
Você tem que usar Application.RunCommand para executar um Sub privado de outro módulo.
1234 | Sub CallGoodMorning ()'executar um sub privado a partir de um módulo públicoApplication.Run ("GoodMorningWorld")End Sub |
Observe quando você usa o Application.RunCommand comando, você deve colocar o nome do Sub Procedure entre vírgulas invertidas.
Se tentarmos usar a instrução Call para executar o Subprocedimento GoodMorningWorld, ocorrerá um erro.