Editar datos filtrados en listbox

Estimados amigos del foro todoexpertos, vengo hoy a pedirles un poco de su ayuda con un problema que me tiene dando vueltas la cabeza.
Tengo un formulario con un listbox que filtra información por categoría, lo que necesito es saber como hacer para poder editar un registro cuando ya lo he filtrado, es decir; hacer un filtrado por "nombre", dar doble click y automáticamente me salga la información para poder editarla. He intentado algunas opciones que me encontré en la web y he intercambiado muchos códigos tratando de adaptarlo a mi userform, pero no he tenido éxito, pido su ayuda mis estimados amigos, espero alguien me pueda orientar, de ante mano muchas gracias.

Este es el código:

Código en userform:

Private Sub CmpNom_Change()
Dim uf As Integer
[B1:B2] = ""
[B1] = Combo_Criterio.Text
[B2] = CmpNom.Text
uf = [B65536].End(xlUp).Row
Range("B4:P" & uf).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"B1:B2"), CopyToRange:=Range("AA1:AO1"), Unique:=True
uf = [aa65536].End(xlUp).Row
LisDts.ColumnCount = 15
LisDts.RowSource = "AA2:AO" & uf
End Sub

Private Sub UserForm_Initialize()
Range("B4").Select
Combo_Criterio.Clear
Do Until ActiveCell = ""
Combo_Criterio.AddItem ActiveCell
ActiveCell.Offset(, 1).Select
Loop
End Sub

Código en módulo:

Sub filtro()

Dim uf As Integer
uf = [B65536].End(xlUp).Row
Range("B4:P" & uf).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"C1:E2"), CopyToRange:=Range("AA1:AO1"), Unique:=True
End Sub
Sub Rectángulo1_AlHacerClic()
Main.Show
End Sub

Botón editar:

Private Sub CommandButton1_Click()

If Me.LisDts.ListIndex < 0 Then
MsgBox "No se ha elegido ningún registro"
Else
EJEMPLO.Show
End If
End Sub

Código userform EJEMPLO:

Private Sub CommandButton1_Click()
For i = 1 To 10
ActiveCell.Offset(0, i - 1).Value = Me.Controls("TextBox" & i).Value
Next i
Unload Me
End Sub

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

1 respuesta

Respuesta
1

Primero, como ya te habrás dado cuenta, si tienes 10 registros en tu base, después de filtrar, el registro que estaba en la fila 5, puede ser que ahora sea el registro 1.

Hay 2 formas de encontrar el registro de la fila 5.

La primera, si todos los registros tienen una llave única, es decir, si en alguna columna tienen un identificador que los haga único, entonces lo que tienes que hacer es, cuando seleccionas un registro del listbox para editarlo, tomas ese identificador y lo buscas en la base de datos, entonces encuentras la fila 5 y ya puedes tomar los datos, modificarlos y regresarlos a la fila 5.

La segunda, si no tienes un identificador único para cada registro, entonces tienes que numerar la base de datos con el mismo número de fila en una columna independiente, por ejemplo, veo que estás filtrando hasta la columna "P" entonces en la columna "Q" pon un consecutivo que vaya desde el 2 hasta el último número de tu última fila.

Una vez que ya numeraste, entonces tienes que cargar a tu listbox 16 columnas, incluyendo el consecutivo. Entonces cuando seleccionas el registro del listbox, lees el dato de la columna 16 y ese es el número de fila de la base.

Si quieres que te ayude a adaptar cualquiera de las 2 opciones envíame tu archivo y reviso cuál de las 2 es la que mejor se adapta.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Paulo Pantoja” y el título de esta pregunta.

Hola Dante, te he enviado el archivo. Saludos

Vamos a utilizar la primera opción, tienes en la columna "B" el "No. Registro", ese dato debe ser único para cada registro.

Te anexo los 2 códigos, uno para cargar los datos en el formulario y otro para pasar los datos del formulario a las celdas.

Private Sub CommandButton1_Click()
'Act.Por.Dante Amor
    num = Main.LisDts.List(Main.LisDts.ListIndex, 0)
    Set b = Sheets("Hoja1").Range("B:B").Find(num, lookat:=xlWhole)
    If Not b Is Nothing Then
        For i = 2 To 15
            Cells(b.Row, i + 1) = Me.Controls("TextBox" & i).Value
        Next
    End If
    Unload Me
End Sub
'
Private Sub UserForm_Initialize()
'Act.Por.Dante Amor
    num = Main.LisDts.List(Main.LisDts.ListIndex, 0)
    Set b = Sheets("Hoja1").Range("B:B").Find(num, lookat:=xlWhole)
    If Not b Is Nothing Then
        For i = 1 To 15
            Me.Controls("TextBox" & i).Value = Cells(b.Row, i + 1)
        Next i
    End If
End Sub

Saludos.Dante Amor

Hola Dante, estuve checando el archivo y funciona muy bien, sólo tengo una duda. Este mismo funcionamiento lo quiero aplicar en otra hoja con un duplicado del formulario "Main", es decir "Main2", y con otro formulario ejemplo, es decir "ejemplo2", para buscar como te digo en otra hoja y poder editar registros, hice todo lo que tiene tu ejemplo, pero no me funciona, es decir al momento que se ejecuta el formulario "EJEMPLO1" para editar los datos, este no carga los datos del listbox. De antemano muchas gracias.

Ejemplo:

Código: Main2

Private Sub CmpNom_Change()
Dim uf As Integer
[B1:B2] = ""
[B1] = Combo_Criterio.Text
[B2] = CmpNom.Text
uf = [B65536].End(xlUp).Row
Range("B4:F" & uf).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"B1:B2"), CopyToRange:=Range("AA1:AE1"), Unique:=True
uf = [aa65536].End(xlUp).Row
LisDts.ColumnCount = 5
LisDts.RowSource = "AA2:AE" & uf
End Sub


Private Sub CommandButton_salir_Click()

If Me.LisDts.ListIndex < 0 Then
MsgBox "No se ha elegido ningún registro"
Else
EJEMPLO1.Show
End If
End Sub


Private Sub UserForm_Initialize()
Range("B4").Select
Combo_Criterio.Clear
Do Until ActiveCell = ""
Combo_Criterio.AddItem ActiveCell
ActiveCell.Offset(, 1).Select
Loop
End Sub

Código EJEMPLO1:

Private Sub CommandButton1_Click()
'Act.Por.Dante Amor
num = Main.LisDts.List(Main.LisDts.ListIndex, 0)
Set b = Sheets("Hoja3").Range("B:B").Find(num, lookat:=xlWhole)
If Not b Is Nothing Then
For i = 2 To 5
Cells(b.Row, i + 1) = Me.Controls("TextBox" & i).Value
Next
End If
Unload Me
End Sub

Private Sub CommandButton2_Click()

End Sub

'
Private Sub UserForm_Initialize()
'Act.Por.Dante Amor
num = Main.LisDts.List(Main.LisDts.ListIndex, 0)
Set b = Sheets("Hoja3").Range("B:B").Find(num, lookat:=xlWhole)
If Not b Is Nothing Then
For i = 1 To 5
Me.Controls("TextBox" & i).Value = Cells(b.Row, i + 1)
Next i
End If
End Sub

Puedes valorar esta respuesta y creas una nueva con el detalle de lo que necesitas y me envías el nuevo archivo con lo que tienes.

Recuerda poner en el asunto tu nombre de usuario "Paulo Pantoja"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas