Eliminar datos de un Textbox con el evento Keypress

Para Elsa Matilde:

Estoy realizando una cotización, allí hay un listbox que permite observar en tiempo real cómo está quedando la cotización (la cotización es de 2 páginas), pero necesito que al elegir un producto del listbox, al presionar la tecla SUPR pueda borrar el Item seleccionado. Lo que requiero específicamente es lo siguiente:

- Elegir un producto de cualquiera de las 2 páginas y al presionar la tecla SUPR lo pueda eliminar.

- Luego de eliminar el producto, que se inserte una nueva fila en la página donde se eliminó (Pág. 1 o 2)

- Que vuelva a realizar cálculos de multiplicar una cantidad por el producto en la fila que se insertó sin importar la página (Columnas D y E en la hoja de cálculo).

- Que vuelva a calcular el total de la cotización sin importar la página (1 o 2).

Ya tengo un código que desde un botón elimina el producto elegido, inserta una fila y calcula el total pero sólo de la página 1.

On Error Resume Next
Dim a As Worksheet, codigo As Range
  Dim fila As Long, filaedit As Long, dire As Long
  Dim cod As Variant, rpta As Variant, Cancel As Boolean
  Dim shp As Shape
  Set a = Sheets("formato")
  filaedit = a.Range("C" & Rows.Count).End(xlUp).Row 'Variable que busca ultima fila con datos
  fila = ListBox1.ListIndex 'Variable que indica el indice del dato a buscar
  cod = cotizaciones.ListBox1.List(fila, 1) 'Variable que busca el dato exacto que esta en el listbox y en excel
    Set codigo = a.Range("C20:C" & filaedit).Find(cod, LookIn:=xlValues, LookAt:=xlWhole) 'busca el dato en Excel, coincidente con el del listbox
    If Not codigo Is Nothing Then 'Si el renglon no esta vacío
      dire = codigo.Row 'Fila exacta donde se encontró el dato
'Elimina objetos como imágenes, formas
      For Each shp In a.Shapes
        If Not Intersect(shp.TopLeftCell, a.Cells(dire, "G")) Is Nothing Then
          shp.Delete
    End If
    Next
    a.Cells(dire, "C").EntireRow.Delete 'Elimina la fila buscada de la hoja de calculo
'Va al final de los datos e inserta una fila
Range("B20").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Select
Selection.EntireRow.Insert
'vuelve a calcular la suma
Range("F29").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
End If

2 Respuestas

Respuesta
1

Si aún tengo tu libro de ejemplo ya revisaré tu macro, sino te lo solicitaré nuevamente.

Como te adelanté por correo está muy complicado revisar tu libro con tanto código y tan poca información de los procesos.

Aclara por favor si necesitas eliminar un item del listbox a medida que lo llenas (antes de guardarlo) o en el proceso de 'Buscar Cotización'.

Si se trata de primer caso, te recomiendo el evento BeforeDoubleClick del listbox, evaluando previamente si se trata de una fila con datos:

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'controlamos que se haya seleccionado algún elemento de la lista
If ListBox1.ListIndex >= 0 Then ListBox1.RemoveItem (ListBox1.ListIndex)
End Sub

Pero si rellenaste la lista con instrucción del tipo: ListBox1.RowSource = "form_cotiza4" como sucede en el proceso Buscar Cotización, primero habrá que eliminar el item del rango y luego asignar nuevamente la propiedad RowSource. Y para esto se requiere conocer el rango... la hoja y alguna cotización ya guardada que se rellene en las 2 páginas para realizar la prueba.

PD) Si me vuelves a enviar un libro que tenga inhabilitada la instrucción que oculta la aplicación...

Aquí dejo la macro que realiza las 3 tareas solicitadas. En el libro te marqué las subrutinas en las que también hay que agregar alguna que otra instrucción, como indicar el nro de página activa. NO olvides agregar el control de items por página (ya comentado en correo anterior).

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)  'x Elsamatilde
'controlamos que se haya seleccionado algún elemento de la lista
If ListBox1.ListIndex < 0 Then Exit Sub
'el nro de item indicará el nro de página donde se encuentre
filx = ListBox1.ListIndex    'si filx = 0, filc = 21
'la variable indica en qué página se están moviendo las entradas.Es compartida con otros procesos dentro del mismo UF
If pagx = 0 Then
    pag = 1: filc = 21 + filx:  finx = 27   'finx =  ultima fila del rango luego de eliminar
Else
    pag = 2: filc = 57 + filx:   finx = 63
End If
'confirmar
rpta = MsgBox("Esta seguro que desea Eliminar " & cod & " del Formato de Cotización?", vbYesNo, "Advertencia")
If rpta <> vbYes Then Exit Sub
With Sheets("formato")
    'se elimina la fila de la hoja Formato
    .Range("A" & filc).EntireRow.Delete
    'y se agrega otra al final del rango con fórmula en col F
    .Range("A" & finx).EntireRow.Copy
    .Range("A" & finx + 1).Insert Shift:=xlDown
    .Range("B" & finx + 1 & ":E" & finx + 1).ClearContents
    'vuelve a calcular la suma del total
    .Range("F" & finx + 2).FormulaR1C1 = "=SUM(R[-8]C:R[-1]C)"
End With
'se quita el registro del control Lista
If ListBox1.ListIndex >= 0 Then ListBox1.RemoveItem (ListBox1.ListIndex)
'falta proceso de las imágenes.
'para quitar la selección
ListBox1.ListIndex = -1
End Sub

Sdos y no olvides valorar esta respuesta. 

Respuesta
1

[E stimado, tienes pendiente valorar respuestas:

Problema para exportar a PDF en Excel VBA

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas