¿Traer datos de una hoja de cálculo a un formulario de excel visual basic?

Estoy creando un sistema de inventario y tengo un problema con los formularios de salida y entrada de producto.

Tengo la lista de producto con su código nombre marca y otros

Quiero que al introducir el código salga el nombre del producto la marca las unidades disponibles ó que si selecciono el nombre del producto me arroje el código la marca y la disponibilidad.

Los datos están en la siguiente foto.

He buscado mucho pero no he encontrado. Vi un video que fue el más parecido pero no me funcionó. Este es el link

https://youtu.be/t39GJ_XmX8I ya me dijeron que la función vlookup no me sirve

Esta es la imágenen del formulario

y esta de la lista de excel

Subo el código del formulario porque me habían tratado de ayudar pero no me funcionó

Private Sub codigo_Change()
End Sub
'0--48
'9--57
Private Sub codigo_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
KeyAscii = 0
End If
End Sub
Private Sub guardar_Click()
Sheets("RSD").Select
NR = Application.WorksheetFunction.CountA(Range("E:E"))
If producto.Text = "" Then
MsgBox ("Introduzca El Nombre Del Producto O Artículo")
ElseIf motivo.Text = "" Then
MsgBox ("Introduzca El Motivo De Salida Del Producto")
ElseIf unidades.Value = "" Then
MsgBox ("Introduzca Las Unidades Que Salen Del Inventario")
ElseIf precio.Value = "" Then
precio = "Sin Precio"
ElseIf MsgBox("¿Desea Guardar?", vbYesNo, "Confirmar") = vbNo Then Exit Sub
codigo = ""
producto = ""
marca = ""
disponible = ""
motivo = ""
unidades = ""
precio = ""
codigo.SetFocus
Else
Cells(NR + 1, 3) = Val(codigo)
Cells(NR + 1, 5) = producto
Cells(NR + 1, 4) = marca.Caption
Cells(NR + 1, 6) = Val(disponible)
Cells(NR + 1, 7) = motivo
Cells(NR + 1, 8) = Val(unidades)
Cells(NR + 1, 9) = Val(precio)
codigo = ""
producto = ""
marca = ""
disponible = ""
motivo = ""
unidades = ""
precio = ""
codigo.SetFocus
End If
End Sub
Private Sub marca_Click()
End Sub
Private Sub producto_Change()
End Sub
'a--97
'z--122
'A--65
'Z--90
' --32
'ñ--164
Private Sub producto_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not (KeyAscii >= 97 And KeyAscii <= 122 Or KeyAscii >= 65 And KeyAscii <= 90 Or KeyAscii = 32 Or KeyAscii >= 164) Then
KeyAscii = 0
End If
End Sub
Private Sub motivo_Change()
End Sub
'a--97
'z--122
'A--65
'Z--90
' --32
'ñ--164
Private Sub motivo_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not (KeyAscii >= 97 And KeyAscii <= 122 Or KeyAscii >= 65 And KeyAscii <= 90 Or KeyAscii = 32 Or KeyAscii >= 164) Then
KeyAscii = 0
End If
End Sub
Private Sub unidades_Change()
End Sub
'0--48
'9--57
Private Sub unidades_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
KeyAscii = 0
End If
End Sub
Private Sub precio_Change()
End Sub
'0--48
'9--57
Private Sub precio_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not (KeyAscii >= 48 And KeyAscii <= 57) Then
KeyAscii = 0
End If
End Sub
Private Sub limpiar_Click()
codigo = ""
producto = ""
marca = ""
disponible = ""
motivo = ""
unidades = ""
precio = ""
codigo.SetFocus
End Sub
Private Sub salir_Click()
Unload Me
End Sub
Private Sub UserForm_Activate()
codigo.SetFocus
With motivo
.RowSource = "MotivoRSD"
.ListIndex = 0
End With
With producto
.RowSource = "Productotabla"
.ListIndex = 0
End With
End Sub
Respuesta
2

Y sigo en lo dicho que el vlookup no te sirve, de hecho lo que quieres hacer no tiene chiste es muy sencillo y además estas usando demasiado código copia esta macro y antes de que quieras modificarla prueba primero y una vez que entiendas como funciona tu mismo podrás modificarla a tu gusto.

Private Sub ComboBox1_CHANGE()
Rem busca informacion por el combobox
Rem si el textbox del codigo esta en blanco
Rem en caso contrario se buscara por codigo
Set INVENTARIO = Range("INVENTARIO")
CODIGO = ComboBox1.ListIndex + 1
If TextBox1.Text <> Empty Then GoTo SAL
With INVENTARIO
    TextBox1.Text = .Cells(CODIGO, 1)
    Label1 = .Cells(CODIGO, 2)
    TextBox2.Text = .Cells(CODIGO, 4)
    TextBox3.Text = .Cells(CODIGO, 5)
End With
Set INVENTARIO = Nothing
SAL:
End Sub
Private Sub CommandButton1_Click()
Rem asi se realiza la captura cuenta
Rem las filas y se posiciona una fila
Rem despues de la ultima con datos
Rem captura el codigo añadiendole un 1
Rem al ultimo codigo existente
Set INVENTARIO = Range("INVENTARIO")
With INVENTARIO
    R = .Rows.Count
    .Cells(R + 1, 1) = .Cells(R, 1) + 1
    .Cells(R + 1, 2) = Label1
    .Cells(R + 1, 3) = ComboBox1.Value
    .Cells(R + 1, 4) = TextBox2.Text
    .Cells(R + 1, 5) = TextBox3.Text
End With
Set INVENTARIO = Nothing
End Sub
Private Sub CommandButton2_Click()
Rem limpia las variables
ComboBox1.Value = Empty
        Label1 = Empty
        TextBox1.Text = Empty
        TextBox2.Text = Empty
        TextBox3.Text = Empty
End Sub
Private Sub TextBox1_AfterUpdate()
Rem hace la busqueda por codigo siempre
Rem y cuando el combobox no tenga datos
Rem esta instruccion anula la seleccion de
Rem productos por combo hasta que pongas
Rem en blanco el codigo, esta parte se activara cuando
Rem des enter
Set INVENTARIO = Range("INVENTARIO")
CODIGO = TextBox1.Text
If ComboBox1.Value <> Empty Then
    MATRIZ = INVENTARIO.Columns(3)
    With ComboBox1
        .Clear
        .List = MATRIZ
    End With
    GoTo SAL
End If
With INVENTARIO
    If IsNumeric(CODIGO) Then
        ComboBox1.Clear
        FILA = WorksheetFunction.Match(Val(CODIGO), .Columns(1), 0)
        ComboBox1.Value = .Cells(CODIGO, 3)
        Label1 = .Cells(CODIGO, 2)
        TextBox2.Text = .Cells(CODIGO, 4)
        TextBox3.Text = .Cells(CODIGO, 5)
    End If
End With
SAL:
Set INVENTARIO = Nothing
End Sub
Private Sub UserForm_Initialize()
Rem hace la carga de los datos a
Rem la memoria y de hay pasa los
Rem productos ubicados en la columna
Rem 3 al combobox, tambien define
Rem un area de inventarios con la
Rem cual trabajara en todos los modulos
Rem si borra cualquier parte de esta instruccion
Rem el programa ya no funcionara
Set INVENTARIO = Range("B4").CurrentRegion
MATRIZ = INVENTARIO.Columns(3)
ComboBox1.List = MATRIZ
INVENTARIO.Name = "INVENTARIO"
Set INVENTARIO = Nothing
End Sub

Los REM puedes borrarlos solo son para explicarte para que sirve cada modulo

3 respuestas más de otros expertos

Respuesta
1

Para buscar los datos por medio de un código se dice que el código es único para cada producto, ¿entonces para que necesitas un combobox para el producto?, seria bueno cambiarlo por un textbox, pero si necesitas ese combo, no se tendría que buscar por el código, avisa y te ayudamos.

mira...

puse el textbox de código y el combobox de producto por lo siguiente.

si la persona se sabe el código lo digita y automaticamente el nombre del producto y las otras cualidades se rellenan pero, sino se lo sabe, entonces busca en el combobox el nombre de producto para que haga el mismo proceso

El ejemplo que presenta la Ingeniera Elsa Matilde es más que suficiente para que lo puedas adaptar a tu proyecto, solo es de hacer unos cambios en el código.

Saludos!

¡Gracias! 

=D ya lo estoy mirando a ver si me funciona

Perdón molestarlo pero no fui capaz de adaptar el código del video a mi formulario. usted me podría ayudar?

Si puedes envíame tu archivo a mi correo [email protected] y te ayudo a mejorar tu proyecto.

Respuesta
1

Hace poco dejé un modelo que podés descargar desde mi blog, también encontrarás allí el link al video explicativo.

http://elsamatilde.blogspot.com/2018/03/interactuando-con-userform.html 

Ese formulario sirve tanto para crear registros como para modificar o eliminar alguno.

Si luego necesitas ayuda para adaptar algún detalle podés contactarme nuevamente.

Sdos.

Elsa

Ya lo descargué y voy a mirar el video gracias.

voy a mirar si me sale alguna duda

Buscas el registro con el combobox de buscar.

¿Puedo buscar el registro con dos opciones? ¿El un textbox de id y el combobox de buscar?

Hola Doña Elsa

no me funciona adaptarlo a mi formulario. debo de estar haciendo algo mal

en primera instancia me sale esto

error en tiempo de ejecución y me señala el combobox de código :(

Seguramente algo estás haciendo mal u olvidando algún detalle.

Leí que necesitas ingresar el código o el nombre... y para eso podés utilizar un combobox de 2 columnas.

Con los Userforms no se trata solo de dibujar un par de controles y ya está ... tienen propiedades, métodos, eventos... imposible enseñarte todo en una respuesta.

Mejor enviame tu libro y te lo ajusto. Mis correos están en mi sitio que dejo al pie.

Aquí te estoy dejando las 2 macros para las búsquedas, ya sea por código o por nombre, y así podés evaluar las diferencias.

La variable 'hop' la declaré al inicio del formulario y en el evento Initialize (o Activate como lo tenés) le asigno el nombre de la hoja Productos.

Private Sub codigo_Change()     'busqueda x código
'busca la ubicación del registro
If codigo = "" Then Exit Sub
dato = codigo.Value
Set busco = hop.Range("B:B").Find(dato, LookIn:=xlValues, lookat:=xlWhole)
If Not busco Is Nothing Then
    fily = busco.Row
    marca.Caption = hop.Range("C" & fily)
    producto = hop.Range("D" & fily)
    unidades = hop.Range("E" & fily)
    'precio = hop.Range("F" & fily)
Else
    MsgBox "No se encuentra este código en la base.", , "ATENCIÓN"
    Exit Sub
End If
unidades.SetFocus
End Sub
Private Sub producto_Change()      'busqueda x nombre
'busca la ubicación del registro
If producto = "" Then Exit Sub
dato = producto.Value
Set busco = hop.Range("D:D").Find(dato, LookIn:=xlValues, lookat:=xlWhole)
If Not busco Is Nothing Then
    fily = busco.Row
    codigo.Text = hop.Range("B" & fily)
    marca.Caption = hop.Range("C" & fily)
    unidades.Text = hop.Range("E" & fily)
    'precio.Text = hop.Range("F" & fily)
Else
    MsgBox "No se encuentra este producto en la base.", , "ATENCIÓN"
    Exit Sub
End If
unidades.SetFocus
End Sub

Observa que el control 'marca' lleva .caption por tratarse de un label a diferencia del resto de los controles que son TextBox.

PD) Ya te estoy devolviendo el libro con estos arreglos.

No olvides valorar esta respuesta (opciones: excelente o buena)

Luego seguramente necesitarás más ajustes pero deja una consulta por cada tema indicandolo en el título . No podemos programar todo un formulario personalizado a tu caso en 1 sola consulta (para eso dejamos los ejemplos), sino que se supone que resolvemos temas puntuales y así les puede servir a otros usuarios también.

Respuesta
1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas