Microsoft Excel proporciona un modelo de objetos que es útil para obtener acceso a hojas de cálculo, rangos, tablas, gráficos, etc., esto es de relevancia porque podemos manipular tales objetos por medio de código de programación, en específico por medio del lenguaje VBA (Visual Basic for Applications), esto tiene el beneficio de poder personalizar la funcionalidad de las aplicaciones y proyectos creados con esta hoja de cálculo. Este modelo de objetos se describe a continuación.
- Un Libro contiene una o varias Hojas de cálculo.
- Una Hoja de cálculo contiene colecciones de aquellos objetos de datos presentes en la hoja individual y da acceso a las celdas en los objetos de Rango.
- Un Rango representa un grupo de celdas adyacentes.
- Los Rangos se usan para crear y colocar Tablas, Gráficos, Formas y otros objetos de visualización u organización de datos.
Objetos y colección de VBA
Un objeto representa un elemento de una aplicación, como una hoja de cálculo, una celda, un gráfico, un formulario o un informe, además, en Visual Basic, es necesario identificar un objeto para poder llamar a uno de sus métodos o cambiar el valor de sus propiedades .
Una colección es un objeto que contiene varios objetos y generalmente son objetos del mismo tipo. En Microsoft Excel, el objeto Workbooks contiene todos los objetos Workbook abiertos. En Visual Basic, la colección Forms contiene todos los objetos Form de una aplicación
Ahora, para poder acceder a estos objetos por medio de código VBA se van a mostrar diversos ejemplos.
Libros
El objeto Workbook representa un libro de Microsoft Excel, sin embargo puede ser de utilidad usar el objeto ActiveWorkbok que representa un objeto Workbook presente en la ventana activa o en uso.
Los libros tienen varios métodos para operar con ellos, por ejemplo, podemos usar la propiedad Author para establecer un nombre de propiedad para un archivo, o bien, usamos el método Save para guardar los cambios, esto se muestra en los siguientes segmentos de código,
ActiveWorkbook.Author = "Samuel Ramirez"
ActiveWorkbook.Save
Hojas
En las macros de Excel podemos acceder a todas las hojas de un libro por medio del objeto Worksheets, como ejemplo, podemos asignar la primera hoja del libro a una variable Worksheet, cambiarle el nombre a la misma y también definir su orientación en vertical, esto se puede realizar con el siguiente código.
Dim hoja As Worksheet
Set hoja = Worksheets(1)
hoja.Name = "HojaProductos"
hoja.PageSetup.Orientation = xlPortrait
Rangos
Un rango es un grupo de celdas adyacentes en el libro. Los rangos tienen tres propiedades básicas: values, formulas y format. Estas propiedades obtienen o establecen los valores de celda, las fórmulas que se deben evaluar y el formato visual de las celdas.
El objeto Range es el que representa una celda, una fila, una columna o un grupo de celdas adyacente en un libro.
Para ejemplificar lo descrito anteriormente podemos hacer uso de la siguiente tabla de Excel.
Para acceder a los valores contenidos en una celda o rango tenemos que usar la propiedad Value. En el siguiente código se accede al valor del rango A1, que en este caso también es una celda. Este ejemplo tiene una serie de nombres en la columna A, es por eso que se declara una variable de tipo String para almacenar el resultado obtenido de la llamada a la propiedad Value.
Dim valorCadena As String
valorCadena = Worksheets("HojaProductos").Range("A1").Value
MsgBox valorCadena
Para establecer una fórmula en, por ejemplo, la celda C1, podemos usar el siguiente código. Usamos la propiedad Formula para definir el método CONCATENAR en esa celda, en esta caso se unirá un nombre y un apellido.
Worksheets("HojaProductos").Range("C1").Formula = "=CONCATENAR(A1, "" "", B2)"
Además, para establecer el formato de un rango, podemos cambiar el tipo de letra, a saber, podemos establecer letra negritas en el rango de columnas de apellidos por medio de la propiedad Font.
Worksheets("HojaProductos").Range("B1:B7").Font.Bold = True
Celdas
En Visual Basic la propiedad Cells representa un objeto Range que contiene todas las celdas de la hoja de cálculo (no solo las celdas que están actualmente en uso). Las celdas usan la sintáxis Cells(Fila, columna) para acceder a elementos específicos. Como ejemplo, se puede acceder a la celda E2 y F2 para asignarles una valor por medio de la propiedad Value, además, podemos cambiar el color de cada una de estas celdas con la propiedad Interior.Color.
Worksheets("HojaProductos").Cells(2, 5).Value = 260
Worksheets("HojaProductos").Cells(2, 6).Value = "Camisas"
Worksheets("HojaProductos").Cells(2, 5).Interior.Color = _
RGB(16, 40, 87)
Worksheets("HojaProductos").Cells(2, 6).Interior.Color = _
RGB(56, 99, 33)
Tablas
En VBA se usa el objeto ListObject para representar una tabla en la hoja de cálculo. Además, tenemos disponible el objeto ListObjects que representa una colección de las tablas pertenecientes a una hoja.
Como ejemplo, podemos acceder a todas las filas de la segunda tabla de la hoja de productos y luego podemos agregar una fila a esa tabla, para esto podemos usar el siguiente código.
Dim listaFilas As ListRows
Set listaFilas = Worksheets("HojaProductos").ListObjects(2).ListRows
listaFilas.Add
En este caso ListObjects(2) representa la segunda tabla de la hoja, ListObjects(1) la primer tabla y así sucesivamente, además, ListRows es una entidad u objeto que representa todas las filas de la tabla y el método Add es el que nos permite agregar una nueva fila.
Gráficas
En Visual Basic el objeto ChartObject representa un gráfico incrustado en una hoja de cálculo, las propiedades y métodos de ChartObject controlan la apariencia y el tamaño del gráfico incrustado. El siguiente código muestra un ejemplo de configuración de una gráfica en una hoja de cálculo.
Dim grafica As ChartObject
Set grafica = _ Worksheets("HojaProductos").ChartObjects.Add(Left:=350, _
Top:=100, Width:=280, Height:=200)
grafica.Chart.SetSourceData _ Source:=Sheets("HojaProductos").Range("A10:C13"), _
PlotBy:=xlColumns
grafica.Chart.SetElement (msoElementChartTitleAboveChart)
grafica.Chart.ChartTitle.Text = "Existencias"
grafica.Chart.HasLegend = False
En este código se declara una variable de tipo ChartObject para almacenar la gráfica que se desea incrustar en la hoja de cálculo, después se llama al método Add para establecer la esquina superior izquierda de la gráfica así como el ancho y alto de la misma, esta llamada al método devuelve un objeto que se guarda en la variable gráfica. También se llama al método SetSourceData que recibe los argumentos Source y PlotBy que definen la fuente de datos para dibujar la gráfica y el modo de representación de los datos, adicionalmente se ejecuta el método SetElement y se le provee el argumento msoElementChartTitleAboveChart para definir que se va mostrar el título que se encuentra en la parte superior del gráfico. Finalmente se usan las propiedades ChartTitle.Text para establecer el texto que se va colocar en el título previamente descrito y HasLegend con un valor de False para desactivar las etiquetas (estas etiquetas pueden ser las propiedades o características de los datos) que pueda tener el gráfico. La gráfica resultante se muestra en la siguiente imagen.
Instrucción Set
La instrucción Set que se uso previamente nos sirve para asignar un objeto (devuelto por una llamada a un método) a una variable de objeto (Declarada previamente por medio de la instrucción Dim). Es posible asignar una expresión de objeto o Nothing por medio de Set. En el siguiente código se realizan algunas asignaciones de objetos a variables de objetos.
Dim hoja As Worksheet
Set hoja = Worksheets(1)
Set objetoTest = Nothing
En este caso la variable de objeto llamada hoja es asignada con la primer hoja de calculo del libro y la variable objeto llamada objetoTest se asigna con Nothing. La palabra clave Nothing nos sirve para desasociar una variable de objeto de un objeto real y de esta manera usar esa variable de objeto para asignarle otro diferente.
Referencias
Para obtener más detalles técnicos sobre las propiedades y métodos del modelo de objetos de Excel se recomienda visitar los siguiente enlaces oficiales de Microsoft.