Eliminar un item en un ListBox seleccionándolo y apretándo la tecla Delete

07/06/2007 - 00:48 por Insumos | Informe spam
Hola Gente del Foro:

Supongamos que tengo un ListBox con varios items. Yo selecciono un item
mediante el mouse. Es posible borrar dicho item del ListBox (vía código)
apretando la tecla, por ejemplo, "Delete" o "Suprimir", y que en el ListBox
luego quede solo con los demás items? Y es posible, de paso, eliminar de una
hoja un registro que este asociado a dicho item todo con el mismo
procedimiento?
Se me ocurre que tal vez puede ser un código del tipo Private Sub
ListBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) en el que al
apretrar la tecla con un valor Ascii determinado haga lo que yo quiera. De
todas maneras es solo una idea ya que no se me ocurre como escribir bien el
código.
Desde ya muchas gracias!

Mariano

CONTADURIA

Preguntas similare

Leer las respuestas

#1 Ivan
07/06/2007 - 01:15 | Informe spam
hola Mariano,

para la 1ª parte de tu consulta, eliminar un item del listbox, una
forma podria ser esta:

Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,
ByVal Shift As Integer)
With ListBox1
If .ListIndex > -1 Then If KeyCode = 46
Then .RemoveItem .ListIndex
End With
End Sub

OJO: echa un vistazo a la ayuda de RemoveItem por si tuvieras algun
posible inconveniente

para la 2ª parte creo que quizas deberias aportar mas datos, sobre
todo como cargas el listbox y su relacion con los campos de la hoja,
pero no creo que tengas ningun problema. Simplemente deberias añadir
la instruccion que eliminara el registro de la hoja (aqui depende de
lo que te comentaba, podrias usar find, el nº de fila, .) si se
cumple el condicional doble (.listindex y keycode)

espero te ayde

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Ivan
07/06/2007 - 01:51 | Informe spam
On 7 jun, 01:15, Ivan wrote:
hola Mariano,

para la 1ª parte de tu consulta, eliminar un item del listbox, una
forma podria ser esta:

Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,
ByVal Shift As Integer)
With ListBox1
If .ListIndex > -1 Then If KeyCode = 46
Then .RemoveItem .ListIndex
End With
End Sub

OJO: echa un vistazo a la ayuda de RemoveItem por si tuvieras algun
posible inconveniente

para la 2ª parte creo que quizas deberias aportar mas datos, sobre
todo como cargas el listbox y su relacion con los campos de la hoja,
pero no creo que tengas ningun problema. Simplemente deberias añadir
la instruccion que eliminara el registro de la hoja (aqui depende de
lo que te comentaba, podrias usar find, el nº de fila, .) si se
cumple el condicional doble (.listindex y keycode)

espero te ayde

un saludo
Ivan



hola de nuevo, Mariano

como siempre no puedo evitar hacer una ristra de mensajes

en este caso, el codigo funciona bien, pero te convendria tener (al
menos) un par de cosas en cuenta:

1ª) al eliminar el registro del listbox el listindex seguiria siendo
el mismo, o en caso de ser el ultimo registro pasaria a ser el previo,
con lo que si vuelves a dar a supr se volveria a eliminar el siguiente
o el anterior registro, aunque tun no lo hubieras seleccionado
directamente. Si esto no te conviniera puedes poner el listindex a -1
tras eliminar el item->

If .ListIndex > -1 And KeyCode = 46
Then .RemoveItem .ListIndex: .ListIndex = -1

2ª) en caso de ser de seleccion multiple y querer eliminar todos los
seleccionados deberias/podrias hacer un bucle inverso en busca de la
propiedad selected. pej. algo asi

For n = .Listcount - 1 to 0
if .selected(n) then .removeitem n
next

no lo he probado pero creo recordar que se hacia algo parecido

un saludo
ivan
Respuesta Responder a este mensaje
#3 Insumos
11/06/2007 - 17:48 | Informe spam
Hola Ivan:

Muchisimas gracias!! Otra vez tu solución era exactamente lo que buscaba.
Te cuento que el código lo necesitaba porque el ListBox funciona como una
especie de pantalla de previsualización de datos antes de cargarlos a una
base, o sea que el usuario va ingresando registros que corresponden a un
mismo conjunto (que en este caso son datos de arqueos de sucursales por día)
completando distintos campos a través de varios combobox y textbox, cada vez
que completa un registro que corresponde a un arqueo lo ingresa
"transitoriamente" por medio de un CommandButton al ListBox1. Una vez que el
usuario ingresó todos los registros que corresponden a ese arqueo, estos
están todos expuestos en el ListBox1 (que sirve para hacer un control
visual) para que de ahi con otro CommandButton los ingrese a la base de
datos propiamente dicha. En realidad los registros "transitorios" van siendo
volcados a una hoja "transitoria" a medida que van siendo ingresados y
luego, cuando se confirma su ingreso definitivo a la base, se copian de esa
hoja transitoria a continuación de la base definitiva y se borran de la hoja
transitoria.
Ahora, lo que me solucionó el código que me enviaste es la necesidad que
tiene el usuario de que si se equivoca al ingresar un registro, y se percata
de ello al ver la previsualización de registros en el ListBox, puede borrar
ese registro del ListBox y volver a ingresarlo correctamente. Pude
relacionar el item del ListBox con el registro transitorio en la hoja
mediante el número de ListIndex seleccionado.
El problema que se me presentó luego es que, si por ejemplo el usuario
ingresaba 3 registros, y borraba el segundo, el tercero pasaba a tener el
list index del que era segundo (lo cual es lógico porque pasaba a ser el
segundo), por lo que si luego borraba el tercero (que ahora es el segundo)
lo borraba del ListBox pero no borraba el registro asociado en la hoja. Esto
lo solucioné haciendo que el código "corra" para arriba todos los registros
asociados en la hoja de cálculo cuando se borraba algun registro del
ListBox, para que la fila en que está cada uno vuelva a coincidir con el
ListIndex correspondiente.
Incluyo el código abajo por si a alguien le sirve. (Aclaración: El ListBox
tiene un límite de 19 registros que se pueden ingresar, por eso es que se
"corren" para arriba 19 filas en la hoja).
Muchas gracias otra vez!
Saludos!!

Mariano

Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)

Dim fila As Integer

With ListBox1
If .ListIndex > -1 Then
fila = ListBox1.ListIndex + 2
If KeyCode = 46 Then
.RemoveItem .ListIndex
With Worksheets("Datos")
Range(Cells(fila, 91), Cells(fila, 97)).ClearContents
Range(Cells(fila + 1, 91), Cells(fila + 19, 97)).Copy
Range(Cells(fila, 91), Cells(fila, 97)).PasteSpecial
xlPasteValues
Cells(4, 4).Activate
Label23 = Format(Worksheets("Parámetros").Range("B1").Value,
"#,##0.00")
End With
End If
End If
End With
End Sub



"Ivan" escribió en el mensaje
news:
On 7 jun, 01:15, Ivan wrote:
hola Mariano,

para la 1ª parte de tu consulta, eliminar un item del listbox, una
forma podria ser esta:

Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,
ByVal Shift As Integer)
With ListBox1
If .ListIndex > -1 Then If KeyCode = 46
Then .RemoveItem .ListIndex
End With
End Sub

OJO: echa un vistazo a la ayuda de RemoveItem por si tuvieras algun
posible inconveniente

para la 2ª parte creo que quizas deberias aportar mas datos, sobre
todo como cargas el listbox y su relacion con los campos de la hoja,
pero no creo que tengas ningun problema. Simplemente deberias añadir
la instruccion que eliminara el registro de la hoja (aqui depende de
lo que te comentaba, podrias usar find, el nº de fila, .) si se
cumple el condicional doble (.listindex y keycode)

espero te ayde

un saludo
Ivan



hola de nuevo, Mariano

como siempre no puedo evitar hacer una ristra de mensajes

en este caso, el codigo funciona bien, pero te convendria tener (al
menos) un par de cosas en cuenta:

1ª) al eliminar el registro del listbox el listindex seguiria siendo
el mismo, o en caso de ser el ultimo registro pasaria a ser el previo,
con lo que si vuelves a dar a supr se volveria a eliminar el siguiente
o el anterior registro, aunque tun no lo hubieras seleccionado
directamente. Si esto no te conviniera puedes poner el listindex a -1
tras eliminar el item->

If .ListIndex > -1 And KeyCode = 46
Then .RemoveItem .ListIndex: .ListIndex = -1

2ª) en caso de ser de seleccion multiple y querer eliminar todos los
seleccionados deberias/podrias hacer un bucle inverso en busca de la
propiedad selected. pej. algo asi

For n = .Listcount - 1 to 0
if .selected(n) then .removeitem n
next

no lo he probado pero creo recordar que se hacia algo parecido

un saludo
ivan
Respuesta Responder a este mensaje
#4 Ivan
12/06/2007 - 03:23 | Informe spam
hola Mariano,

me alegro lo hayas apañado, pero

lo solucioné haciendo que el código "corra" para arriba todos los registros



¿has probado simplemente Rows(fila).delete o parecido? creo que podria valerte

un saludo
Ivan
Respuesta Responder a este mensaje
#5 Insumos
13/06/2007 - 18:42 | Informe spam
Hola Ivan:

Una vez más tenías razón. Prové tu sugerencia poniendo esta línea:

Range(Cells(fila, 91), Cells(fila, 97)).Delete

en lugar de:

Range(Cells(fila, 91), Cells(fila, 97)).ClearContents
Range(Cells(fila + 1, 91), Cells(fila + 19, 97)).Copy
Range(Cells(fila, 91), Cells(fila, 97)).PasteSpecial

y obtengo el mismo resultado!! Y (como dicen por acá) me sale mucho más
barato, verdad?
Muchas gracias otra vez.
Saludos!!

Mariano



"Ivan" escribió en el mensaje
news:
hola Mariano,

me alegro lo hayas apañado, pero

> lo solucioné haciendo que el código "corra" para arriba todos los


registros

¿has probado simplemente Rows(fila).delete o parecido? creo que podria


valerte

un saludo
Ivan


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida