Obtener el valor de una celda con VBA

La gran mayoría de los usuarios de Excel que inician en la creación de macros y programación en VBA tienen una pregunta en común: ¿Cómo obtener el valor de una celda desde VBA?

Hoy aprenderás que existen dos métodos que nos permiten acceder al contenido de una celda para obtener su valor y trabajar con esos datos desde nuestro código VBA. Me refiero al objeto Range y a la propiedad Cells y a continuación revisaremos aquellos métodos que nos permitirán acceder a los datos de cualquier celda.

Valor de una celda con el objeto Range

El objeto Range nos pide un solo argumento y es la referencia a la celda de la cual queremos obtener el valor. Una vez que hemos indicado la referencia, debemos acceder a la propiedad Value como se muestra a continuación:

Range("B2").Value

Esta instrucción obtendrá el valor de la celda B2 ubicada en la hoja activa. Es muy importante recordar que al utilizar el objeto Range tal como lo hicimos en la línea de código anterior, Excel supondrá que nos referimos a la celda de la hoja activa.

Por el contrario, si queremos acceder el valor de la celda B2 que se encuentra en la Hoja2, entonces debemos anteponer el objeto Worksheets de la siguiente manera:

Worksheets("Hoja2").Range("B2").Value

También es buena idea almacenar el valor de la celda en una variable de manera que puedas utilizarlo varias veces en el código sin necesidad de utilizar de nuevo el objeto Range. Por ejemplo, la siguiente línea de código almacena el valor de la celda B2 de la Hoja2 en la variable llamada valorCelda:

valorCelda = Worksheets("Hoja2").Range("B2").Value

En el archivo Excel que contiene los ejemplos de este artículo, y que podrás descargar al final, encontrarás una hoja como la siguiente:

Cómo obtener el valor de una celda con VBA

En la Hoja1 hay dos botones, el primero de ellos muestra el valor de la celda B2 de la hoja activa y el segundo obtiene el valor de la celda B2 de la Hoja2. Al pulsar el botón observarás el valor de la celda correspondiente en pantalla:

Obtener valor de celda desde otra hoja con macros

Valor de una celda con la propiedad Cells

La propiedad Cells del objeto Worksheet también nos ayudará a obtener el valor de una celda desde nuestro código VBA y la única diferencia que existe con el objeto Range es la manera en que se hace referencia a la celda.

La propiedad Cells nos pide indicar el número de fila y el número de columna. Por ejemplo, la siguiente línea accede al valor de la celda B2 de la hoja activa:

Cells(2, 2).Value

Lo que debes recordar de la propiedad Cells es que siempre espera primero el número de fila y en segundo lugar el número de columna. Los usuarios de Excel estamos muy acostumbrados a referirnos a una celda por su columna y luego por su fila, pero la propiedad Cells espera dicha información de manera inversa.

Si queremos referirnos a una celda que pertenece a una hoja diferente, tenemos que utilizar el objeto Worksheets de la siguiente manera:

Worksheets("Hoja2").Cells(2, 2).Value

Lo único que he agregado es el llamado al objeto Worksheets haciendo referencia a la Hoja2. Como puedes darte cuenta, el uso de la propiedad Cells es muy parecido al del objeto Range porque en realidad la propiedad Cells nos devuelve la propiedad Item del objeto Range pero esa explicación la dejaremos para otra ocasión.

En la Hoja3 del archivo descargable encontrarás dos botones que hacen lo mismo que en el ejemplo anterior pero utilizando la propiedad Cells.

Diferencia entre el objeto Range y la propiedad Cells

Si tanto Range como Cells nos permiten acceder el contenido de una celda, seguramente te estarás preguntando: ¿Alguno de ellos ofrece una ventaja sobre el otro?

Antes de explicar las posibles ventajas, debo decir que generalmente los usuarios de Excel utilizamos el estilo de referencia A1 y por esa razón el uso del objeto Range es mucho más común que el uso de la propiedad Cells. Es más natural para nosotros referirnos a la celda F5 como Range(“F5”) que como Cells(5, 6).

Sin embargo, el hecho de que la propiedad Cells nos permita utilizar el estilo de referencia F1C1 facilita el acceso al valor de una celda cuando tenemos el número de columna en lugar de la letra. Si eres un programador con experiencia en desarrollo de soluciones en Excel, sabrás que es muy frecuente encontrarnos en esa situación.

Así que, si solo está disponible el número de columna de la celda, puedes utilizar la propiedad Cells y evitarte el trabajo de encontrar la letra de la columna que le corresponde. En la Hoja4 del archivo descargable encontrarás el siguiente ejemplo:

Macro para mostrar el valor de una celda en Excel

El botón “Valor aleatorio” obtendrá el valor de alguna de las celdas del rango A1:O20. La fila y la columna estarán determinadas por un valor aleatorio devuelto por la función RANDBETWEEN que es el nombre en inglés para la función ALEATORIO.ENTRE. La macro que se ejecuta al pulsar el botón es la siguiente:

Private Sub CommandButton1_Click()

columna = WorksheetFunction.RandBetween(1, 15)
fila = WorksheetFunction.RandBetween(1, 20)

Cells(fila, columna).Select

MsgBox "Columna: " & columna & vbCrLf & "Fila: " & fila & _
vbCrLf & vbCrLf & "Valor: " & Cells(fila, columna).Value

End Sub

Ya que la fila y la columna son números aleatorios, utilizo la propiedad Cells para obtener fácilmente el valor de la celda. También utilizo el método Select para seleccionar la celda de manera que se facilite su identificación en pantalla.

Descarga el archivo de trabajo y comienza a realizar tus propias pruebas para obtener el valor de cualquier celda en Excel utilizando el objeto Range o la propiedad Cells.