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!
Tabla de Contenido
¿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.

Lo primero que necesitamos es seleccionarlos.

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

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.

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.

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.

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.

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

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.

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.

¡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.

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.

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.

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

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

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í:

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.

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

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

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

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.

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.

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.

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.

Nuestra lista muestra ahora los campos que tenemos disponibles.

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.

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.

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

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.

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.

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

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.

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

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.

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

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.

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

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.

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

¡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í:

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.

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

¡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:

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í:

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

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

¡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.

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

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

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.

Ahora, presionamos el botón Aceptar.

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

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í:

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

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

¡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í:

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.

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

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.

Docente, IT Manager, Blogger & Developer. Escribo por diversión, educo por pasión. | Grandstanding is not my thing.
excelente super excelente gracias
Maravillosa exposición. Muchas gracias
Hace mucho tiempo que no encontraba una ayuda tan completa como esta. Muchas gracias por ayudarnos a ampliar nuestro conocimiento.