Macro que selecciona item de listbox y lo muestra en userform para luego poder modificarlo
-----------------------
Buen tarde
Necesito su ayuda porfa
Tengo este codigo
Utilizo este codigo con doble click para que me muestre el userform donde aparecen los datos seleccionados del listbox
Private Sub ListBox1_dblClick(ByVal Cancel As MSForms.ReturnBoolean)
UserForm4.Show
End Sub
Este codigo esta en el userform con textxbox del 1 al 10 para que me muestre los datos seleccionandos del listbox
Private Sub UserForm_Initialize()
For i = 1 To 10
Me.Controls("TextBox" & i).Value = ActiveCell.Offset(0, i - 1).Value
Next i
End Sub
Y este codigo para hacer las modificaciones a los datos
Private Sub CommandButton3_Click()
For i = 1 To 9
ActiveCell.Offset(0, i - 1).Value = Me.Controls("TextBox" & i).Value
Next i
Unload Me
End Sub
El problema es que cuando selecciono el item del listbox, en el userform no me muestra el seleccionado sino que otro.
Como ven en la imagen
En el userform mas grande aparece un item seleccionado en el listbox (ultimo item) pero en el otro userform no aparece el seleccionado sino otro
1 respuesta
¿Y cómo seleccionas la celda en la hoja?
¿Por lo que veo tienes varios registros con "Toallas de mano" pero cómo sabes cuál es el que tienes en el listbox?
Cómo cargas los datos en el listbox, ¿tienes algún filtro para cargar los datos o simplemente cargas todos los registros?
Pon tu código utilizando el icono para insertar código
buen dia
Private Sub txt_Buscar_Change() Dim encontrado As Range Me.ListBox1.Clear j = 1 items = Range("A" & Rows.Count).End(xlUp).Row Ctrl = True For i = 3 To items If LCase(Cells(i, 1).Value) Like "*" & LCase(Me.txt_Buscar.Value) & "*" Then Me.ListBox1.AddItem Cells(i, 1) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 1) = Cells(i, 2) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 2) = Cells(i, 3) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 3) = Cells(i, 4) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 4) = Cells(i, 5) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 5) = Cells(i, 6) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 6) = Cells(i, 7) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 7) = Cells(i, 8) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 8) = Cells(i, 9) Ctrl = False End If Next i 'Call enter Me.Label10.Caption = Format(ListBox1.ListCount, "00") If Ctrl And Not IsEmpty(Trim(Me.txt_Buscar)) Then MsgBox "Nombre No Registrado", vbInformation + vbOKOnly, "Sr. Operador" txt_Buscar.SetFocus End If End Sub este codigo me carga el listbox, los items hay repetidos eso siempre va a ser asi Private Sub Entradas() Application.ScreenUpdating = False Sheets("Entradas2").Select 'Call QuitabotonX(Me.Caption) 'Le digo cuántas columnas ListBox1.ColumnCount = 9 'Asigno el ancho a cada columna Me.ListBox1.ColumnWidths = "200 pt;49,95 pt;92 pt;70 pt;30 pt;30 pt;49,95 pt;70 pt;100 pt" 'El origen de los datos es la Tabla1 'ListBox1.RowSource = "Tabla7" Do While ActiveCell.Value <> "" ListBox1.AddItem ActiveCell i = ListBox1.ListCount - 1 ListBox1.list(i, 1) = ActiveCell.Offset(0, 1) ListBox1.list(i, 2) = ActiveCell.Offset(0, 2) ListBox1.list(i, 3) = ActiveCell.Offset(0, 3) ListBox1.list(i, 4) = ActiveCell.Offset(0, 4) ListBox1.list(i, 5) = ActiveCell.Offset(0, 5) ListBox1.list(i, 6) = ActiveCell.Offset(0, 6) ListBox1.list(i, 7) = ActiveCell.Offset(0, 7) ListBox1.list(i, 8) = ActiveCell.Offset(0, 8) ListBox1.list(i, 9) = ActiveCell.Offset(0, 9) ActiveCell.Offset(1, 0).Select Loop Me.Label10.Caption = Format(ListBox1.ListCount, "00") Range("a3").Select txt_Buscar.SetFocus End Sub
hice un reboltijo
este codigo carga el listbox
Private Sub Entradas()
Application.ScreenUpdating = False
Sheets("Entradas2").Select
'Call QuitabotonX(Me.Caption)
'Le digo cuántas columnas
ListBox1.ColumnCount = 9
'Asigno el ancho a cada columna
Me.ListBox1.ColumnWidths = "200 pt;49,95 pt;92 pt;70 pt;30 pt;30 pt;49,95 pt;70 pt;100 pt"
'El origen de los datos es la Tabla1
'ListBox1.RowSource = "Tabla7"
y de alli selecciono el item del listbox y continua el codigo que escribi al principio arriba
los items estan repetidos pero algunos datos en las demas columnas pueden variar
Do While ActiveCell.Value <> ""
ListBox1.AddItem ActiveCell
i = ListBox1.ListCount - 1
ListBox1.list(i, 1) = ActiveCell.Offset(0, 1)
ListBox1.list(i, 2) = ActiveCell.Offset(0, 2)
ListBox1.list(i, 3) = ActiveCell.Offset(0, 3)
ListBox1.list(i, 4) = ActiveCell.Offset(0, 4)
ListBox1.list(i, 5) = ActiveCell.Offset(0, 5)
ListBox1.list(i, 6) = ActiveCell.Offset(0, 6)
ListBox1.list(i, 7) = ActiveCell.Offset(0, 7)
ListBox1.list(i, 8) = ActiveCell.Offset(0, 8)
ListBox1.list(i, 9) = ActiveCell.Offset(0, 9)
ActiveCell.Offset(1, 0).Select
Loop
Me.Label10.Caption = Format(ListBox1.ListCount, "00")
Range("a3").Select
txt_Buscar.SetFocus
End Sub
este busca por medio de un text box
Private Sub txt_Buscar_Change()
Dim encontrado As Range
Me.ListBox1.Clear
j = 1
items = Range("A" & Rows.Count).End(xlUp).Row
Ctrl = True
For i = 3 To items
If LCase(Cells(i, 1).Value) Like "*" & LCase(Me.txt_Buscar.Value) & "*" Then
Me.ListBox1.AddItem Cells(i, 1)
Me.ListBox1.list(Me.ListBox1.ListCount - 1, 1) = Cells(i, 2)
Me.ListBox1.list(Me.ListBox1.ListCount - 1, 2) = Cells(i, 3)
Me.ListBox1.list(Me.ListBox1.ListCount - 1, 3) = Cells(i, 4)
Me.ListBox1.list(Me.ListBox1.ListCount - 1, 4) = Cells(i, 5)
Me.ListBox1.list(Me.ListBox1.ListCount - 1, 5) = Cells(i, 6)
Me.ListBox1.list(Me.ListBox1.ListCount - 1, 6) = Cells(i, 7)
Me.ListBox1.list(Me.ListBox1.ListCount - 1, 7) = Cells(i, 8)
Me.ListBox1.list(Me.ListBox1.ListCount - 1, 8) = Cells(i, 9)
Ctrl = False
End If
Next i
'Call enter
Me.Label10.Caption = Format(ListBox1.ListCount, "00")
If Ctrl And Not IsEmpty(Trim(Me.txt_Buscar)) Then
MsgBox "Nombre No Registrado", vbInformation + vbOKOnly, "Sr. Operador"
txt_Buscar.SetFocus
End If
End Sub
Ahora tengo otras dudas:
1. ListBox1.RowSource = "Tabla7". ¿La "Tabla7" es una tabla o un nombre de rango?
2. ¿Entonces estás haciendo un filtro y luego cargas en el listbox?
3. Entonces después de hacer el filtro, ¿es cuándo seleccionas un item del listbox?
4. Podrías pegar aquí todo tu código del userform. Utiliza el icono para insertar código.
Recomendación:
Utiliza sangrías en tu código, es más fácil de leer y de entender, ejemplo:
Sub Suma() Dim h1 As Worksheet, h As Worksheet, fila As Long ' Application.ScreenUpdating = False Set h1 = Sheets("Recollect") h1.Rows("2:" & Rows.Count).ClearContents fila = 2 ' For Each h In Sheets Select Case UCase(h.Name) Case "OVERALL", "ORIGINAL", "OVERRIDES", "DATA", "RECOLLECT" Case Else If h.[D2] = 5 Then h1.Range("A" & fila) = h.[D2] h1.Range("B" & fila) = WorksheetFunction.Sum(h.[D10:D20]) End If fila = fila + 1 End Select Next MsgBox "Done!" End Sub
Nota: solamente es un ejemplo para que observes cómo se utiliza la sangría en las líneas.
esta un poco desordenado lo que escribi
respuestas
1. pregunta uno es no
2. segunda pregunta - primero se carga el listbox, para elegir un item no necesariamente lo filtro, lo que pasa es que son tantos datos que a veces tengo que filtrar para encontrarlo
3. tercer pregunta- misma respuesta que la anterior.
Este codigo carga el listbox Private Sub Entradas() Application.ScreenUpdating = False Sheets("Entradas2").Select ListBox1.ColumnCount = 9 Me.ListBox1.ColumnWidths = "200 pt;49,95 pt;92 pt;70 pt;30 pt;30 pt;49,95 pt;70 pt;100 pt" Do While ActiveCell.Value <> "" ListBox1.AddItem ActiveCell i = ListBox1.ListCount - 1 ListBox1.list(i, 1) = ActiveCell.Offset(0, 1) ListBox1.list(i, 2) = ActiveCell.Offset(0, 2) ListBox1.list(i, 3) = ActiveCell.Offset(0, 3) ListBox1.list(i, 4) = ActiveCell.Offset(0, 4) ListBox1.list(i, 5) = ActiveCell.Offset(0, 5) ListBox1.list(i, 6) = ActiveCell.Offset(0, 6) ListBox1.list(i, 7) = ActiveCell.Offset(0, 7) ListBox1.list(i, 8) = ActiveCell.Offset(0, 8) ListBox1.list(i, 9) = ActiveCell.Offset(0, 9) ActiveCell.Offset(1, 0).Select Loop End Sub Este codigo es para filtrar Private Sub txt_Buscar_Change() Dim encontrado As Range Me.ListBox1.Clear j = 1 items = Range("A" & Rows.Count).End(xlUp).Row Ctrl = True For i = 3 To items If LCase(Cells(i, 1).Value) Like "*" & LCase(Me.txt_Buscar.Value) & "*" Then Me.ListBox1.AddItem Cells(i, 1) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 1) = Cells(i, 2) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 2) = Cells(i, 3) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 3) = Cells(i, 4) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 4) = Cells(i, 5) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 5) = Cells(i, 6) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 6) = Cells(i, 7) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 7) = Cells(i, 8) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 8) = Cells(i, 9) Ctrl = False End If Next i Me.Label10.Caption = Format(ListBox1.ListCount, "00") If Ctrl And Not IsEmpty(Trim(Me.txt_Buscar)) Then MsgBox "Nombre No Registrado", vbInformation + vbOKOnly, "Sr. Operador" txt_Buscar.SetFocus End If End Sub Este codigo con doble click me manda al userform donde muestra al item del listbox seleccionado Private Sub ListBox1_dblClick(ByVal Cancel As MSForms.ReturnBoolean) UserForm4.Show End Sub El siguiente codigo esta en el userform donde me carga los datos del item seleccionado del listbox en textbox Para luego hacerle modificaciones. 'Actualizar el registro Private Sub CommandButton3_Click() For i = 1 To 9 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
disculpa el desorden
Sigo sin entender algunas cosas.
Tienes este procedimiento:
Private Sub Entradas()
Pero en ninguna parte de tu código veo que lo llames.
Entonces sigo sin entender cómo cargas el listbox.
Perdona que insista en saber cómo cargas el listbox, pero ese proceso es vital, si cargas registros duplicados o cargas el listbox con filtro, entonces es necesario conocer cuál registro del listbox corresponde a cuál fila de la hoja.
Entonces cuando realizas la carga, se debe almacenar en el registro del listbox el número de fila correspondiente.
De esa manera cuando seleccionas un registro del listbox con doble clic, consultas el número de fila, conociendo el número de fila, puedes ir a la hoja y tomar los datos o poner los datos según el número de fila.
Private Sub Entradas() Application.ScreenUpdating = False Sheets("Entradas2").Select ListBox1.ColumnCount = 9 Me.ListBox1.ColumnWidths = "200 pt;49,95 pt;92 pt;70 pt;30 pt;30 pt;49,95 pt;70 pt;100 pt" Do While ActiveCell.Value <> "" ListBox1.AddItem ActiveCell i = ListBox1.ListCount - 1 ListBox1.list(i, 1) = ActiveCell.Offset(0, 1) ListBox1.list(i, 2) = ActiveCell.Offset(0, 2) ListBox1.list(i, 3) = ActiveCell.Offset(0, 3) ListBox1.list(i, 4) = ActiveCell.Offset(0, 4) ListBox1.list(i, 5) = ActiveCell.Offset(0, 5) ListBox1.list(i, 6) = ActiveCell.Offset(0, 6) ListBox1.list(i, 7) = ActiveCell.Offset(0, 7) ListBox1.list(i, 8) = ActiveCell.Offset(0, 8) ListBox1.list(i, 9) = ActiveCell.Offset(0, 9) ActiveCell.Offset(1, 0).Select Loop End Sub
este carga el listbox
Entradas()
¿Pero cómo lo ejecutas?
¿Lo ejecutas con un commandbutton?
Revisaste todo lo que escribí, ¿crees qué con eso puedas adaptar tu código?
Entonces cuando realizas la carga, se debe almacenar en el registro del listbox el número de fila correspondiente.
De esa manera cuando seleccionas un registro del listbox con doble clic, consultas el número de fila, conociendo el número de fila, puedes ir a la hoja y tomar los datos o poner los datos según el número de fila.
perdon
tengo un boton
Private Sub CommandButton5_Click()
Me.ListBox1.Clear
ThisWorkbook.Application.Visible = True
Sheets("Entradas2").Activate
Me.txt_Buscar = ""
Range("A3").Select
Me.txt_Buscar.SetFocus
Me.txt_Buscar.SelLength = Len(Me.txt_Buscar.Text)
ActiveWindow.DisplayHeadings = False
Call Entradas "AQUI LLAMO AL CODIGO ANTERIOR PARA QUE SE CARGUE EL LISTBOX"
txt_Buscar.SetFocus
End Sub
1. Podrías seguir las recomendaciones que te puse, de otra manera no es posible que yo pueda darte una solución:
4. Podrías pegar aquí todo tu código del userform. Utiliza el icono para insertar código.Recomendación:
Utiliza sangrías en tu código, es más fácil de leer y de entender
2. Revisaste todo lo que escribí, ¿crees qué con eso puedas adaptar tu código?
Entonces cuando realizas la carga, se debe almacenar en el registro del listbox el número de fila correspondiente.
De esa manera cuando seleccionas un registro del listbox con doble clic, consultas el número de fila, conociendo el número de fila, puedes ir a la hoja y tomar los datos o poner los datos según el número de fila.
sabes que
yo no soy experto en esto por eso pido ayuda, lo he explicado y he subido el mismo codigo varias veces.
te agradezco el tiempo pero no veo como explicarme mejor.
Solamente te pedí que pusieras aquí todo tu código, pero lo pones en pedazos y no lo pones completo.
Yo te ayudo con el código, pero debes poner todo el código, para ti es obvio porque lo estás viendo, pero yo no puedo verlo, por eso te pido que pongas todo tu código.
Si no puedes ajustar el código, solamente comentas que no puedes adaptarlo y yo te ayudo, pero te pregunté 3 veces y no contestas, tampoco puedo adivinar si puedes hacerlo o no.
Y sigues sin poner todo el código.
te agradezco el tiempo pero no veo como explicarme mejor.
No te estoy pidiendo ninguna explicación, solamente quiero que pongas todo el código y utiliza el icono para inserta código.
disculpame por lo de ayer
Private Sub CommandButton5_Click() ThisWorkbook.Application.Visible = True Sheets("Entradas2").Activate Call Entradas txt_Buscar.SetFocus ‘textbox con el cual filtro End Sub ‘--------------------------------------------- Private Sub Entradas() Application.ScreenUpdating = False Sheets("Entradas2").Select ListBox1.ColumnCount = 9 Me.ListBox1.ColumnWidths = "200 pt;49,95 pt;92 pt;70 pt;30 pt;30 pt;49,95 pt;70 pt;100 pt" Do While ActiveCell.Value <> "" ListBox1.AddItem ActiveCell i = ListBox1.ListCount - 1 ListBox1.list(i, 1) = ActiveCell.Offset(0, 1) ListBox1.list(i, 2) = ActiveCell.Offset(0, 2) ListBox1.list(i, 3) = ActiveCell.Offset(0, 3) ListBox1.list(i, 4) = ActiveCell.Offset(0, 4) ListBox1.list(i, 5) = ActiveCell.Offset(0, 5) ListBox1.list(i, 6) = ActiveCell.Offset(0, 6) ListBox1.list(i, 7) = ActiveCell.Offset(0, 7) ListBox1.list(i, 8) = ActiveCell.Offset(0, 8) ListBox1.list(i, 9) = ActiveCell.Offset(0, 9) ActiveCell.Offset(1, 0).Select Loop Range("a3").Select txt_Buscar.SetFocus End Sub ‘------------------------------------ Private Sub txt_Buscar_Change() Dim encontrado As Range Me.ListBox1.Clear j = 1 items = Range("A" & Rows.Count).End(xlUp).Row Ctrl = True For i = 3 To items If LCase(Cells(i, 1).Value) Like "*" & LCase(Me.txt_Buscar.Value) & "*" Then Me.ListBox1.AddItem Cells(i, 1) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 1) = Cells(i, 2) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 2) = Cells(i, 3) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 3) = Cells(i, 4) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 4) = Cells(i, 5) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 5) = Cells(i, 6) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 6) = Cells(i, 7) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 7) = Cells(i, 8) Me.ListBox1.list(Me.ListBox1.ListCount - 1, 8) = Cells(i, 9) Ctrl = False End If Next i Me.Label10.Caption = Format(ListBox1.ListCount, "00") If Ctrl And Not IsEmpty(Trim(Me.txt_Buscar)) Then MsgBox "Nombre No Registrado", vbInformation + vbOKOnly, "Sr. Operador" txt_Buscar.SetFocus End If End Sub ‘-------------------------------------- Private Sub ListBox1_dblClick(ByVal Cancel As MSForms.ReturnBoolean) UserForm4.Show End Sub ‘------------------------------------- ‘En el userform Private Sub UserForm_Initialize() For i = 1 To 10 Me.Controls("TextBox" & i).Value = ActiveCell.Offset(0, i - 1).Value Next i End Sub ‘---------------------------------------- Private Sub CommandButton3_Click() For i = 1 To 10 ActiveCell.Offset(0, i - 1).Value = Me.Controls("TextBox" & i).Value Next i Unload Me End Sub
Te regreso todo el código, el cual reemplaza todo tu código.
De esta manera, no es necesario seleccionar la hoja, ni tampoco es necesario seleccionar la fila.
Nota: La variable "Public sh" debe ir en el userform1 al inicio de todo el código.
En el UserForm1 pon el siguiente código:
Public sh As Worksheet 'esta línea va al inicio de todo el código ' Private Sub CommandButton5_Click() 'ThisWorkbook.Application.Visible = True Call Entradas txt_Buscar.SetFocus 'textbox con el cual filtro End Sub '--------------------------------------------- Private Sub Entradas() Dim i As Long, j As Long With ListBox1 .Clear For i = 3 To sh.Range("A" & Rows.Count).End(3).Row If LCase(sh.Range("A" & i).Value) Like "*" & LCase(Me.txt_Buscar.Value) & "*" Then .AddItem sh.Range("A" & i).Value For j = 1 To 8 .List(.ListCount - 1, j) = sh.Cells(i, j + 1) Next .List(.ListCount - 1, 9) = i 'guardamos el número de fila en la columna 9 End If Next End With End Sub '------------------------------------ Private Sub txt_Buscar_Change() Call Entradas End Sub '-------------------------------------- Private Sub ListBox1_dblClick(ByVal Cancel As MSForms.ReturnBoolean) UserForm4.Show End Sub '-------------------------------------- Private Sub UserForm_Initialize() Set sh = Sheets("Entradas2") With ListBox1 .ColumnCount = 9 .ColumnWidths = "200 pt;49,95 pt;92 pt;70 pt;30 pt;30 pt;49,95 pt;70 pt;100 pt" End With End Sub
Pon el siguiente código en el UserForm4:
Private Sub UserForm_Initialize() Dim fila As Long, i As Long fila = UserForm1.ListBox1.List(UserForm1.ListBox1.ListIndex, 9) 'recupera número de fila For i = 1 To 10 Me.Controls("TextBox" & i).Value = UserForm1.sh.Cells(fila, i).Value Next i End Sub '---------------------------------------- Private Sub CommandButton3_Click() Dim fila As Long, i As Long fila = UserForm1.ListBox1.List(UserForm1.ListBox1.ListIndex, 9) 'recupera número de fila For i = 1 To 10 UserForm1.sh.Cells(fila, i).Value = Me.Controls("TextBox" & i).Value Next i Unload Me End Sub
Prueba y me comentas.
me sale error
en esta linea
For i = 3 To sh.Range("A" & Rows.Count).End(3).Row
se ha producido el error '91' en tiempo de ejecucion
variable de objeto o bloque With no establecido
Dim i As Long, j As Long With ListBox1 .Clear For i = 3 To sh.Range("A" & Rows.Count).End(3).Row ' aqui me sale eror If LCase(sh.Range("A" & i).Value) Like "*" & LCase(Me.txt_Buscar.Value) & "*" Then .AddItem sh.Range("A" & i).Value For j = 1 To 8 .list(.ListCount - 1, j) = sh.Cells(i, j + 1) Next .list(.ListCount - 1, 9) = i 'guardamos el número de fila en la columna 9 End If Next End With
¿Modificaste algo en la macro?
¿Algún otro código que no me hayas mostrado?
Pusiste le código en el userform1
Y la segunda parte en el userform4
Te anexo mi archivo de ejemplo para que veas el funcionamiento y lo compares con tu archivo.
https://drive.google.com/file/d/1PmePdxMYNGyHXXCJk84d9FqLzEzwgp8u/view?usp=sharing
- Compartir respuesta