Excel Avanzado

Macros, Vba en Excel y muchos ejemplos de nuestro Curso de Excel Avanzado

Excel Avanzado

Userform aplicado para extraer productos de una lista

| 5 comentarios

Un  Userform es un formulario diseñado con formato y estructura estándar que facilita la captura, la organización y la edición de la información.

Este userform tiene como finalidad ayudar al usuario a extraer datos de una gran base de datos y poder registrarlo en una nueva tabla. Así se logra una reducción en el tiempo de búsqueda del usuario y el tiempo de registro de datos.

En este caso se cuenta con una lista de artículos que cuenta con los siguientes datos: número de artículo, descripción, precio y stock. En base a esta base de datos se ejecutará la macro. Se crea un botón el cual hará aparecer el formulario.

formu

Este formulario nos ayudará a obtener los datos de la lista de productos. Se hará click en el botón nuevo. Este formulario cuenta con una lista desplegable con la cual el usuario puede seleccionar el artículo deseado. Luego, al hacer click en el botón transferir automáticamente se registrarán los datos del productos a una nueva lista.

userform

(Para mayor visualización de la imagen, hacer click en la misma)

En el archivo adjunto, se detalla la programación.

Extraer un producto de una lista

 

Elaborado por Rosalia Gomez Alvarez

5 comentarios

  1. tengo una aplicacion en vba que no eh podido solucionar y necesito ayuda;

    tengo dos fechas una inicial y otra final como esta por ejemplo

    9/01/2014 seria inicio y 9/30/2014 seria final, lo que deseo es obtener todas las fecha que estan dentro de ese rango de fechas omitiendo el sabado y domingo y ponerlos en un listBox, tengo un ciclo que me saca todas las fechas osea 30 fechas y no es lo que quiero, quisiera que me ayudara le dejare aqui el ciclo que estoy utilizando, gracias de antemano.

    Private Sub CommandButton1_Click()

    Dim x As Date
    For x = DateValue(TextBox1.Text) To DateValue(TextBox2)
    ListBox1.AddItem (x)
    Next
    End Sub
    ____________________________________
    Salida de esto:
    9/01/2014
    9/02/2014
    9/03/2014
    9/04/2014
    9/05/2014
    9/06/2014
    9/07/2014
    asta el
    9/30/2014
    ----------------------------------------
    La salida que busco es:
    9/01/2014
    9/02/2014
    9/03/2014
    9/05/2014
    9/08/2014
    9/09/2014
    9/10/2014
    9/11/2014
    9/12/2014
    9/15/2014
    9/16/2014
    9/17/2014
    9/18/2014
    9/19/2014
    9/22/2014
    9/23/2014
    9/24/2014
    9/25/2014
    9/26/2014
    9/29/2014
    9/30/2014

    espero que me halla explicado bien

    • Hola Manuel, necesitas usar la funcion weekday:
      For x = DateValue(TextBox1.Text) To DateValue(TextBox2)
      If WorksheetFunction.Weekday(x,1)=1 or WorksheetFunction.Weekday(x,1)=7 _ then
      Else
      ListBox1.AddItem (x)
      End if
      Next

  2. Buenas tardes Estimados,

    Tengo una base datos de 60 clientes que puedo ingresar mediante un userform que creé y también puedo modificar los ingreso de muy buena manera. Este userform me permite ir a otro userform1, donde extraigo información de la primera base datos para alimentar otra nueva base de datos, pero en este caso se refiere a ventas. De la primera base de datos extraigo sólo el código del cleinte, el nombre del cliente y el nombre del vendedor. El userform1, tiene dos checkbox, 3 combobox, y 4 textbox, 1 botón para agregar las ventas, otro botón para ir a otro userform3 de modificar ventas y el botón salir.

    Los dos checkbox están conectados a dos combobox de la siguiente manera:

    Private Sub CheckBox1_Click()
    If CheckBox1.Value = True Then
    ComboBox2.Enabled = True
    CheckBox2.Enabled = False
    ComboBox3.Enabled = False
    ComboBox4.Enabled = True
    cargaCodigo
    Else
    ComboBox2.Enabled = False
    CheckBox2.Enabled = True
    ComboBox2.Clear
    End If
    End Sub

    Private Sub CheckBox2_Click()
    If CheckBox2.Value = True Then
    ComboBox3.Enabled = True
    CheckBox1.Enabled = False
    ComboBox2.Enabled = False
    ComboBox4.Enabled = True
    cargaCliente
    Else
    ComboBox3.Enabled = False
    CheckBox1.Enabled = True
    ComboBox3.Clear
    End If
    End Sub

    Sub cargaCodigo()
    ComboBox2.Clear
    Sheets("BASE DE DATOS CLIENTES VINICOLA").Activate
    Range("a1").Select
    For i = 1 To 100
    If ActiveCell.Offset(i, 0).Value "" Then
    ComboBox2.AddItem ActiveCell.Offset(i, 0).Value
    End If
    Next
    End Sub

    Sub cargaCliente()
    ComboBox3.Clear
    Sheets("BASE DE DATOS CLIENTES VINICOLA").Activate
    Range("C1").Select
    For i = 1 To 100
    If ActiveCell.Offset(i, 0).Value "" Then
    ComboBox3.AddItem ActiveCell.Offset(i, 0).Value
    End If
    Next
    End Sub

    Private Sub ComboBox2_Change()
    Dim var2 As String
    If ComboBox2 = "" Then
    Else
    CommandButton1.Locked = False
    Sheets("BASE DE DATOS CLIENTES VINICOLA").Activate
    If ComboBox2 = Empty Then
    MsgBox "Para modificar primero seleccione Cliente", vbInformation, "Almacen"
    ComboBox2.ListIndex = 0
    ComboBox2.SetFocus
    End If

    var2 = ComboBox2.Column(0)
    Cells.Find(What:=ComboBox2.Value, After:=ActiveCell, LookIn:=xlFormulas, lookat:= _
    xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False).Activate

    If var2 = ActiveCell.Value Then

    TextBox1.Value = ActiveCell.Value
    TextBox2 = ActiveCell.Offset(0, 1)
    TextBox3 = ActiveCell.Offset(0, 2)
    'TextBox4 = ActiveCell.Offset(0, 3)
    'TextBox5 = ActiveCell.Offset(0, 4)
    'TextBox6 = ActiveCell.Offset(0, 5)
    'TextBox7 = ActiveCell.Offset(0, 6)
    'TextBox8 = ActiveCell.Offset(0, 7)
    'TextBox9 = ActiveCell.Offset(0, 8)
    'TextBox10 = ActiveCell.Offset(0, 9)
    'TextBox11 = ActiveCell.Offset(0, 10)
    TextBox2.Locked = False
    TextBox3.Locked = False
    'TextBox4.Locked = False
    'TextBox5.Locked = False
    'TextBox6.Locked = False
    'TextBox7.Locked = False
    'TextBox8.Locked = False
    'TextBox9.Locked = False
    'TextBox10.Locked = False
    'TextBox11.Locked = False
    End If
    End If
    End Sub

    Private Sub ComboBox3_Change()
    If ComboBox3 = "" Then
    Else
    CommandButton1.Locked = False
    Sheets("BASE DE DATOS CLIENTES VINICOLA").Activate
    If ComboBox3 = Empty Then
    MsgBox "Para modificar primero seleccione Cliente", vbInformation, "Almacen"
    ComboBox3.ListIndex = 0
    ComboBox3.SetFocus
    End If
    var3 = ComboBox3.Column(0)
    Cells.Find(What:=ComboBox3.Value, After:=ActiveCell, LookIn:=xlFormulas, lookat:= _
    xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
    , SearchFormat:=False).Activate
    If var3 = ActiveCell Then
    TextBox3 = ActiveCell
    TextBox1 = ActiveCell.Offset(0, -2)
    TextBox2 = ActiveCell.Offset(0, -1)
    'TextBox4 = ActiveCell.Offset(0, 1)
    'TextBox5 = ActiveCell.Offset(0, 3)
    'TextBox6 = ActiveCell.Offset(0, 4)
    'TextBox7 = ActiveCell.Offset(0, 5)
    'TextBox8 = ActiveCell.Offset(0, 6)
    'TextBox9 = ActiveCell.Offset(0, 7)
    'TextBox10 = ActiveCell.Offset(0, 8)
    'TextBox11 = ActiveCell.Offset(0, 9)
    TextBox1.Locked = False
    TextBox2.Locked = False
    'TextBox4.Locked = False
    'TextBox5.Locked = False
    'TextBox6.Locked = False
    'TextBox7.Locked = False
    'TextBox8.Locked = False
    'TextBox9.Locked = False
    'TextBox10.Locked = False
    'TextBox11.Locked = False
    End If
    End If
    End Sub

    Estos código me han funcionado bien, cargan la información a los textbox1, texbox2, textbox3, dentro de userform1 que es el de ventas.

    Luego tengo un tercer combobox y un cuarto textbox4, los cuales deben combinarse para añadir las ventas, ya que este es el único parámetro que se va a modificar en este userform1. La base de datos de las ventas tiene código, nombre del vendedor, y nombre del cliente, a parte tiene los 12 meses del año, todo dispuesto de forma horizontal. Indagando por internet logro asociar el tercer combobox con el 4 textbox, de la siguiente manera:

    Private Sub userform_initialize()
    CheckBox1.Value = True
    'sirve para agregar los datos alineados horizontalmente en un combobox
    'ComboBox4.Clear
    Sheets("VENTAS").Select
    Range("d2").Select
    Do While ActiveCell.Value ""
    ComboBox4.AddItem ActiveCell
    ActiveCell.Offset(0, 1).Select
    Loop
    End Sub

    y logro agregarlo en la casilla correspondiente de cada mes con esta instrucción:

    If ComboBox4.Text = "ENERO" Then
    Range("D" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "FEBRERO" Then
    Range("E" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "MARZO" Then
    Range("F" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "ABRIL" Then
    Range("G" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "MAYO" Then
    Range("H" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "JUNIO" Then
    Range("I" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "JULIO" Then
    Range("J" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "AGOSTO" Then
    Range("K" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "SEPTIEMBRE" Then
    Range("L" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "OCTUBRE" Then
    Range("M" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "NOVIEMBRE" Then
    Range("N" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If
    If ComboBox4.Text = "DICIEMBRE" Then
    Range("O" & Rows.Count).End(xlUp).Offset(1, 0) = TextBox4.Value
    End If

    Lo que veo, es que debería agregar por mes o solamente agregaría el primer mes y los demás meses lo haría por modificación en el userform3.

    Las preguntas son las siguientes, ¿Cómo puedo de otra manera enlazar el combobox3 al textbox4 para que pueda moverse en la matriz D2:O60, D2 es donde comienza Enero y O60 es donde termina DICIEMBRE, esto si quisiera ingresar de alguna forma algún de otro mes sin que fuera de manera consecutiva, es decir, que cargue primero enero, febrero, etc., sino, que pueda ingresar cualquier dato en el mes que corresponda y enlazado con la ubicación de los textbox1, texbox2, textbox3, porque si esa información se carga en la celda 10, y quiero ingresar las ventas de diciembre, pueda marcar el combobox3 y el textbox4 y que cargue en la celda D10 que corresponde con los datos de los 3 primero textbox?

    La segunda pregunta es: ¿Cómo puedo modificar sólo las ventas y que quede enlazado con los datos ya cargados en las celdas de código, cliente y vendedor, es decir, elijo el código que se encuentra en la celda 25 y quiero modificar las ventas del mes de marzo, y marzo está en la columna E, requiero que se pueda modificar simplemente ese valor E10, poder hacer esto desde el userform3?

    Espero puedan ayudarme,

    Muchas Gracias.

    Saludos Cordiales!!!

  3. hola necesito hacer un programa que me saque de una lista todo lo que tengo en 0 y me lo arroje en un listBox.
    por ejemplo tengo esto :
    tuercas 12
    tornillos 0
    pijas 0
    desarmadores 2

    por ejemplo de esa lista que lo que esta en 0 me lo arroje en un listBox

    ojala puedas ayudarme...

  4. Hola buenas tardes necesito ayuda; tengo un VBA y necesito su ayuda; quiero sacar la cantidad de productos que se vendió por fechas fecha inicio y fecha final y que al seleccionar el producto me arroje la cantidad entre esas fechas

Deja una respuesta

Los campos requeridos estan marcados con *.