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.

Preguntas similare

Leer las respuestas

#6 Ivan
14/10/2008 - 17:43 | Informe spam
hola de nuevo (jod..., no hay manera, no se como lo hago, pero al
final siempre acabo mandando tropecientos mensajes. ...Sorry)

al final, con tanto rollo se me ha olvidado esto =>

[..., en este caso no haria falta 'recargar' el combo, es tan solo una forma entre
otras,]



me referia a que realmente, en este caso, no hace falta recargar el
combo porque te basta ria usar el metodo 'RemoveItem' del combobox
para eliminar dicha entrada del combo a la vez que eliminas la fila de
la hoja, es decir algo asi=>


Private Sub CommandButton1_Click()
Dim f As Long, max As Long, n As Byte
max = ComboBox1.ListCount
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 Exit Do
Worksheets(nombreHoja).Rows(f + 2).Delete

' aqui eliminamos la fila del combo
Combobox1.removeItem(f)
'

max = f
Loop
borrarTxts
cargarCombo ComboBox1, nombreHoja
End Sub

es otra posibilidad

un saludo
Ivan
Respuesta Responder a este mensaje
#7 GRIEGO59
14/10/2008 - 21:52 | Informe spam
Hola, Ivan!

Mas o menos he entendido como un 5% de lo que me has explicado.
Realmente no es "Mi código" me lo han enseñado en este foro y lo uso como mío.

Al usar F1 sobre el código "borrarTxts" me dice:

"...Palabra clave no encontrada.
Puede que se haya pedido ayuda para una palabra clave no válida de Visual
Basic"

"...Puede estar incluida en una biblioteca de objetas que no está incluida
en las referencias"

Al presionar el botón guardar me dice:

"Error de Compilación:
No se ha definido Sub o Fuction"
y marca esa palabrita "borrarTxts"

He borrado todos los códigos del formulario y he dejado solamente mi
Initialize y tus códigos.

Por cierto, en tu código donde aparece:
Then _
y
- 1 , _

He escrito:
Then(espacio)_(enter)
y
- 1 ,(espacio)_(enter)

No sé si esto es la causa del error.
Estoy copiando tus códigos manualmente, no puedo usar la opción de copiar.
Pero he tenido cuidado de copiar correctamente y me he asistido por las
palabritas que van saliendo automáticamente a medida que uno va escribiendo.

Gracias apor tu ayuda,

Darío.
Respuesta Responder a este mensaje
#8 Ivan
15/10/2008 - 00:03 | Informe spam
hola Dario,

Mas o menos he entendido como un 5% de lo que me has explicado.



me temo que la 'capacidad didactica' es una mas de mis carencias.
Unido a mi 'verborrea', no me extraña que no hayas entendido de la
misa la media.

de todas formas, antes de 'intentar volver a entrar en materia',
permiteme un comentario, y espero que no te moleste y lo tomes solo
como la exposicion de algo que yo haria de estar en tu caso (de hecho
es mas o menos lo que hice en su dia):

si no recuerdo mal, creo que llevas bastante tiempo trasteando con VBA
excel, o al menos creo recordar mensajes tuyos en el foro hace ya
bastantes meses.

de ello deduzco, que +/- te atrae esto de la programacion con macros
(o como poco que te es bastante necesario)

si es asi, yo en tu caso haria (hice) un parentesis para intentar
estudiar al menos las generalidades del lenguaje de programacion con
el que quieres trabajar. Ello te permitiria, con muy poco esfuerzo,
multiplicar exponencialmente los frutos obtenidos con tu trabajo.

no me refiero a profundizar, sino a intentar comprender lo mas basico
para poco a poco ir añadiendo/descubriendo nuevas cosas

Y realmente para ello no creo que necesites mas alla de una o dos
tardes.

Se trataria tan solo de intentar conocer cosas como estas:

a) Tipo, declaracion, usos y alcance de procedimientos
b) Tipo, declaracion, usos y alcance de variables y constantes
c) Estructuras de decision
d) Operadores
c) y un sinfin :-D

es decir la estructura basica del lenguaje.

En general la mayor parte podras encontrarlo en la propia ayuda, pero
ademas la web esta llena de informacion, que deberas ir discerniendo
como tu creas/quieras/puedas

bueno, disculpa la charla. En realidad es una descripcion de lo que yo
hice (y sigo haciendo)

y volviendo al hilo =>

Al presionar el botón guardar me dice:

"Error de Compilación:
No se ha definido Sub o Fuction"
y marca esa palabrita "borrarTxts"

He borrado todos los códigos del formulario y he dejado solamente mi
Initialize y tus códigos.



¿que codigos has dejado?¿ has incluido el procedimiento 'borrarTxts'
incluido en mi 1er mensaje?

es decir, un procedimiento es un bloque de codigo que comienza por una
de estos 3 terminos: 'Sub', 'Function' o 'Property' [aunque puede y
suele ir precedido de un modificador de alcance ( Private, Public, y
alguno mas) y termina con un 'End Sub', 'End Function' o 'End
Property'

en este caso el procedimiento 'borrarTxts' es este que te ponia en el
1er mensaje =>

' 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

a este procedimiento se le puede llamar desde otros procedimientos
cuando nos interese. En este caso se le llama desde el evento Click
del boton guardar, despues de haber eliminado las filas =>

Private Sub CommandButton1_Click()
Dim f As Long, max As Long, n As Byte
max = ComboBox1.ListCount

' co estos dos bucles vamos obteniendo el nº
' de fila de mayor a menor
'
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 Exit Do

' aqui eliminamos la fila en la hoja
'
Worksheets(nombreHoja).Rows(f + 2).Delete

' aqui eliminamos la fila del combo
'
Combobox1.removeItem(f)

'
max = f
Loop

' una vez eliminadas las filas, llamamos al procedimiento
' que borra los textbox =>
'
borrarTxts

End Sub

NOTA: tambien podrias usar la instruccion Call =>

Private Sub CommandButton1_Click()
'
'...aqui iria el mismo codigo que en el otro
'..
' una vez eliminadas las filas, llamamos al procedimiento
' que borra los textbox =>
'
Call borrarTxts ()

End Sub

si te fijas aqui he eliminado la LLAMADA al procedimiento
'cargarCombo' porque al usar 'RemoveItem' ya no es necesario, pues
eliminamos la fila del combo a la par que la de la hoja

pero si quisieras utilizar dicho procedimiento pra cargar el combo,
bien en el evento 'Initialice' del formulario, bien en cualquier otro
procedimiento del modulo del formulario deberias hacer algo asi =>

este es el PROCEDIMIENTO 'cargarCombo' =>

' 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

como ves comienza por 'Sub' seguido por el nombre del procedimiento (y
los parametros si los tiene), y se cierra con 'End Sub'

y para llamarlo [usarlo] pej. en el evento 'Initialice' que exponias
en el otro hilo, seria algo asi =>

Private Sub UserForm_Initialize()
Productos.ColumnCount = 4
Productos.ColumnWidths = "45;180;100,25"
cargarCombo Productos, "FichaTécnica"
End Sub

o para que lo veas un poco mas claro, usando Call directamente (en
este caso deberas incluir los argumentos entre parentesis)

Private Sub UserForm_Initialize()
Productos.ColumnCount = 4
Productos.ColumnWidths = "45;180;100,25"

Call cargarCombo(Productos, "FichaTécnica")

End Sub


Por cierto, en tu código donde aparece:
Then _
y
- 1 , _

He escrito:
Then(espacio)_(enter)
y
- 1 ,(espacio)_(enter)



la verdad es que no me acabo de enterar de lo que has hecho, pero te
comento que el guion bajo al final de una linea (precedido de un
espacio) es el caracter de continuacion de linea, es decir que la
instruccion continua en el siguiente renglon.

en realidad es mas o menos igual que cuando cortamos una palabra al
escribrir, lo unico que lo que cortamos no es una palabra sini una
instruccion y el guion hay que precederlo de un espacio

su uso es sobre todo visual, para poder ver las instrucciones
completas cuando estas se alargan sin tener que usar el scroll

bueno, supongo que habre vuelto a liarte, pero si realmente estas
revisando 'palabra' por 'palabra' (e incluso letra por letra) que la
transcripcion esta bien, deberia funcionarte

un saludo
Ivan.
Respuesta Responder a este mensaje
#9 GRIEGO59
17/10/2008 - 03:00 | Informe spam
Hola, Ivan!
Gracias por la ayuda y las recomendaciones!
Esto se me ha hecho dificil.
Voy a tomar unas horas de vacaciones.

Saludos,

Darío.

"Ivan" escribió:

hola Dario,

> Mas o menos he entendido como un 5% de lo que me has explicado.

me temo que la 'capacidad didactica' es una mas de mis carencias.
Unido a mi 'verborrea', no me extraña que no hayas entendido de la
misa la media.

de todas formas, antes de 'intentar volver a entrar en materia',
permiteme un comentario, y espero que no te moleste y lo tomes solo
como la exposicion de algo que yo haria de estar en tu caso (de hecho
es mas o menos lo que hice en su dia):

si no recuerdo mal, creo que llevas bastante tiempo trasteando con VBA
excel, o al menos creo recordar mensajes tuyos en el foro hace ya
bastantes meses.

de ello deduzco, que +/- te atrae esto de la programacion con macros
(o como poco que te es bastante necesario)

si es asi, yo en tu caso haria (hice) un parentesis para intentar
estudiar al menos las generalidades del lenguaje de programacion con
el que quieres trabajar. Ello te permitiria, con muy poco esfuerzo,
multiplicar exponencialmente los frutos obtenidos con tu trabajo.

no me refiero a profundizar, sino a intentar comprender lo mas basico
para poco a poco ir añadiendo/descubriendo nuevas cosas

Y realmente para ello no creo que necesites mas alla de una o dos
tardes.

Se trataria tan solo de intentar conocer cosas como estas:

a) Tipo, declaracion, usos y alcance de procedimientos
b) Tipo, declaracion, usos y alcance de variables y constantes
c) Estructuras de decision
d) Operadores
c) y un sinfin :-D

es decir la estructura basica del lenguaje.

En general la mayor parte podras encontrarlo en la propia ayuda, pero
ademas la web esta llena de informacion, que deberas ir discerniendo
como tu creas/quieras/puedas

bueno, disculpa la charla. En realidad es una descripcion de lo que yo
hice (y sigo haciendo)

y volviendo al hilo =>

> Al presionar el botón guardar me dice:
>
> "Error de Compilación:
> No se ha definido Sub o Fuction"
> y marca esa palabrita "borrarTxts"
>
> He borrado todos los códigos del formulario y he dejado solamente mi
> Initialize y tus códigos.

¿que codigos has dejado?¿ has incluido el procedimiento 'borrarTxts'
incluido en mi 1er mensaje?

es decir, un procedimiento es un bloque de codigo que comienza por una
de estos 3 terminos: 'Sub', 'Function' o 'Property' [aunque puede y
suele ir precedido de un modificador de alcance ( Private, Public, y
alguno mas) y termina con un 'End Sub', 'End Function' o 'End
Property'

en este caso el procedimiento 'borrarTxts' es este que te ponia en el
1er mensaje =>

' 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

a este procedimiento se le puede llamar desde otros procedimientos
cuando nos interese. En este caso se le llama desde el evento Click
del boton guardar, despues de haber eliminado las filas =>

Private Sub CommandButton1_Click()
Dim f As Long, max As Long, n As Byte
max = ComboBox1.ListCount

' co estos dos bucles vamos obteniendo el nº
' de fila de mayor a menor
'
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 Exit Do

' aqui eliminamos la fila en la hoja
'
Worksheets(nombreHoja).Rows(f + 2).Delete

' aqui eliminamos la fila del combo
'
Combobox1.removeItem(f)

'
max = f
Loop

' una vez eliminadas las filas, llamamos al procedimiento
' que borra los textbox =>
'
borrarTxts

End Sub

NOTA: tambien podrias usar la instruccion Call =>

Private Sub CommandButton1_Click()
'
'...aqui iria el mismo codigo que en el otro
'..
' una vez eliminadas las filas, llamamos al procedimiento
' que borra los textbox =>
'
Call borrarTxts ()

End Sub

si te fijas aqui he eliminado la LLAMADA al procedimiento
'cargarCombo' porque al usar 'RemoveItem' ya no es necesario, pues
eliminamos la fila del combo a la par que la de la hoja

pero si quisieras utilizar dicho procedimiento pra cargar el combo,
bien en el evento 'Initialice' del formulario, bien en cualquier otro
procedimiento del modulo del formulario deberias hacer algo asi =>

este es el PROCEDIMIENTO 'cargarCombo' =>

' 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

como ves comienza por 'Sub' seguido por el nombre del procedimiento (y
los parametros si los tiene), y se cierra con 'End Sub'

y para llamarlo [usarlo] pej. en el evento 'Initialice' que exponias
en el otro hilo, seria algo asi =>

Private Sub UserForm_Initialize()
Productos.ColumnCount = 4
Productos.ColumnWidths = "45;180;100,25"
cargarCombo Productos, "FichaTécnica"
End Sub

o para que lo veas un poco mas claro, usando Call directamente (en
este caso deberas incluir los argumentos entre parentesis)

Private Sub UserForm_Initialize()
Productos.ColumnCount = 4
Productos.ColumnWidths = "45;180;100,25"

Call cargarCombo(Productos, "FichaTécnica")

End Sub

>
> Por cierto, en tu código donde aparece:
> Then _
> y
> - 1 , _
>
> He escrito:
> Then(espacio)_(enter)
> y
> - 1 ,(espacio)_(enter)

la verdad es que no me acabo de enterar de lo que has hecho, pero te
comento que el guion bajo al final de una linea (precedido de un
espacio) es el caracter de continuacion de linea, es decir que la
instruccion continua en el siguiente renglon.

en realidad es mas o menos igual que cuando cortamos una palabra al
escribrir, lo unico que lo que cortamos no es una palabra sini una
instruccion y el guion hay que precederlo de un espacio

su uso es sobre todo visual, para poder ver las instrucciones
completas cuando estas se alargan sin tener que usar el scroll

bueno, supongo que habre vuelto a liarte, pero si realmente estas
revisando 'palabra' por 'palabra' (e incluso letra por letra) que la
transcripcion esta bien, deberia funcionarte

un saludo
Ivan.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida