Qual é a diferença entre Sub e Private Sub no Excel VBA?


Melhor resposta

Os subprogramas têm uma gama de visibilidade. No VBA, um Sub público pode ser acessado ( chamado ) de qualquer módulo de código. Um Sub privado só pode ser chamado a partir do módulo em que reside.

Este conceito é denominado Escopo. Objetos e variáveis ​​também têm escopo .

Há uma breve introdução aqui: Compreendendo o escopo e a visibilidade

Tornamos um subprivado quando sabemos que nada fora do módulo atual deve alguma vez fazer o que este código foi projetado; estamos construindo algo específico para a tarefa e o contexto. Por outro lado, devemos pensar muito quando tornamos um Sub Público.

Quando você está escrevendo VBA para outros usuários além de você, provavelmente não quer que eles chamem seu código diretamente. Qualquer Sub Pública, desde que não tenha parâmetros, é visível na lista “Macro” do usuário. (Alt-F8)

Ocultar Subs públicos do usuário (deveria) normalmente cuidar de si mesmo; quando você chama um Sub em outro módulo, geralmente tem que dizer o que ele precisa saber, passando os parâmetros apropriados, e Subs públicos com parâmetros não aparecem na lista do usuário.

Mas às vezes é útil ter um utilitário Sub que pode ser chamado de qualquer lugar e não requer parâmetros; digamos, de um botão em uma planilha que chama o código de inicialização em um módulo Público. Você NÃO quer que seu módulo de inicialização fique visível para os usuários.

Portanto, dê ao seu sub um parâmetro que você nunca usa. Melhor ainda, atribua a ele um parâmetro que você não precise de mencionar. Veja o parâmetro opcional no terceiro Sub abaixo.

Option Explicit

Sub Visible()

" Can call this guy from anywhere;

" from any module or directly by the user.

" Sub (on it"s own) is lazy shorthand for "Public Sub"

Invisible

End Sub

Private Sub Invisible()

" This Sub can ONLY be called from inside its module.

" It is not shown in the Macro list available to the user.

Tricksy

End Sub

Public Sub Tricksy(Optional pIgnore As Boolean = True)

" This sub can be called from anywhere.

" It does not require a parameter (pIgnore).

" BUT, because it has a parameter, it does not appear

" in the user"s list of available "macros".

MsgBox "Hi there", vbExclamation, "Greetings from Tricksy"

End Sub

O usuário pode ver e chamar sub Visível . Apenas o código no mesmo módulo pode chamar sub Invisível . Tricksy pode ser chamado de qualquer lugar e não requer um parâmetro, mas o usuário não pode “vê-lo”.

Chamando Visível resulta em:

Ao depurar, você pode chamar Public Subs na janela imediata e você pode fazer isso a qualquer momento quando o código ainda não estiver em execução.

Mas você só pode chamar Subs privados a partir da janela imediata quando tiver alcançado um ponto de interrupção ou pausado em algum lugar em seu módulo de host .

Resposta

Privado e Sub (público) são usados ​​para declarar o escopo de uma rotina .

Sub privado: faz com que a rotina só possa ser chamada dentro do mesmo módulo por outra rotina.

Digamos que você tenha um módulo chamado Módulo A e dentro desse módulo você tenha duas rotinas chamadas:

  • Private Sub Hello\_World ()
  • Sub mensagem ()

Public Sub Message()

Call Hello\_World()

End Sub

Private Sub Hello\_World()

MsgBox “Hello World”

End Sub

A rotina de Mensagem chamada Hello\_World . Isso foi possível porque ambas as rotinas estavam no mesmo módulo (Módulo A).

Digamos que você tenha o Módulo B com a seguinte rotina :

Sub Message2()

Call Hello\_World()

End Sub

Isso retornará um erro de compilação: “Sub ou Função não definida”.

Por quê?

Porque estava chamando uma rotina privada ( Hello\_World ) de um módulo diferente. Não é possível.

Sub público: sua rotina também pode ser chamada por outras rotinas em módulos diferentes. Todas as rotinas são públicas por padrão, então não é necessário declarar o mundo “Público” antes. Apenas o Sub é suficiente.

Sub ThisIsEnough()

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *