MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO

Hola a todos:

En el post de hoy trataré un tema muy específico de los listbox (o cuadros de lista) en los formularios. Se trata de cómo podemos seleccionar desde un listbox CON UN FILTRO APLICADO la información relacionada en un base de datos.

Para comprender el concepto, es necesario explicarlo con un ejemplo:

MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO

En la imagen podemos apreciar como el listbox está filtrado por varios criterios y como en la hoja hemos capturado la fila correspondiente al registro seleccionado en el listbox.

Para poder conseguir esto, debemos siempre crear en nuestra base de datos un indice que vaya desde el 1 hasta el final indicando el número en cada celda: 1, 2, 3 …hasta el final del rango con datos. En mi ejemplo es la primera columna y la nombro como ÍNDICE.

Esto lo automatizaremos cada vez que inicialicemos el formulario que carga los datos en el listbox, así:

Private Sub UserForm_Initialize()
Dim i As Long, fin As Long, Mirango() As Integer

'Borramos ID's e inicializamos de nuevo.

'Los ID deben ser consecutivos a partir de 1

fin = Application.CountA(Sheets("BBDD").Range("B:B"))
Sheets("BBDD").Range("A2:A" & fin).Select
Selection.Clear
ReDim Mirango(1 To fin)
For i = 1 To fin:
Mirango(i) = i
Next i
Worksheets("BBDD").Range("A2:A" & UBound(Mirango)).Value = _
Application.WorksheetFunction.Transpose(Mirango)
Worksheets("BBDD").Range("A1").Select
'Indicamos el número de columnas que tendrá el listbox

Me.ListBox1.ColumnCount = 7

'Definimos tamaño de los espacios

Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"

'Cargamos listbox

Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row

End Sub

En rojo está el código de realiza esto, primero limpia datos de la primera columna excepto encabezados y luego a través de un array iniciamos la numeración del 1 hasta el final. El último paso es transponer los datos en la columna A.

Es importante tener en cuenta que este paso lo hará automáticamente cada vez que mostremos el formulario.

Luego, en el evento ListBox1_Click(), solo tenemos que pasar este código para cada vez que seleccionemos una línea en nuestro cuadro de lista, está se seleccione también en la hoja:

Private Sub ListBox1_Click()
Dim i As Long
Dim dato As Integer
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then dato = ListBox1.List(i)
Next i
Sheets("BBDD").Cells(dato + 1, 1).Activate
End Sub

Y os estaréis preguntando porqué hacemos todo esto, pues es sencillo, es fundamental por si queremos modificar los datos a través del listbox. De esta forma podremos modificar lo que hayamos seleccionado, aunque se encuentre filtrado, en nuestra base de datos:

MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO_1

He aprovechado la misma base de datos del post: REALIZAR BÚSQUEDAS DEPENDIENTES EN UN LISTBOX y también parte de la programación para poder ilustrar cómo podemos resolver la cuestión presentada.

Simplemente comento dos líneas de código que he agregado para que el formulario de modificación funcione correctamente:

Para cargar los datos seleccionado en el listbox y en la hoja:

Private Sub UserForm_Initialize()
For j = 1 To 6
Me.Controls("TextBox" & j).Value = ActiveCell.Offset(0, j)
Next j
End Sub

Y para modificar:

Private Sub CommandButton1_Click()
'Definimos variables
Dim i As Long, j As Long, fin As Long, Mirango() As Integer
'Pasamos datos modificados a la hoja
For j = 1 To 6
ActiveCell.Offset(0, j).Value = Me.Controls("Textbox" & j).Value
Next j
'Marcamos de nuevo elemento a modificar
For i = 0 To FORMULARIO.ListBox1.ListCount - 1
If FORMULARIO.ListBox1.Selected(i) Then dato = FORMULARIO.ListBox1.List(i)
Next i
Sheets("BBDD").Cells(dato + 1, 1).Activate
'Actualizamos listbox
FORMULARIO.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Unload Me
End Sub

En este ejemplo solo he implementado un formulario para realizar modificaciones, cualquier otra mejora como realizar un alta o una baja o que los cambios se guarden automáticamente os lo dejo como ejercicio para practicar : )

Y eso es todo, espero que este método os haya resultado de interés : )

Descarga el archivo de ejemplo pulsando en: MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Anuncios

OCULTAR ICONOS DE FILTRO EN TABLAS DINÁMICAS

Hola a todos!, ¿qué tal estáis?

Hoy publicaré un post muy breve dando contestación a un lector que me preguntaba cómo podía ocultar los iconos de filtro que aparecen una tabla dinámica. Esto es útil si usamos nuestro excel como un documento a modo de presentación y queremos ocultar el aspecto de la tabla dinámica, o impedir que se puede volver a filtrar o desfiltrar los datos de una tabla.

Veamos un ejemplo sencillo con una tabla dinámica:

OCULTAR ICONOS DE FILTRO EN TABLAS DINAMICAS

Para poder eliminar los iconos de filtro es necesario utilizar una macro, es este caso la rutina realiza los cambios en todas las tablas que se encuentren en el libro.

Sub oculta_filtro()
'Declaramos variables
Dim Hoja As Worksheet
Dim Tabla_d As PivotTable
Dim Campo As PivotField
'Recorremos todos los libros y las hojas
For Each Hoja In ActiveWorkbook.Sheets
For Each Tabla_d In Hoja.PivotTables
For Each Campo In Tabla_d.PivotFields
'Desactivamos la selección de los items
Campo.EnableItemSelection = False
Next
Next Tabla_d
Next Hoja
End Sub

El resultado será el siguiente:

OCULTAR ICONOS DE FILTRO EN TABLAS DINAMICAS1

Como podéis comprobar hemos eliminado sin problema los iconos del filtro en la tabla. Para volver a ponerlos solo es necesario cambiar en el código = False por = True

Y eso es todo, espero que os resulte de utilidad.

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!