Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Cómo utilizar el objeto ListObject en #Excel

¡Comparte nuestro contenido!

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 5)

El objeto ListObject nos permite manipular las tablas básicas que se pueden generar en Excel. La ventaja de hacerlo a través de VBA, es que podemos utilizarlo para crear un CRUD completo o una consulta personalizada de datos que puede llegar a ser incluso más útil que una tabla dinámica si lo sabemos usar ¿Listo para comenzar a trabajar? ¡Manos a la obra!

¿Qué hace el objeto ListObject?

ListObject no es un simple objeto, en realidad es un conjunto de objetos que permiten trabajar con una tabla de datos como si fuera una lista. Al tratar una tabla como lista, se pueden manipular dichos datos de una manera mucho más sencilla y rápida. Los objetos más importantes que forman parte de esta colección son:

  • ListRow: Representa una fila de datos
  • ListColumn: Representa una columna completa de da datos
  • DataBodyRange: Representa la tabla completa de datos, pero sin los nombres de las columnas.

¿Cómo se crea un ListObject?

Suponiendo que tenemos datos suficientes en una Hoja como para una tabla.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Lo primero que necesitamos es seleccionarlos.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En el menú Insertar, presionamos el botón Tabla.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo llamada Crear tabla, nos aseguramos que marcar la opción La tabla tiene encabezados, luego presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En el menú Diseño de tabla, damos un clic en la opción Nombre de la tabla y reemplazamos el nombre default (Tabla1) por uno de nuestra preferencia. Al terminar presionamos Enter en nuestro teclado.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Lo siguiente, es manipular el objeto por VBA. Para ello, necesitamos activar el modo Programador (Puedes saltar esta parte si ya sabes como hacerlo) Para activar el modo Programador, vamos a utilizar el botón Personalizar barra de herramientas de acceso rápido, al abrirla, seleccionamos la opción Más comandos.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo Opciones de Excel, seleccionamos la categoría Personalizar cinta de opciones que se encuentra a la izquierda de la ventana. Después, marcamos la opción Programador que se encuentra la opción Pestañas principales. Finalmente presionamos Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En el menú Programador, presionamos el botón Visual Basic. También podemos llegar ahí al presionar Alt+F11

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Al llegar a la ventana de Visual Basic, buscamos la sección Proyecto, ahí presionamos el botón derecho del ratón sobre VBAProject. Una vez ahí, seleccionamos Insertar y después Módulo.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Esta es la ventana de Módulo, como podemos ver a la izquierda, ahora tenemos una carpeta llamada Módulos y dentro de ella nuestro módulo llamado Módulo1. Podemos tener tantos como sea necesario, pero para nuestro ejercicio, con este basta. Notemos también que nuestra única hoja se encuentra arriba agrupada dentro de Microsoft Excel Objects.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

¡Es hora de programar! Creamos tres variables de ámbito Global, una de tipo ListObject para manipular toda la tabla, otra de tipo ListRow para las operaciones con filas y una más de tipo ListColumn para trabajar con las columnas.

Global mitabla As ListObject
Global mifila As ListRow
Global micolumna As ListColumn

Nuestro módulo luce así por el momento.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Añadiendo una fila al ListObject

En una segunda hoja, preparamos todo el escenario para capturar un registro nuevo. Eso incluye una forma rectangular que servirá de botón. Debe quedar como sigue. No hay que olvidar preparar cada celda con su correspondiente formato. Incluso, se puede utilizar una validación de datos si es necesario.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

De regreso a Visual Basic, es hora de crear un procedimiento para insertar.

Sub insertarFila()
   ' Trabajaremos aquí dentro
End Sub

Reemplacemos el comentario por el código que necesitamos. Lo primero será instanciar el ListObject.

Set mitabla = Hoja1.ListObjects("listado")

Luego, instanciamos el objeto ListRow y le pasamos como parámetro el método Add, de esta forma podemos insertar rápidamente los elementos.

Set mifila = mitabla.ListRows.Add

El objeto ListRow utiliza la colección Range, en este caso podemos listar las columnas en lugar de la referencia, por ejemplo Range(1) se refiere a la columna 1 y así. Con eso en mente, pasamos los datos de la segunda hoja a cada columna correspondiente.

mifila.Range(1) = Hoja2.Range("B1").Value
mifila.Range(2) = Hoja2.Range("B2").Value
mifila.Range(3) = Hoja2.Range("B3").Value
mifila.Range(4) = Hoja2.Range("B4").Value
mifila.Range(5) = Hoja2.Range("B5").Value
mifila.Range(6) = Hoja2.Range("B6").Value

Inmediatamente, limpiamos las celdas de la segunda hoja.

Hoja2.Range("B1").Value = ""
Hoja2.Range("B2").Value = ""
Hoja2.Range("B3").Value = ""
Hoja2.Range("B4").Value = ""
Hoja2.Range("B5").Value = ""
Hoja2.Range("B6").Value = ""

Dejamos de apuntar a la fila nueva al hacerla valer Nothing.

Set mifila = Nothing

Y enviamos un mensaje de confirmación.

MsgBox "El registro se ha insertado con éxito"

Nuestro código quedo como sigue.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

De regreso a Excel, presionamos el botón derecho sobre la forma y elegimos la opción Asignar Macro.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana Asignar macro, seleccionamos nuestra macro de la lista llamada Nombre de la macro y presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Es hora de probar nuestro ejemplo.

Obtener la cantidad de filas de un ListObject

Lo siguiente que necesitamos saber, es como obtener la cantidad de filas que hay dentro del objeto. Para lograr esto, necesitamos la constante Count que regresa precisamente este valor. Dicha constante forma parte de la colección ListRows. Hagamos una función que nos permita reutilizar este valor de tipo Integer.

Function contarFilas() As Integer
   'Trabajaremos aquí dentro
End Function

Quitando el comentario, solo necesitamos dos líneas de código. Con la primera instanciamos nuevamente el objeto ListObject que tenemos.

Set mitabla = Hoja1.ListObjects("listado")

Con la segunda, obtenemos el valor de Count y lo mandamos de regreso al asignarlo a la misma función

contarFilas = mitabla.ListRows.Count

Nuestra función debe quedar así:

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Con la función hecha, realizamos un procedimiento para poder invocarla dentro de Excel. Este procedimiento regresara el valor de la función dentro de un mensaje, concatenado con un poco de texto para que tenga algo de sentido. Recordemos que para concatenar un Integer, tenemos la función Str que nos permite tratarlo como texto.

Sub cuantos()
    MsgBox "Hay" + Str(contarFilas) + " registros"
End Sub

De regreso en Excel, colocamos una segunda forma para usarla como botón.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Presionamos el botón derecho sobre esa forma y seleccionamos la opción Asignar macro nuevamente.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo, seleccionamos nuestro procedimiento que hicimos para contar y presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Al presionar nuestro nuevo botón, esto es lo que obteemos.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Consultar un registro del ListObject

Para obtener un registro necesitamos hacer uso del objeto DataBodyRange que forma parte de ListRows. Por supuesto necesitamos saber con certeza cuantos registros tiene nuestra tabla. Afortunadamente eso ya lo sabemos, así que buscaremos dentro de la tabla.

Para hacer la búsqueda más interesante, hemos creado en la segunda hoja un espacio para elegir el campo que queremos usar como criterio de búsqueda y el valor a utilizar. Por supuesto, también hemos colocado una forma para que sea el botón que realice todo.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Damos un clic en la celda donde colocaremos el nombre del campo a utilizar. A continuación, nos vamos al menú Datos y presionamos el botón Validación de datos.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la sección Configuración de la ventana de Validación de datos, abrimos la lista llamada Permitir y elegimos la opción Lista.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

A continuación, en la sección Origen, escribiremos una fórmula de la siguiente manera: La lista de campos se encuentra en la Hoja 1 desde A1 hasta F1, así que:

=Hoja1!$A$1:$F$1

Nótese que esta escrito en valor absoluto para asegurarnos que se use específicamente esa lista. Al terminar, presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Nuestra lista muestra ahora los campos que tenemos disponibles.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Entonces, por ejemplo. Si seleccionamos el campo Neto y escribimos un valor, deberíamos poder obtener el registro que coincide con esos parámetros. Por supuesto, es momento de programar. En nuestro módulo, crearemos un nuevo procedimiento llamado buscarRegistro.

Sub buscarRegistro()
   'Trabajaremos aquí dentro
End Sub

Primero, necesitamos múltiples variables de tipo String: El nombre del campo, el registro encontrado, el valor escrito, el nombre del producto y la unidad de medida.

Dim campo, registro, valor, encontrado, producto, medida As String

Ahora, crearemos múltiples variables de tipo Integer: La columna, la fila, la cantidad de registros que hay, el id, cantidad y neto encontrados.

Dim col, fil, hay, id, cantidad, neto As Integer

El precio se define como Currency (Moneda)

Dim precio As Currency

Y una bandera tipo Boolean que nos indica si se puede localizar el registro (true) o no (false).

Dim exito As Boolean

Lo siguiente, es validar que las celdas en la hoja 2 que utilizaremos para la consulta no se encuentren vacías, ya que en caso de estarlo, necesitamos enviar un mensaje al usuario para notificarle. La función Len permite obtener la longitud de caracteres de un elemento.

If Len(Hoja2.Range("E6").Value) = 0 Or Len(Hoja2.Range("E7").Value) = 0 Then
        MsgBox "El campo o el valor de la consulta no están disponibles"
Else
   'Aquí trabajaremos lo siguiente
End If

Si nuestras celdas no se encuentran vacías (Else), podemos proceder a la búsqueda. Primero, recuperamos la tabla con los datos. Recordemos que Set, nos permite precisamente eso.

Set mitabla = Hoja1.ListObjects("listado")

Recuperamos el campo que seleccionamos con la validación de datos.

campo = Hoja2.Range("E6").Value

Y también el valor que escribimos.

valor = Hoja2.Range("E7").Value

En el orden que tenemos en nuestra tabla, el campo ID es el primero, el campo Producto es el segundo y así sucesivamente. Esto lo podemos hacer con If o con Select.

If campo = "ID" Then col = 1
If campo = "Producto" Then col = 2
If campo = "Cantidad" Then col = 3
If campo = "Precio" Then col = 4
If campo = "Neto" Then col = 5
If campo = "Medida" Then col = 6

Obtenemos la cantidad de filas que hay en nuestra tabla.

hay = contarFilas

Podemos revisar la tabla con un ciclo, en este caso usaremos un For que empiece en la fila 1 y termine en el valor que nos entregue la variable hay.

For fil = 1 To hay
   'Trabajaremos aquí
Next

Buscamos dentro de la tabla, usando el objeto DataBodyRange que represente precisamente el contenido de la tabla. Como ya tenemos la columna y la fila, podemos hacer lo siguiente:

encontrado = mitabla.DataBodyRange(fil, col)

Si encontramos el valor que buscamos, activamos la bandera de éxito a True y terminamos el ciclo For para evitar seguir buscando. En caso contrario, ponemos la bandera en False.

If encontrado = valor Then
   exito = True
   Exit For
Else
   exito = False
End If

Si tuvimos éxito encontrando la fila…

If exito Then

Llenamos las variables que creamos para cada campo, con la fila que encontramos (variable fil) en el DataBodyRange y la columna correspondiente (Id = 1, producto = 2, etc…)

id = mitabla.DataBodyRange(fil, 1)
producto = mitabla.DataBodyRange(fil, 2)
cantidad = mitabla.DataBodyRange(fil, 3)
precio = mitabla.DataBodyRange(fil, 4)
neto = mitabla.DataBodyRange(fil, 5)
medida = mitabla.DataBodyRange(fil, 6)

Finalmente, vamos a crear un mensaje con todo el registro completo. Concatenaremos todo lo encontrado en nuestra variable llamada registro y con vbCrLf nos aseguramos de hacer saltos de línea para que no aparezca todo junto. No olvidemos utilizar Str en las variables que no sean String.

registro = "Hemos encontrado lo siguiente:" + vbCrLf
registro = registro + "ID:" + Str(id) + vbCrLf
registro = registro + "Producto:" + producto + vbCrLf
registro = registro + "Cantidad:" + Str(cantidad) + vbCrLf
registro = registro + "Precio:" + Str(precio) + vbCrLf
registro = registro + "Cont. Neto:" + Str(neto) + vbCrLf
registro = registro + "Medida:" + medida + vbCrLf
registro = registro + "Fila del registro:" + Str(fil)

Una vez obtenido, enviamos el mensaje con el registro encontrado.

MsgBox registro

Agregamos el Else que falta para enviar un mensaje en caso de no encontrar ningún registro, y cerramos el If.

Else
   MsgBox "No se ha encontrado registro coincidente"
End If

Como ya fue mucho código, aquí tienes el procedimiento completo por si estas un poco enredado.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Por supuesto, necesitamos que eso funcione en Excel, así que regresamos a la Hoja2 donde estamos trabajando y con el botón derecho del ratón sobre la forma Buscar Registro, elegimos la opción Asignar Macro.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En el cuadro de diálogo, seleccionamos la macro llamada buscarRegistro y presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Probemos el resultado de todo ese trabajo:

Eliminar un registro del ListObject

Para eliminar un registro del objeto ListObject, solo necesitamos la colección ListRows que contiene la tabla de datos pero en forma de fila. Comencemos con las variables que necesitamos. Para esto, hemos construido en la Hoja2 lo siguiente.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la celda C10, colocaremos la lista de ID de cada producto. Para que esto funcione y se actualice con cada registro nuevo, haremos lo siguiente.

Nos cambiamos a la Hoja1, y en el menú Fórmulas, damos clic en Administrador de nombres.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo, presionamos el botón Nuevo.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la siguiente ventana, escribiremos en la caja de Nombre, un nombre personalizado para nuestra lista de IDs, en este caso llamaremos a nuestra lista: identificadores. una vez hecho esto, en la sección Se refiere a, presionamos el botón con la flecha hacia arriba.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En nuestra tabla. seleccionamos únicamente los ID, sin incluir el título de la columna.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Observemos que listado[ID], representa la columna completa. Al presionar el botón con la flecha abajo, regresamos a la ventana anterior y presionamos Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

De regreso a la primera ventana, simplemente presionamos el botón Cerrar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

De regreso a la Hoja2, damos clic en la celda que vamos a utilizar (C10), luego vamos al menú Datos y presionamos Validación de datos.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo, damos click en la opción Permitir y elegimos Lista.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la opción Origen, escribimos la fórmula:

=identificadores

Notemos que es el nombre personalizado que creamos hace unos momentos. Al finalizar, presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Con eso, ya podemos ver la lista de IDs en la celda.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

¡Ahora, vamos a programar nuevamente!

En nuestro módulo, crearemos un procedimiento llamado eliminarRegistro.

Sub eliminarRegistro()
   'Trabajaremos aquí
End Sub

Necesitamos el ID que queremos eliminar, la cantidad de filas, la fila donde encontramos el valor y el ID encontrado para comparar. Todas estás son de tipo Integer.

Dim delID, hay, fila, IDEncontrado As Integer

Una variable de tipo Boolean para saber si encontramos el ID

Dim hallado As Boolean

También necesitamos una variable de tipo Variant que nos permite elegir entre Sí y No, ya que preguntaremos antes de eliminar. Además los botones en VBA son precisamente de ese tipo.

Dim opcion As Variant

Revisaremos con Len si la celda C10 de la Hoja2 se encuentra vacía o no. En caso de estar vacía enviaremos un mensaje para notificar.

If Len(Hoja2.Range("C10").Value) = 0 Then
        MsgBox "Por favor, seleccione el ID del producto a eliminar"
Else
   'Aquí continuaremos trabajando lo que sigue
End If

Si la celda no se encuentra vacía, entonces obtenemos la tabla:

Set mitabla = Hoja1.ListObjects("listado")

Obtenemos el ID que seleccionamos en la celda C10 de la Hoja2.

delID = Hoja2.Range("C10").Value

Creamos una ventana de diálogo con MsgBox al añadir como segundo parámetro la opción vbYesNo que representa los botones Sí y No.

opcion = MsgBox("¿Desea eliminar el registro " + Str(delID) + "?", vbYesNo)

Y si presionamos el botón Sí (vbYes)

If opcion = vbYes Then
   ' Continuaremos trabajando aquí
End If

Obtenemos la cantidad de filas que hay.

hay = contarFilas

Con un ciclo For desde la primera fila hasta la cantidad máxima obtenida.

For fila = 1 To hay
   'Aquí va lo que sigue
Next

Primero agarramos el ID de cada fila a través del DataBodyRange.

IDEncontrado = mitabla.DataBodyRange(fila, 1)

Si el IDEncontrado es igual al ID para eliminar, entonces marcamos la bandera de hallado y terminamos el For, en caso contrario solo marcamos la bandera como False y seguimos buscando.

If IDEncontrado = delID Then
   hallado = True
   Exit For
Else
   hallado = False
End If

Lo que sigue, va después de que termina el ciclo For. Es decir, si hallamos el ID que queremos, entonces con ListRows y el número de la fila encontrada, lo eliminamos con el método Delete, Enviamos el mensaje de éxito y limpiamos la celda C10 de la Hoja2. En caso contrario (Else) enviamos el mensaje de que no se pudo eliminar el producto.

If hallado Then
   mitabla.ListRows(fila).Delete
   MsgBox "Producto eliminado con éxito"
   Hoja2.Range("C10").Value = ""
Else
   MsgBox "No se ha encontrado el producto que deseaba eliminar"
End If

El procedimiento completo, luce así:

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Para ir cerrando esta parte, regresamos a la Hoja2 de Excel, tomamos la forma que creamos a manera de botón. En ella, presionamos el botón derecho del ratón y elegimos Asignar macro.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo, seleccionamos nuestro procedimiento llamado eliminarRegistro y presionamos Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

¡Es la hora de probar esto también!

Aplicar auto filtro al ListObject

Por supuesto, una de las mejores características de un ListObject es la capacidad de aplicar filtros a la tabla de datos que representa. Con eso en mente, regresamos a la Hoja1 que contiene la tabla y creamos algo como lo que sigue:

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Ahora que ya tenemos el escenario preparado, vamos a crear nuestro un procedimiento en nuestro módulo de Visual Basic que nos permita activar y desactivar los filtros. Llamaremos a ese módulo filtrar.

Sub filtrar()
   'Trabajaremos aquí
End Sub

Necesitamos una variable para el texto que tiene escrito el botón de “Desactivar filtro”

Dim textoForma As String

Todas las formas que coloquemos en nuestra hoja de Excel, forman parte de la colección Shapes, la cuál básicamente es un vector. La propiedad Text forma parte del objeto Characters de la sub colección TextFrame.

textoForma = Hoja1.Shapes(1).TextFrame.Characters.Text

En mi caso, la forma que estoy usando casualmente era la primera de la lista. También recuperamos la tabla otra vez.

Set mitabla = Hoja1.ListObjects("listado")

Si el texto de la forma dice “Activar filtro” hacemos que la tabla active el autofiltro estableciendo la propiedad ShowAutoFilter a True y cambiamos el texto a “Desactivar filtro”, de lo contrario cambiamos ese valor a False para desactivar y el texto de la forma lo establecemos a “Activar filtro”.

If textoForma = "Activar filtro" Then
   mitabla.ShowAutoFilter = True
   Hoja1.Shapes(1).TextFrame.Characters.Text = "Desactivar filtro"
Else
   mitabla.ShowAutoFilter = False
   Hoja1.Shapes(1).TextFrame.Characters.Text = "Activar filtro"
End If

El procedimiento completo queda así:

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

De regreso a Excel, presionamos el botón derecho del ratón sobre la forma “Desactivar filtro” y elegimos Asignar macro.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Seleccionamos el procedimiento filtrar y presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

¡Veamos eso en acción!

Filtrar y ordenar por columna los datos del ListObject

Podemos filtrar y ordenar los datos por columna, para ello, utilizaremos el objeto Sort para ordenar y AutoFilter para aplicar el filtro que queremos.

Filtrar y ordenar por columna

En la celda B11 de nuestra Hoja colocaremos la lista completa e los campos de nuestra tabla. Para ello, seleccionamos dicha celda, vamos al menú Datos y presionamos el botón Validación de datos.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo, abrimos la opción Permitir, y elegimos Lista.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Damos un clic en la opción Origen, específicamente en el botón con la flecha.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

A continuación, seleccionamos únicamente los títulos de cada columna de la tabla, y volvemos a presionar el mismo botón de la flecha.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Ahora, presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Con esto, ya podemos ver la lista de campos en dicha celda.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

De regreso a Visual Basic, creamos un procedimiento llamado filtrarColumna.

Sub filtrarColumna()
   'Trabajaremos aquí
End Sub

Necesitamos una variable para la columna de tipo String

Dim columna As String

Ahora, capturamos el valor de la celda B11 en dicha variable.

columna = Hoja1.Range("B11").Value

Si el valor estaba vacío entonces enviamos un mensaje notificando eso.

If Len(columna) = 0 Then
   MsgBox "Seleccione una columna para filtrar"

Y si no estaba vacío, entonces capturamos nuestra tabla.

Else
   Set mitabla = Hoja1.ListObjects("listado")

A través de la colección Sort y del Objeto SortFields, limpiamos con el método Clear cualquier filtro anterior.

mitabla.Sort.SortFields.Clear

Para crear el filtro utilizaremos el método Add de SortFields, este método necesita como mínimo 3 elementos:

  • Key; Es el rango de datos a filtrar. En nuestro caso lo pasaremos a través de Range con el nombre de nuestro ListObject y la variable columna concatenados.
  • SortOn: Define el criterio de ordenamiento, usaremos el valor default xlSortOnValues que significa que utilizará valores directos.
  • Order: puede ser: xlAscending (Ascendente) y xlDescending (Descendente)

La línea queda así:

mitabla.Sort.SortFields.Add Key:=Range("listado[" + columna + "]"), SortOn:=xlSortOnValues, Order:=xlAscending

Después le pedimos que excluya los encabezados del ordenamiento con la propiedad Header.

mitabla.Sort.Header = xlYes

Le pedimos con MatchCase en False que no compruebe repetidos (opcional)

mitabla.Sort.MatchCase = False

Aplicamos el auto filtro.

mitabla.Sort.Apply

Y cerramos el If que estaba abierto.

End If

El código queda así:

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

De regreso a Excel, presionamos el botón derecho del ratón sobre el primer botón de Aplicar y seleccionamos Asignar macro.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo, seleccionamos nuestro procedimiento llamado filtrarColumna y presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

¡Hay que probar lo que acabamos de hacer!

Filtrar por criterio

Ahora que ya filtramos por columna, podemos añadir un criterio básico para mejorar el filtro. Utilizaremos la celda B13 para escribir cualquier criterio para filtrar nuestra tabla y utilizaremos por supuesto la columna seleccionada en B11. Así que regresando a Visual Basic, creamos nuestro último procedimiento llamado filtrarCriterio.

Sub filtrarCriterio()
   'Trabajaremos aquí
End Sub

Necesitamos 2 variables de tipo String, una para la columna y otra para el criterio ya que el ListObject recibe los criterios como cadenas de texto.

Dim columna, criterio As String

Creamos una variable Boolean para saber si estamos en condiciones de aplicar el filtro.

Dim filtrado As Boolean

Y el número de la columna que vamos a utilizar.

Dim col As Integer

Lo primero será inicializar nuestra bandera a True, partiendo de que idealmente podemos aplicar filtros.

filtrado = True

Tenemos dos posibles casos donde la bandera puede cambiar a False, el primero es si no tenemos seleccionado el nombre de la columna en B11, así que enviamos el mensaje notificando lo sucedido y por supuesto cambiamos la bandera a Flase.

If Len(columna) = 0 Then
   MsgBox "Seleccione una columna para filtrar"
   filtrado = False
End If

El segundo caso sucederá si tenemos seleccionado el nombre de la columna, pero no hemos escrito el criterio que queremos utilizar. Hacemos lo mismo, notificamos lo sucedido y cambiamos la bandera a False.

If Len(columna) > 0 And Len(criterio) = 0 Then
   MsgBox "Escriba un criterio para el filtro"
   filtrado = False
End If

Los demás posibles casos serán lidiados por la validación de datos. Si quieres saber como utilizarla, recuerda que ya hablamos de ella hace tiempo. Si la bandera nunca cambio a False, sino que se quedo en True, entonces podemos aplicar el filtro.

If filtrado Then
   'Continuaremos trabajando aquí
End If

Primero obtenemos el número de cada columna en base a su nombre. Esto lo podemos hacer de muchas manera, aquí lo hice con If.

If columna = "ID" Then col = 1
If columna = "Producto" Then col = 2
If columna = "Cantidad" Then col = 3
If columna = "Precio" Then col = 4
If columna = "Neto" Then col = 5
If columna = "Medida" Then col = 6

Recuperamos la tabla.

Set mitabla = Hoja1.ListObjects("listado")

Desactivamos y enseguida reactivamos el auto filtro. Es un poco raro, pero sin eso a veces no se actualiza la tabla de acuerdo a lo que elegimos.

mitabla.ShowAutoFilter = False
mitabla.ShowAutoFilter = True

Finalmente aplicamos el filtro usando dos atributos del objeto AutoFilter.

  • Field: Es el número de la columna, aquí lo reemplazamos con la variable que obtuvimos.
  • Criteria1: Es el primer criterio para filtrar. Aquí pasamos la variable con la información de nuestra celda B13.
mitabla.Range.AutoFilter Field:=col, Criteria1:=criterio

El procedimiento completo queda así:

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

De regreso a Excel, presionamos el botón derecho del ratón sobre el segundo botón de Aplicar en nuestra Hoja1 y seleccionamos Asignar macro.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

En la ventana de diálogo, seleccionamos nuestro procedimiento llamado filtrarCriterio y presionamos el botón Aceptar.

Cómo utilizar el objeto ListObject en #Excel - CableNaranja

Por supuesto, es momento de probar lo último.

Como podemos ver, el ListObject es un objeto muy útil y poderoso que puede tener un sin fin de aplicaciones.

Y eso es todo por ahora ¿Te ha resultado? Déjanos saber en los comentarios aquí abajo, en nuestra cuenta de twitter @cablenaranja7 o en nuestra página de facebook.

¡Comparte nuestro contenido!

Entradas relacionadas

3 comentarios en "Cómo utilizar el objeto ListObject en #Excel"

  1. Hace mucho tiempo que no encontraba una ayuda tan completa como esta. Muchas gracias por ayudarnos a ampliar nuestro conocimiento.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *