Cargar varios Textbox con un combobox

11/10/2008 - 14:23 por GRIEGO59 | Informe spam
Hola!
Tengo un formulario con un combobox Productos y siete Textbox:TextBox1,
TextBox2 ... TextBox7, con el siguiente código:

Private Sub UserForm_Initialize()
Productos.ColumnCount = 4
Productos.ColumnWidths = "45;180;100,25"
With Worksheets("FichaTécnica")
Productos.List = .Range(.Range("a2"), .Range("e2").End(xlDown)).Value
End With
End Sub

Private Sub Productos_Change()
TextBox1 = Productos.Value

End With
End Sub

Por los momentos, al seleccionar un producto en combobox Productos, el
código aparece en TextBox1. Yo quisiera que si selecciono otros productos
más, sus códigos se muestren en TextBox2, TextBox3, … TextBox7.

La cantidad de productos a seleccionar, depende del estado de ánimo del
cliente.
El Código de producto puede repetirse en TextBox1, TextBox2 … TextBox7.

Sería fenomenal si al tener varios productos seleccionados y borro un código
de producto de un TextBox intermedio, y luego selecciono un nuevo producto,
el nuevo producto aparece en el TextBox intermedio que he borrado.

Alguien podría ayudarme?

La hoja FichaTécnica tiene las siguientes columnas:
Código, Descripción del producto, Color, Ubicación física.

Gracias por la ayuda,

Darío.

Preguntas similare

Leer las respuestas

#1 Ivan
11/10/2008 - 17:04 | Informe spam
hola Dario,

creo que tu exposicion deja unas cuantas dudas en el aire, importantes
para no tirar a ciegas:

Tengo un formulario con un combobox Productos y siete Textbox:TextBox1,
TextBox2 ... TextBox7,
...
... al seleccionar un producto en combobox Productos, el


código aparece en TextBox1. Yo quisiera que si selecciono otros productos
más, sus códigos se muestren en TextBox2, TextBox3, … TextBox7
...
La cantidad de productos a seleccionar, depende del estado de ánimo del
cliente.



¿y, dado que la cantidad de productos seleccionados depende del
criterio del usuario, que se supone que debe hacerse si se supera el
nº de 7 productos?

en cualquier caso creo que una primera aproximacion podria ser al go
tipo=>

recorrer los 7 textbox con un bucle cada vez que 'cambie' [en tu ej.
usas el Change] el combo y asignar el valor seleccionado al 1er
textbox vacio que encuentres. Por ej, usando la propiedad controls del
userform. Algo tipo

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

ahora, aparte de otros factores, control de errores incluido, cuando
los siete textbox esten llenos ¿que se deberia hacer?

bueno, creo que hay alguna duda mas, pero a lo mejor te sirve para ir
cogiendo alguna idea

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Ivan
12/10/2008 - 02:42 | Informe spam
hola de nuevo Dario,

puesto a especular [y por aquello de practicar un poco], y como por
tus explicaciones me queda la impresion de que el funcionamiento que
expones puede resultarle un poco 'limitador' a tu cliente,

te comento una forma de hacer algo parecido a lo que creo entender que
buscas =>

si quieres probarlo crea un nuevo userform (si lo prefieres hazlo en
una copia del archivo original) e inserta en el un CommandButton, un
Listbox y un Combobox, sin cambiarles el nombre.

Colocalos un poquito, dejando el mayor espacio para el listbox, y pega
el siguiente codigo en el modulo del formulario,

[asegurandote de que la constante "nombreHoja" se corresponde con el
de la hoja del listado y de que los titulos de la lista estan en la
fila 1 y comienza en la 1ª columna (A). como parece por tu ejemplo]

' ******* pega desde aqui ********
'
Const nombreHoja As String = "FichaTécnica"
Private noCambiar As Boolean
'
Private Sub ComboBox1_Change()
With ComboBox1
If noCambiar Or .ListCount = 0 Or _
.ListIndex = -1 Then Exit Sub
ListBox1.TopIndex = .List(.ListIndex, 1)
End With
End Sub
'
Private Sub CommandButton1_Click()
With ListBox1
For n = 0 To .ListCount - 1
If .Selected(n) Then _
.Selected(n) = False
Next
End With
ComboBox1.Text = ""
End Sub
'
Private Sub ListBox1_Change()
noCambiar = True
With ComboBox1
.Clear
'.Text = ""
Dim n As Integer
For n = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(n) Then
.AddItem (ListBox1.List(n, 0))
.List(.ListCount - 1, 1) = n
End If
Next
If .ListCount > 0 Then .Text = _
ListBox1.List(ListBox1.ListIndex, 0)
End With
noCambiar = False
End Sub
'
Private Sub UserForm_Initialize()
Dim rng As Range
Set rng = Worksheets(nombreHoja).[a1].CurrentRegion
rng.Columns.AutoFit
With ListBox1
.ColumnCount = rng.Columns.Count
.ColumnHeads = True
Dim anchos As String
For n = 1 To .ColumnCount
anchos = rng.Cells(1, n).Width & ";"
Next
.ColumnWidths = Left(anchos, Len(anchos) - 1)
.RowSource = rng.Offset(1).Resize( _
rng.Rows.Count - 1, _
rng.Columns.Count).Address(0, 0)
.MultiSelect = fmMultiSelectMulti
.ListStyle = fmListStyleOption
End With
With ComboBox1
.ColumnCount = 2
.ColumnWidths = rng.Cells(1).Width & ";0"
End With
CommandButton1.Caption = "Deselecionar"
CommandButton1.Accelerator = "D"
End Sub
'
' ******* pega hasta aqui ********

bueno, como te digo ha sido por retomar un poco las practicas con
UserForms, pero ya que esta lo mismo te resulta util

un saludo
Ivan
Respuesta Responder a este mensaje
#3 GRIEGO59
12/10/2008 - 05:15 | Informe spam
Hola, Ivan!

Gracias por tu ayuda.

¿y, dado que la cantidad de productos seleccionados depende del
criterio del usuario, que se supone que debe hacerse si se supera el
nº de 7 productos?


Es cierto, es hasta un máximo de 7 productos, no más

recorrer los 7 textbox con un bucle cada vez que 'cambie' [en tu ej.
usas el Change] el combo y asignar el valor seleccionado al 1er
textbox vacio que encuentres.


Es exactamente lo que quiero.

Pero me da
"Error de compilación:
El procedimiento externo no es válido"
y me lleva a la línea de código:

for n= 1 to 7
queda remarcada en azul.

ahora, aparte de otros factores, control de errores incluido, cuando
los siete textbox esten llenos ¿que se deberia hacer?


Si pasa de 7 un aviso de advertencia que diga: se permite hasta un máximo de
7 productos por factura y luego yo imprimo la factura y comienzo a hacer una
nueva factura para el mismo cliente con el resto de los productos.

Saludos,

Darío
Respuesta Responder a este mensaje
#4 GRIEGO59
12/10/2008 - 05:24 | Informe spam
Hola, de nuevo Ivan!
Para este segundo código que propones, ya lo probé.
En el Listbox aparecen todos los productos con un recuadro.
Al seleccionar los productos con el recuadro, estos productos se van
anexando al combobox.
El conmandbutton desselecciona todos los productos seleccionados.

Me gusta más tu primera opción, por ahora, espero no tener que cambiar de
opinión.

Saludos
Darío
Respuesta Responder a este mensaje
#5 Ivan
12/10/2008 - 21:17 | Informe spam
On 12 oct, 05:15, GRIEGO59 wrote:
Hola, Ivan!

Gracias por tu ayuda.

> ¿y, dado que la cantidad de productos seleccionados depende del
> criterio del usuario, que se supone que debe hacerse si se supera el
> nº de 7 productos?

Es cierto, es hasta un máximo de 7 productos, no más

> recorrer los 7 textbox con un bucle cada vez que 'cambie' [en tu ej.
> usas el Change] el combo y asignar el valor seleccionado al 1er
> textbox vacio que encuentres.

Es exactamente lo que quiero.

Pero me da
"Error de compilación:
El procedimiento externo no es válido"
y me lleva a la línea de código:

 for n= 1 to 7
queda remarcada en azul.

> ahora, aparte de otros factores, control de errores incluido, cuando
> los siete textbox esten llenos ¿que se deberia hacer?

Si pasa de 7 un aviso de advertencia que diga: se permite hasta un máximo de
7 productos por factura y luego yo imprimo la factura y comienzo a hacer una
nueva factura para el mismo cliente con el resto de los productos.

Saludos,

Darío



hola Dario

Pero me da
"Error de compilación:
El procedimiento externo no es válido"
y me lleva a la línea de código:

for n= 1 to 7
queda remarcada en azul.



la verdad es que no se a que se puede deber el error. [si quieres pon
el Nº de error. a ver si aclara algo]. Ahora mismo no recuerdo si me
ha sucedido alguna vez (ando un poco desconectado de excel, sorry :-
(( )

de todad formas, aunque el codigo que te puse lo hice en el editor del
foro y lo mande sin probarlo, una vez copiado/pegado tal cual esta en
el modulo de un nuevo userform, a mi me funciona perfectamente.

Eso si, desde un principio estoy suponiendo que estas trabajando en y
desde VBA Excel. Es decir que el 'Form' del que hablas se trata de un
'UserForm' del editor de VBa de excel, y que el combobox y los textbox
son controles de la barra de herramientas 'standard' de dicho editor.
Y por supuesto que los textbox se llaman como comentabas, del 1 al 7

si hay algo que no sea asi, comentalo

de todas formas aqui va una adaptacion para el mensaje de error
(incluye la carga del combo, pero si quieres usa solo lo que va dentro
del change del combo

OJO=> ponle el nombre adecuado al combo y a la hoja si usas todo

OJO tambien a los posible trunques del codigo en el foro

Const nombreHoja As String = "Listado"

Private Sub ComboBox1_Change()
Dim n As Integer
For n = 1 To 7
If Me.Controls("TextBox" & n).Text = "" Then
Me.Controls("TextBox" & n).Text = ComboBox1.Value
Exit Sub
End If
Next
MsgBox ( _
"No se puede seleccionar mas de 7 productos." & vbCr _
& "Si lo deseas borra alguno y vuelve a intentarlo.")
End Sub

Private Sub UserForm_Initialize()
Dim rng As Range
Set rng = Worksheets(nombreHoja).[a1].CurrentRegion
rng.Columns.AutoFit
With ComboBox1
.ColumnCount = rng.Columns.Count
.ColumnHeads = True
Dim anchos As String, ancho As Single
ancho = 0
For n = 1 To .ColumnCount
anchos = rng.Cells(1, n).Width & ";"
ancho = ancho + rng.Cells(1, n).Width
Next
.ListWidth = ancho
.ColumnWidths = Left(anchos, Len(anchos) - 1)
.RowSource = rng.Offset(1).Resize( _
rng.Rows.Count - 1, _
rng.Columns.Count).Address(0, 0)
End With
Set rng = Nothing
End Sub


prueba a ver y si quieres comentas

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