Macro Listbox multiselect con filtro

Quisiera ver quien me apoya a solucionar algunos detalles del siguiente adjunto:

  • Cuando inicia el userforn, el listbox se carga bien pero con algunas filas seleccionadas, esto no debe ser
  • Sin filtrar solo puedo eliminar una fila a pesar de haber seleccionada varias.
  • Cuando filtro por Tipo de salida (ComboBox1) o rango de fechas no puedo eliminar ninguna fila seleccionada

.
La verdad ya le eh dado vuelta por toda la red y solo lo eh logrado con 10 filas pero solo elimino una fila a la vez después de haber filtrado. Anexo proyecto por aquella persona que este interesado en ayudarme u orientarme o darme un ejemplo para solucionarlo.

Respuesta
1

He visto tu archivo, tiene dos Formularios y los dos tienen un ListBox, supongo que te refieres al que se llama "Filtrado"

Esto dices en tu pregunta:

  • Cuando inicia el userforn, el listbox se carga bien pero con algunas filas seleccionadas, esto no debe ser

A mí no me pasa eso, el listbox se carga sin ninguna selección.

Ahora bien, no me queda claro que es lo que quieres hacer. Quieres borrar los registros seleccionados, ¿de la hoja o solo del listbox?

Andy Machin deseo eliminar tanto del listbox como de la hoja en modo multiselect, después de haber filtrado en el userform "Filtrado"

Vale, este es el código, según entiendo:

Sub CrearArray()
On Error GoTo ErrHandler
Dim vFileList() As Variant
Dim iCount As Integer
Dim iList As Integer
Dim RecordName As String
With Filtrado.ListBox1
    For iList = 0 To .ListCount - 1
        If .Selected(iList) Then
            iCount = iCount + 1: ReDim Preserve vFileList(1 To iCount)
            vFileList(iCount) = .List(iList, 0)
        End If
    Next iList
    For iList = LBound(vFileList) To UBound(vFileList)
        RecordName = vFileList(iList)
        Call BorrarFilas(RecordName)
    Next iList
End With
Exit Sub
ErrHandler:
If Err.Number = 9 Then
    MsgBox "Debe seleccionar almenos un registro.", vbExclamation, "Error..."
Else
    MsgBox "Ha ocurrido un error en tiempo de ejecución.", vbCritical, "Error..."
End If
End Sub
Sub BorrarFilas(ByVal FindRecord As String)
Dim Rng As Range
If Trim(FindRecord) <> "" Then
    With Sheets("Salidas").Range("A:A")
        Set Rng = .Find(What:=FindRecord, _
                        After:=.Cells(.Cells.Count), _
                        LookIn:=xlValues, _
                        LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:=False)
        If Not Rng Is Nothing Then
            Rng.EntireRow.Delete
        End If
    End With
End If
End Sub

Son dos macros, pero solo ejecutas la primera, ya que la segunda solo recibe un parámetro que le da la primera.

Eso le pegas en un modulo estándar, y llamas a la macro CrearArray en el botón de borrar.

Veo que el listbox se carga con los datos que hay en la hoja "Salidas" así que por lógica asumí que esa es la hoja donde hay que borrar.

Esta macro básicamente lo que hace es llenar un array con la multiseleccion, basándose en el valor de la primera columna, que es la CLAVE, y supongo que es único para cada registro, por ende use el método Find para encontrar cada CLAVE que fue selecciona y eliminarla.

Andy M.

Por cierto, luego de llamar a CrearArray, debes volver a cargar el ListBox para actualizarse.

Así que el botón de borrar en el formulario debe quedar así:

Private Sub CommandButton4_Click()
Call CrearArray
With Me.ListBox1
    .ColumnCount = 14
    .ColumnWidths = "50 pt; 50pt; 50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;50 pt;70 pt; 50 pt;"
    .RowSource = "'" & Hoja3.Name & "'!A1:N" & Hoja3.Range("A" & Rows.Count).End(xlUp).Row
End With
End Sub

Andy M.

Andy Machin muchas gracias por tu apoyo, ya  probé pero me arroja este error

"Ha ocurrido un error en tiempo de ejecución."

Si, lo vi, y ya sé por que es. El problema no es mi código, son los otros tuyos. Estuve revisando tus macros cuando vi el error. El problema es que estas usando la propiedad RowSource demasiado.

Cuando filtras, creas una hoja temporal que se llama HojaDeTrabajo o algo así. Llenas el rowsource por esa hoja y luego borras la hoja, después al usar la propiedad List para crear el array en mi código, no hay memoria suficiente. Para arreglarlo tienes que reestructurar tus otras macros, yo arregle una para comprobar que estoy en lo correcto, y ya funciona.

No te podre ayudar, sería como hacerte todo, o casi todo el libro. Como dijo Abram (vi que volviste a hacerle la pregunta a él) no tengo tiempo para arreglarte todos esos códigos.

Suerte,

Andy M.

1 respuesta más de otro experto

Respuesta
1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas