Eliminar filas escogidas en un combobox

14/10/2008 - 01:21 por GRIEGO59 | Informe spam
Hola!

En un formulario tengo un combobox llamado Productos que selecciona
productos de una hoja llamada FichaTécnica.

A medida que se seleccionan los productos en el combobox, los productos van
apareciendo secuencialmente en siete textbox llamados textbox1, textbox2 ...
textbox7.

Es posible que al presionar un botón llamado guardar, se eliminen de la hoja
FhichaTécnica, la(s) fila(s) seleccionadas en el combobox Productos?

La hoja FichaTécnica tiene las siguientes columnas:
Código, Descripción, Color, Ubicación.
La primera fila es de títulos.
Los códigos (productos) pueden repetirse en la hoja FichaTécnica y no están
en orden correlativo.

El código del combobox Productos es:

Private Sub Productos_Change()
dim n as integer
for n = 1 to 7
if me.controls("TextBox" & n).Text = "" then _
me.controls("TextBox" & n).Text = Productos.Value: Exit for
next
End Sub

La cantidad de productos a seleccionar con el combobox depende del estado de
ánimo del cliente que compra los productos, pero nunca será mayor de siete.

Si el cliente que compra los productos cambia de opinión antes de presionar
el botón Guardar, puede hacer modificaciones a su pedido antes de presionar
el botón guardar

Uso Excel 2003.

Gracias por su ayuda,
Darío.
 

Leer las respuestas

#1 Ivan
14/10/2008 - 03:09 | Informe spam
hola Dario,


...al presionar un botón llamado guardar, se eliminen de la hoja
FhichaTécnica, la(s) fila(s) seleccionadas en el combobox Productos?

La primera fila es de títulos.
Los códigos (productos) pueden repetirse en la hoja FichaTécnica y no están
en orden correlativo.



=>como requisito previo =>

.-> suponiendo que cargas el combo con 'List' y con todos los
registros de la hoja [como creo recordar del otro hilo],

.-> y que no realizas modificaciones en el orden y/o cantidad de
elementos de la hoja entre la ultima carga del combo y la pulsacion
del boton

a) si 'solo' quisieses eliminar la fila del producto seleccionado en
el combo te bastaria con algo tipo =>

worksheets("FichaTécnica").rows(tuCombobox.listindex + 2).delete

b) pero como incluyes un/os plural/es, y dado que, si no recuerdo mal,
los combobox de vba no tienen la propiedad multiselect, unido a que
comentas que los codigos pueden estar duplicados en la hoja, creo que
=>

una posible solucion seria cargar en algun sitio el nº de fila de cada
elemento segun cargues cada textbox (pej. en el Tag de cada textbox, o
en una matriz, o en ...) y recorrelo con un bucle al pulsar el boton,
eliminando las filas correspondientes.

aunque OJO, como los textbox no tendrian que cargarse necesariamente
en un orden 'creciente' (en lo que a nº de fila se refiere), antes de
proceder a la eliminacion deberias asegurarte de que esta se hace en
orden inverso, es decir del nº de fila mas alto al mas bajo, para lo
que deberias usar alguna forma de ordenacion previa o durante el bucle

pej., suponiendo que has ido cargando en el tag de cada textbox
el .listindex del combo con cada producto cargado, pej. con algo
parecido a esto dentro del mismo bucle que carga los textbox =>

Me.Controls("TextBox" & n).Tag = ComboBox1.ListIndex

puedes poner esto en el boton (pero OJO, deberias borrar los textbox,
o al menos el tag, cada vez que elimines las filas (tambien deberias
actualizar el combo))

Private Sub CommandButton1_Click()
Dim f As Long, max As Long, cont As Byte, n As Byte
max = ComboBox1.ListCount
cont = 0
Do
f = -1
For n = 1 To 7
With Me.Controls("TextBox" & n)
If .Tag > f And .Tag < max Then _
f = .Tag
End With
Next
If f > -1 Then Worksheets("FichaTécnica").Rows(f + 2).Delete
max = f
Loop Until max = -1
borrarTxts
cargarCombo ComboBox1, "FichaTécnica"
End Sub

' Para borrar los textbox
'
Sub borrarTxts()
Dim n As Byte
For n = 1 To 7
With Me.Controls("TextBox" & n)
.Text = ""
.Tag = ""
End With
Next
End Sub

' Para volver a cargar el combo
'
Sub cargarCombo(ByRef combo As ComboBox, ByVal hj As String)
Dim rng As Range
Set rng = Worksheets(hj).[a1].CurrentRegion
With combo
.Clear
.List = rng.Offset(1).Resize(rng.Rows.Count - 1, _
rng.Columns.Count).Value
End With
Set rng = Nothing
End Sub

OJO: en los ej. el combo se llama CombBox1

puedes inhabilitar el refresco de pantella (application.screenUpdating
= false) al principio del procedimiento del boton y habilitarlo al
final, aunque con 7 filas solo tampoco creo que se note mucho

lo dicho, solo alguna posibilidad

espero te ayude

Un saludo
Ivan

Preguntas similares