¡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.
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.
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.
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.
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").
ObtenerValorCelda
.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.
.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
.
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í.
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(...)
.
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
.
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)
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.
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:
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.