Subs, variables y funciones privadas y públicas en VBA
Al escribir macros VBA, el concepto de Privado o Público es importante. Define cómo el código VBA dentro de un módulo puede interactuar con el código VBA en otro módulo. Este concepto se aplica tanto a los submarinos privados como a las funciones privadas.
Como una simple analogía: en las redes sociales, puedes configurar partes de tu perfil para que todos puedan verlo (Público), o solo aquellos a quienes permites, como amigos o seguidores, verlo (Privado). Lo privado versus lo público. El concepto en VBA es similar, pero como aquí estamos hablando de VBA, no es tan sencillo.
Antes de abordar la diferencia entre Público y Privado, primero debemos comprender qué son los Módulos y cómo funcionan.
Tabla de contenido
- Módulos
- Módulos de hoja de trabajo
- Módulo de libro de trabajo
- Módulo de formulario de usuario
- Módulos estándar
- Otros tipos de módulos
- Público versus privado
- Subprocedimientos (Subs)
- Funciones
- variables
- Variables públicas
- Variables privadas
- Variables tenues
- ¿Esto realmente importa?
Módulos
Los módulos son el lugar donde se escribe y almacena el código VBA. Hay muchos tipos de módulos diferentes en Excel y utilizamos cada módulo para un propósito diferente.
Módulos de hoja de trabajo
Los módulos de hoja de trabajo generalmente se usan para activar código relacionado con esa hoja de trabajo específica. Cada hoja de trabajo contiene su propio módulo, por lo que si hay 6 hojas de trabajo, entonces tenemos 6 módulos de hoja de trabajo.
En la captura de pantalla anterior, el código VBA está contenido en el módulo de hoja de trabajo de la Hoja1. Como hemos utilizado el evento Worksheet_Activate, el código se activa solo cuando se activa la Hoja1. Cualquier código basado en eventos (como la activación de una hoja de trabajo) en un Módulo de hoja de trabajo solo se aplica a la hoja de trabajo en la que está almacenado el código.
Módulo de libro de trabajo
El módulo de libro de trabajo generalmente se usa para activar código relacionado con eventos a nivel de libro de trabajo.
En la captura de pantalla anterior, utilizamos el evento Workbook_Open. Por lo tanto, el código VBA se ejecutará cuando se abra un libro. Cada libro tiene su propio módulo.
Módulo de formulario de usuario
Los módulos UserForm generalmente contienen código relacionado con eventos UserForm. Cada UserForm tiene su propio módulo.
En la captura de pantalla anterior, el código VBA se ejecutará cuando el usuario haga clic en CommandButton1 en el formulario de usuario.
Módulos estándar
Los módulos estándar no están relacionados con ningún objeto específico y no tienen ningún evento relacionado con ellos. Por lo tanto, los módulos estándar no se activan mediante la interacción del usuario. Si confiamos en eventos activados, necesitamos los módulos Libro de trabajo, Hoja de trabajo o Formulario de usuario para realizar un seguimiento del evento. Sin embargo, ese evento puede llamar a una macro dentro de un módulo estándar.
SUGERENCIA: Descubra cómo ejecutar una macro desde otra macro aquí: Ejecute una macro desde una macro (desde otro libro de trabajo)
La captura de pantalla anterior muestra un código que protege con contraseña ActiveSheet, sin importar qué libro u hoja de trabajo.
Otros tipos de módulos
El último tipo de módulo VBA disponible es un módulo de clase. Estos sirven para crear objetos personalizados y funcionan de manera muy diferente a los otros tipos de módulos. Los módulos de clase están fuera del alcance de esta publicación.
Público versus privado
Los términos Público y Privado se utilizan en relación con los Módulos. El concepto básico es que las variables, Subs o Funciones Públicas pueden ser vistas y utilizadas por todos los módulos del libro de trabajo, mientras que las variables, Subs y Funciones Privadas solo pueden ser utilizadas por código. dentro del mismo módulo.
Declarar una función o subprivado
Para tratar una Sub o Función como Privada, usamos la palabra clave Privada al comienzo del nombre.
Private Sub nameOfSub()
Private Function nameOfFunction()
Declarar una subfunción o función pública
Para tratar una Sub o Función como Pública, podemos usar la palabra clave Pública. Sin embargo, si se excluye la palabra Público o Privado, VBA trata la subfunción como si fuera pública. Como resultado, los siguientes son todos públicos, aunque no todos incluyen la palabra clave.
Public Sub nameOfSub()Sub nameOfSub()
Public Function nameOfFunction()Function nameOfFunction()
Veamos los subs y funciones con un poco más de detalle.
Subprocedimientos (Subs)
Al pensar en la diferencia entre un Sub público y un Sub privado, las dos consideraciones principales son:
- ¿Queremos que la macro aparezca en la lista de macros disponibles dentro de la ventana Macro de Excel?
- ¿Queremos que la macro se ejecute desde otra Macro?
¿Aparece en la ventana Macro?
Una de las características más importantes de los subs privados es que no aparecen en la ventana Macro de Excel.
Supongamos que el Módulo1 contiene las dos macros siguientes:
Private Sub NotVisible()MsgBox "This is a Private Sub"End Sub
Public Sub IAmVisible()MsgBox "This is a Public Sub"End Sub
El cuadro de diálogo Macro solo muestra la subpública.
No quiero que llegues a la conclusión de que todos los Subs públicos aparecerán en la ventana Macro, ya que eso no es cierto. Cualquier sub público que requiera argumentos tampoco aparece en esta ventana, pero aún se puede ejecutar si sabemos cómo hacer referencia a él.
¿Se puede ejecutar el código desde otra macro?
Cuando pensamos en Private Subs, es mejor verlos como código VBA que solo puede ser llamado por otro código dentro del mismo módulo. Entonces, por ejemplo, si el Módulo 1 contiene un Private Sub, no puede ser llamado por ningún código en otro. módulo.
Usando un ejemplo simple, aquí hay un Sub privado en el Módulo 1:
Private Sub ShowMessage()MsgBox "This is a Private Sub"End Sub
Ahora intentemos llamar a la macro ShowMessage desde el Módulo2.
Sub CallAPrivateMacro()Call ShowMessageEnd Sub
La ejecución de CallAPrivateMacro genera un error, ya que las dos macros están en módulos diferentes.
Si la macro ShowMessage en el Módulo1 fuera un Sub público, se ejecutaría correctamente.
Hay muchas formas de ejecutar una macro desde otra macro . Uno de esos métodos nos permite ejecutar un Sub privado desde otro módulo. Si usamos el comando Application.Run , felizmente ejecutará un sub privado. Cambiemos el código en el Módulo2 para incluir el comando Application.Run :
Sub CallAPrivateMacro()Application.Run "ShowMessage"End Sub
En lugar de un error, el código anterior ejecutará la macro ShowMessage.
Trabajar con eventos de módulo basados en objetos
Excel crea los eventos Hoja de trabajo, Libro de trabajo y Módulo UserForm como Privados de forma predeterminada, pero no es necesario que lo sean. Si se cambian a Públicos, se pueden llamar desde otros módulos. Veamos un ejemplo.
Ingrese el siguiente código en el módulo del libro de trabajo (observe que lo he cambiado a un subpúblico).
Public Sub Workbook_Open()MsgBox "Workbook Opened"End Sub
Podemos llamar a esto desde otra macro usando el nombre del objeto seguido del nombre del sub público.
Sub RunWorkbook_Open()Call ThisWorkbook.Workbook_OpenEnd Sub
Esto significa que podemos ejecutar el evento Workbook_Open cuando lo necesitemos. Si el sub del módulo Workbook es privado, aún podemos usar el método Application.Run mencionado anteriormente.
Funciones
Las funciones de VBA se utilizan para devolver valores calculados. Tienen dos usos principales:
- Para calcular un valor dentro de una celda en una hoja de trabajo (conocida como funciones definidas por el usuario)
- Para calcular un valor dentro del código VBA
Al igual que los Subs, las funciones creadas sin la declaración Privada o Pública se tratan como Públicas.
Calcular valores dentro de la hoja de trabajo (Funciones definidas por el usuario)
Las funciones definidas por el usuario son fórmulas de hoja de cálculo que funcionan de manera similar a otras funciones de Excel, como SUMIFS o BUSCAR XL.
Los siguientes fragmentos de código se incluyen en el Módulo 1:
Public Function IAmVisible(myText As String)IAmVisible = myTextEnd Function
Private Function NotVisible(myText As String)NotVisible = myTextEnd Function
Si miramos el cuadro de diálogo Insertar función, la función IAmVisible está disponible como función de hoja de trabajo.
Las funciones deben declararse en un módulo estándar para usarse como funciones definidas por el usuario en una hoja de cálculo de Excel.
Función dentro del código VBA
Las funciones utilizadas dentro del código VBA funcionan de la misma manera que las subs; Las funciones privadas solo deben ser visibles desde el mismo módulo. Una vez más, podemos volver al comando Application.Run para usar una función privada de otro módulo.
Supongamos que se ingresó el siguiente código en el Módulo2:
Sub CallAPrivateFunction()MsgBox Application.Run("NotVisible", "This is a Private Function")End Sub
El código anterior felizmente llamará a la función privada NotVisible desde el Módulo1.
variables
Las variables contienen valores o referencias a objetos que cambian mientras se ejecuta la macro. Las variables vienen en 3 variedades: Pública, Privada y Dim.
Variables públicas
Las variables públicas deben declararse en la parte superior del módulo de código, directamente después de la declaración Option Explicit (si tiene una) y antes de cualquier Subs o Functions.
Lo siguiente es incorrecto y creará un error si intentamos utilizar la variable pública.
Option ExplicitSub SomethingElseAtTheTop()MsgBox "Public Variable is not first"End SubPublic myPublicMessage As String
El enfoque correcto sería: (La variable pública se declara antes de cualquier subs o función):
Option ExplicitPublic myPublicMessage As StringSub SomethingAfterPrivateVariables()MsgBox "Public Variable is first"End Sub
Como es una variable pública, podemos usar y cambiar la variable desde cualquier módulo (de cualquier tipo) en el libro de trabajo. Mire este código de ejemplo a continuación, que podría ejecutarse desde el Módulo2:
Sub UsePublicVariable()myPublicMessage = "This is Public"MsgBox myPublicMessageEnd Sub
Variables privadas
Solo se puede acceder a las variables privadas y modificarlas mediante subs y funciones dentro del mismo módulo. También deben declararse en la parte superior del código VBA.
A continuación se demuestra un uso aceptable de una variable privada.
Módulo 1:
Option ExplicitPrivate myPrivateMessage As StringSub UsePrivateVariable()myPrivateMessage = "This is Private"MsgBox myPrivateMessageEnd Sub
Variables tenues
La mayoría de nosotros aprendemos a crear variables usando la palabra Dim . Sin embargo, las variables Dim se comportan de manera diferente dependiendo de cómo se declaran.
Las variables Dim declaradas dentro de un Sub o Función solo se pueden usar dentro de ese Sub o Función. En el siguiente ejemplo, el Dim se declaró dentro de un Sub llamado CreateDim , pero se usó dentro de un sub llamado UseDim . Si ejecutamos el código UseDim , No se puede encontrar la variable Dim y se producirá un error.
Sub CreateDim()Dim myDimMessageEnd Sub
Sub UseDim()myDimMessage = "Dim inside Sub"MsgBox myDimMessageEnd Sub
Si se crea una variable Dim en la parte superior del módulo, antes de todos los Subs o Funciones, funciona como una variable privada. El siguiente código se ejecutará correctamente.
Option ExplicitDim myDimMessageSub UseDim()myDimMessage = "Dim inside Sub"MsgBox myDimMessageEnd Sub
¿Esto realmente importa?
Podrías pensar que suena más fácil crear todo como Público; entonces se puede usar en cualquier lugar. Una conclusión lógica, pero peligrosa. Es mucho mejor controlar todas las secciones del código. Pregúntese, si alguien usara su macro desde la ventana Macro de Excel, ¿debería funcionar? O si alguien ejecutara su funcionar como una función definida por el usuario, ¿debería funcionar? Las respuestas a estas preguntas son un buen principio rector para ayudar a decidir entre público y privado.
Siempre es mucho mejor limitar el alcance de sus Subs, Funciones y variables inicialmente y luego expandirlos cuando sea necesario en circunstancias específicas.
Deja una respuesta