¿Cuál es la diferencia entre Sub y Private Sub en Excel VBA?


Mejor respuesta

Los subprogramas tienen un rango de visibilidad. En VBA, se puede acceder a un Sub público ( llamado ) desde cualquier módulo de código. Un Sub privado solo se puede llamar desde el módulo en el que reside.

Este concepto se denomina Alcance. Los objetos y las variables también tienen alcance .

Aquí hay una breve introducción: Comprender el alcance y la visibilidad

Hacemos un Sub Privado cuando sabemos que nada fuera del módulo actual debería nunca hacer para lo que está diseñado este código; estamos construyendo algo específico para la tarea y el contexto. Por otro lado, deberíamos pensar mucho cuando hacemos un Sub-Public.

Cuando está escribiendo VBA para otros usuarios además de usted, probablemente no quiera que llamen directamente a su código. Cualquier Sub público, siempre que no tenga parámetros, es visible en la lista «Macro» de los usuarios. (Alt-F8)

Ocultar Subs públicos del usuario (debería) normalmente hacerse cargo de sí mismo; cuando llama a un Sub en otro módulo, generalmente tiene que decirle lo que necesita saber pasándole los parámetros apropiados, y los Subs públicos con parámetros no aparecen en la lista del usuario.

Pero a veces es útil tener una utilidad Sub que se puede llamar desde cualquier lugar y no requiere parámetros; digamos desde un botón en una hoja de trabajo que llama al código de inicio en un módulo público. Usted NO quiere que su módulo de inicio sea visible para los usuarios.

Por lo tanto, dele a su sub un parámetro que nunca use. Mejor aún, dele un parámetro que no necesita mencionar. Consulte el parámetro opcional en el tercer Sub a continuación.

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

El usuario puede ver y llamar a sub Visible . Solo el código del mismo módulo puede llamar a sub Invisible . Tricksy se puede llamar desde cualquier lugar y no requiere un parámetro, pero el usuario no puede «verlo».

Llamar a Visible da como resultado:

Al depurar, puede llamar a Public Subs desde la Ventana Inmediata y puede hacerlo en cualquier momento cuando el código no se esté ejecutando.

Pero solo puede llamar a los Subs privados desde la Ventana Inmediata cuando haya alcanzado un punto de interrupción o haya hecho una pausa en algún lugar de su módulo de host .

Respuesta

Private y (Public) Sub se utilizan para declarar el alcance de una rutina .

Private Sub: hace que la rutina solo pueda ser llamada dentro del mismo módulo por otra rutina.

Digamos que tiene un módulo llamado Módulo A y dentro de este módulo tiene dos rutinas llamadas:

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

Public Sub Message()

Call Hello\_World()

End Sub

Private Sub Hello\_World()

MsgBox “Hello World”

End Sub

La rutina Mensaje llamada Hello\_World . Esto fue posible porque ambas rutinas estaban en el mismo módulo (Módulo A).

Digamos que tiene el Módulo B con la siguiente rutina :

Sub Message2()

Call Hello\_World()

End Sub

Esto devolverá un error de compilación: «Sub o función no definida».

¿Por qué?

Porque estaba llamando una rutina privada ( Hello\_World ) de un módulo diferente. No es posible.

Public Sub: su rutina también puede ser llamada por otras rutinas en diferentes módulos. Todas las rutinas son públicas por defecto, por lo que no es necesario declarar el mundo como “Público” antes. Solo el Sub es suficiente.

Sub ThisIsEnough()

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *