VBA – Procedimientos Privados vs Públicos (Procedimientos y Funciones)
In this Article
Este tutorial explicará la diferencia entre declaraciones públicas y privadas en VBA y cómo especificar módulos como privados.
Sub Procedimientos Públicos vs. Privados
Los Procedimientos (Sub y Funciones) pueden ser declarados Privados o Públicos en VBA. Si son Públicos, significa que usted podrá verlos desde la Ventana de Macros de Excel y pueden ser llamados desde cualquier lugar dentro de su Proyecto VBA. Si son Privados, no pueden ser vistos en la Ventana de Macros de Excel y sólo están disponibles para ser usados dentro del Módulo en el cual fueron declarados (usando métodos normales, vea al final de este artículo para formas de acceder a procedimientos privados desde otros módulos).
Las funciones públicas pueden ser llamadas como funciones incorporadas de Excel en la hoja de cálculo de Excel.
Nota: Las Variables y Constantes también pueden ser Públicas o Privadas.
Ventana de Macros de Excel
Por defecto, las Macros de Excel (la mayoría de los Procedimientos VBA) son visibles para los usuarios del libro en la Ventana de Macros:
Estos se consideran procedimientos Públicos. Puede definir explícitamente los procedimientos como públicos añadiendo «Public» antes de la sentencia Sub:
Public Sub Hola_Mundo()
MsgBox "Hola Mundo"
End Sub
Si no defines el procedimiento como Público, se asumirá como Público.
Para declarar un procedimiento como Privado, simplemente añada «Private» antes de la sub-declaración del procedimiento:
Private Sub Hola_a_Todos()
MsgBox "Hola a Todos"
End Sub
El segundo procedimiento no será visible en la ventana de macros para los usuarios de Excel, pero podrá seguir utilizándose en su código VBA.
Procedimientos con Argumentos
Los subprocedimientos pueden tener argumentos. Los argumentos son entradas al subprocedimiento:
Sub Hola(cNombre As String)
MsgBox "Hola " & cNombre
End Sub
Si un subprocedimiento tiene argumentos, nunca aparecerá en la ventana de macros aunque esté declarado como público, porque no hay forma de declarar los argumentos.
Las funciones tampoco aparecerán nunca en la ventana de macros, aunque estén declaradas públicas.
Las funciones públicas en Excel se pueden utilizar directamente en una hoja de cálculo como una ‘Función Definida por el Usuario‘ (UDF). Se trata básicamente de una fórmula personalizada que se puede ejecutar directamente en una hoja de cálculo. Se pueden encontrar en la categoría «Definidas por el usuario» de la ventana «Insertar función» o se pueden escribir directamente en una celda.
Uso de Procedimientos entre Módulos en su Proyecto VBA
Los procedimientos públicos pueden ser llamados desde cualquier módulo o formulario dentro de su Proyecto VBA.
El intento de llamar a un procedimiento privado desde un módulo diferente dará lugar a un error (Nota: véase la parte inferior de este artículo para una solución).
Nota: Los procedimientos públicos y las variables de los módulos de clase se comportan de forma ligeramente diferente y quedan fuera del ámbito de este artículo.
Módulos diferentes, pueden almacenar procedimientos con el mismo nombre, siempre que ambos sean privados.
Si dos o más procedimientos tienen el mismo nombre y se declaran públicos obtendrá un error de compilación ‘Nombre ambiguo detectado’ al ejecutar el código.
Módulos Privados
Por defecto, los módulos son públicos.
Para hacer que un módulo sea privado, ponga la siguiente palabra clave en la parte superior del módulo.
Option Private Module
Si declara un módulo como privado, los procedimientos del módulo no serán visibles para los usuarios de Excel. Los procedimientos de función no aparecerán en la ventana Insertar función, pero podrán utilizarse en la hoja de Excel siempre que el usuario conozca el nombre de la función
Los subprocedimientos no aparecerán en la ventana de macros, pero podrán utilizarse en el proyecto VBA.
Acceso a un Procedimiento Privado desde un Módulo Diferente
Como se mencionó anteriormente, los Procedimientos Privados son inaccesibles en otros módulos de código por métodos «normales». Sin embargo, puede acceder a los procedimientos privados utilizando el comando Application.Run disponible en VBA.
Considere los siguientes 3 módulos.
El módulo 2 es un módulo privado con un subprocedimiento público, mientras que el módulo 3 es un módulo público con un subprocedimiento privado.
En el Módulo1, podemos llamar a HolaMundo – la Opción Módulo Privado en la parte superior no nos impide llamar al Sub Procedimiento – todo lo que hace es ocultar el Sub Procedimiento en la Ventana de Macros.
Tampoco necesitamos la sentencia Call – está ahí para hacer el código más fácil de leer.
El código también podría verse así
Sub LlamarHolaDePrivado()
'Llama un sub desde un módulo privado
HolaMundo
End Sub
También podemos ejecutar el subprocedimiento HolaMundo utilizando el comando Application.Run de VBA.
Sin embargo, en el Módulo 3, el procedimiento HolaMundo ha sido declarado Privado. No puede llamarlo desde otro módulo utilizando medios ‘normales’, es decir, la sentencia Call.
Debe utilizar el comando Application.RunCommand para ejecutar un subprocedimiento privado desde otro módulo.
Sub LlamarBuenosDías()
'Ejecutar un sub Privado desde un módulo Público
Application.Run ("BuenosDiasMundo")
End Sub
Note que cuando usa el comando Application.RunCommand, tiene que poner el nombre del SubProcedimiento entre comillas.
Si intentamos usar la sentencia Call para ejecutar el subprocedimiento BuenosDiasMundo, se producirá un error.