Curso de Programación en Excel (VBA)

Clase 3: Llenar Variables y Referenciar Celdas

⏱️ Duración Video: [Indicar duración]
📚 Nivel: Básico

¡Hola a todos! En esta tercera clase de nuestro curso de programación en Excel con VBA (Macros), exploraremos diferentes formas de llenar una variable y mostrar su contenido en pantalla. Para lograr esto, utilizaremos la pantalla de nuestro IDE (Entorno de Desarrollo Integrado) para crear una Macro. Crearemos una variable que usaremos para llenarla desde alguna celda específica en Excel. Además de llenar variables, esta clase nos ayudará a comprender cómo referenciar y obtener datos de celdas y rangos, entendiendo la estructura de un libro de Excel.

Video explicativo de la Clase 1.

1. Llenando una Variable desde una Celda Básica

Para empezar, crearemos una variable llamada ejemplo. Luego, le indicaremos a nuestra variable que su contenido será el contenido de una celda específica, por ejemplo, la celda C3. En nuestro código VBA, esto se logra utilizando Range. Colocaremos Range y, para indicar el rango, abrimos paréntesis y entre comillas colocamos el nombre de la celda, que en este caso sería "C3". Cerramos el paréntesis, y listo, tenemos nuestro dato asociado a la variable.

Para verificar si esto funciona, podemos crear un MsgBox e imprimir la variable en pantalla.

VBA
Sub ObtenerValorCelda()
    Dim ejemplo As String ' Declaramos la variable
    
    ejemplo = Range("C3").Value ' Asignamos el valor de la celda C3 a la variable
    
    MsgBox ejemplo ' Mostramos el valor de la variable
End Sub

Al ejecutar la Macro (por ejemplo, poniendo un valor en la celda C3 de tu hoja activa y luego corriendo la macro desde el editor VBA con F5), podemos confirmar que obtuvimos el dato de la celda C3.

2. Entendiendo la Estructura de Excel y las Referencias por Defecto

Algo importante a aclarar es que Excel es un libro (Workbook) que está compuesto de hojas (Sheets), y estas hojas contienen celdas (Cells o Range).

Si queremos hacer uso de algún objeto en Excel, idealmente deberíamos indicar la ruta completa del ítem. Es decir, si queríamos usar la celda C3, deberíamos haber indicado primero el libro en el cual estamos trabajando, luego la hoja que contiene la celda, y por último la celda.

Sin embargo, en el ejemplo anterior funcionó sin indicar la ruta completa. Esto se debe a que, por defecto, VBA entiende que estamos trabajando en el libro activo (ActiveWorkbook) y en la hoja activa (ActiveSheet) en ese momento.

Referencia por defecto: Si no especificas la hoja, VBA asume que te refieres a la hoja activa. Si no especificas el libro (y tienes varios abiertos), puede ser ambiguo, aunque usualmente se refiere al libro activo.

3. Demostración del Comportamiento por Defecto con Múltiples Hojas

Para dar un ejemplo más claro, podemos utilizar la misma Macro de la Sección 1. Crearemos dos hojas en nuestro libro de Excel (por ejemplo, "Hoja1" y "Hoja2").

  1. En la celda C3 de "Hoja1", escribe "Dato de Hoja1".
  2. En la celda C3 de "Hoja2", escribe "Dato de Hoja2".
  3. Crea un botón en "Hoja1" y asígnale la macro ObtenerValorCelda.
  4. Copia ese botón y pégalo en "Hoja2" (la macro asignada se mantendrá).

Al ejecutar la Macro desde el botón en la "Hoja1", el MsgBox mostrará "Dato de Hoja1". Si vas a "Hoja2" y ejecutas la Macro desde el botón allí, el MsgBox mostrará "Dato de Hoja2".

Esto confirma que, si no indicamos una hoja específica, VBA entiende que estamos trabajando en la hoja que tenemos activa en ese momento.

4. Obteniendo el Valor Específico con .Value

Cuando nos referimos a un rango como Range("C3"), estamos obteniendo un objeto Range. Si deseamos hacer uso únicamente del valor que tiene esa celda, al final de la sentencia de referencia de la celda, debemos colocar .Value.

VBA
Sub ObtenerValorEspecifico()
    Dim miValor As String
    
    ' Accedemos explícitamente al valor de la celda
    miValor = Range("C3").Value 
    
    MsgBox "El valor es: " & miValor
End Sub

Aunque en muchos casos VBA es lo suficientemente inteligente para inferir que quieres el valor (como en el primer ejemplo con MsgBox ejemplo), es una buena práctica ser explícito usando .Value cuando sabes que necesitas el contenido y no el objeto celda en sí.

5. Especificando la Hoja y el Libro

Para evitar depender de la hoja activa y asegurarnos de obtener el dato de una hoja específica, podemos indicarle el nombre de la hoja en la cual queremos obtener el dato. Por ejemplo, si queremos el dato de la "Hoja1", iremos a nuestro código y, antes del Range, colocaremos la palabra Sheets. Abrimos paréntesis y entre comillas le colocamos el nombre de la hoja (por ejemplo, "Hoja1"). Al finalizar Sheets(...), le ponemos un punto antes de Range(...).

VBA
Sub ValorDeHojaEspecifica()
    Dim datoHoja1 As String
    
    ' Importante: El nombre de la hoja debe ser exacto, incluyendo espacios si los tiene.
    datoHoja1 = Sheets("Hoja1").Range("C3").Value
    
    MsgBox "El valor de C3 en Hoja1 es: " & datoHoja1
End Sub

Es importante no dejar espacios donde no deben ir. Ahora, si ejecutas la Macro ValorDeHojaEspecifica desde cualquier hoja (Hoja1 o Hoja2), verás que siempre trae el dato correctamente de la celda C3 ubicada en la "Hoja1". Esto se debe a que indicamos explícitamente la hoja.

Además de especificar la hoja, también podemos especificar el libro, aunque en muchos casos no es estrictamente necesario si solo tenemos un libro abierto. Para referenciar el libro donde se está ejecutando la Macro, usamos ThisWorkbook.

VBA
Sub ValorDeLibroHojaEspecifica()
    Dim datoCompleto As String
    
    datoCompleto = ThisWorkbook.Sheets("Hoja1").Range("C3").Value
    
    MsgBox "Ruta completa: " & datoCompleto
End Sub

Ahora sabemos cómo ubicar una celda de manera específica y completa. No siempre es necesario colocar toda la ruta completa. Si estamos seguros de que la Macro se ejecutará en una hoja específica o si queremos que opere sobre la hoja activa, podemos omitir la especificación del libro o la hoja respectivamente. Indicar la ruta completa nos permite escribir la Macro una sola vez y poder ejecutarla desde diferentes hojas, sabiendo que tomará los valores de la ubicación exacta que especificamos.

Jerarquía de Objetos en Excel VBA:
Application (Excel mismo)
└── Workbooks (Colección de libros abiertos)
    └── Workbook (Un libro específico, ej: ThisWorkbook)
        └── Worksheets o Sheets (Colección de hojas en ese libro)
            └── Worksheet o Sheet (Una hoja específica, ej: Sheets("Hoja1"))
                └── Range o Cells (Una celda o rango de celdas)

6. Ejemplo Práctico - Suma de Valores y Mensaje Personalizado

Para consolidar lo aprendido, hagamos una Macro que obtenga datos de celdas específicas en una hoja y realice una suma. El resultado lo mostraremos en pantalla.

Supongamos que en "HojaDatos", celda A1 tenemos un número y en B1 tenemos otro.

VBA
Sub SumarValoresDeCeldas()
    Dim num1 As Integer
    Dim num2 As Integer
    Dim resultadoSuma As Integer
    Dim nombreHoja As String
    
    ' Es buena práctica asignar el nombre de la hoja a una variable si se usa mucho
    nombreHoja = "HojaDatos" ' Asegúrate que esta hoja exista en tu libro
    
    ' Obtener los valores de las celdas
    ' Usamos Val() para asegurarnos que VBA trate el contenido de la celda como número
    num1 = Val(ThisWorkbook.Sheets(nombreHoja).Range("A1").Value)
    num2 = Val(ThisWorkbook.Sheets(nombreHoja).Range("B1").Value)
    
    ' Realizar la suma
    resultadoSuma = num1 + num2
    
    ' Mostrar el resultado con un mensaje personalizado
    MsgBox "El resultado de sumar " & num1 & " y " & num2 & " es: " & resultadoSuma
End Sub

Para probar esto:

  1. Crea una hoja llamada "HojaDatos".
  2. En la celda A1 de "HojaDatos", escribe un número (ej: 10).
  3. En la celda B1 de "HojaDatos", escribe otro número (ej: 25).
  4. Ejecuta la macro SumarValoresDeCeldas. Deberías ver un mensaje como: "El resultado de sumar 10 y 25 es: 35".

Función Val(): En el ejemplo anterior, usamos Val(Range("A1").Value). La función Val() intenta convertir el contenido de la celda a un número. Es útil porque a veces Excel puede interpretar un número en una celda como texto, y Val() ayuda a asegurar que VBA lo trate como un valor numérico para las operaciones matemáticas.

¡Has aprendido a darle vida a tus variables con datos de Excel! Ahora puedes leer información directamente de tus hojas de cálculo y usarla en tus macros. Esto abre un mundo de posibilidades para la automatización.