jueves, 16 de junio de 2011

UserForm para alimentar una base de datos

Puede descargar el fichero: UserForm.xlsm


Vamos a crear un UserForm, que es un formulario que nos permitirá pedir al usuario que introduzca una serie de datos para ir creando una tabla en Excel, en forma de base de datos.

Supongamos que se trata de la empresa UniLink, Co. Ltd.
Su departamento de personal está creando una pequeña base de datos sobre Excel. Se trata de una tabla con 4 campos: Nombre, Departamento, Extensión y eMail.

Disponemos de un botón incrustado que lanza el proceso y llama al Formulario de entrada de datos.


La macro asociada al botón es la siguiente.


Vamos al Editor de Visual Basic y pedimos insertar un UserForm, para ello utilizamos el menú Insertar que se encuentra en el propio Editor de Visual Basic, y luego pulsamos sobre UserForm.


Esto genera el UserForm1, que aparecerá como una zona rectangular sobre la que posteriormente iremos introduciendo diferentes elementos del Cuadro de herramientas.


Seguidamente se muestra el Cuadro de Herramientas.


Después de trabajar un rato sobre nuestro primer UserForm quedará así:


Al ejecutar el UserForm1 veremos lo siguiente.


Disponemos de la ventana de propiedades para ir cambiando algunas, como por ejemplo el rótulo que aparece en la cabecera del UserForm1. Hemos denominado al formulario 'Ficha personal'. Esto se hace modificando la propiedad Caption.


Otra ventana importante es la ventana del Proyecto. Finalmente llegaremos a manejar tres formularios, que se pueden ver en la imagen siguiente como:
  • UserForm1
  • UserForm2
  • UserForm3


Pulsando con el botón derecho del ratón sobre el UserForm1 podemos pedir que se vea el objeto (el propio UserForm1) o que se vea el código asociado a sus botones y demás herramientas de control.


Si pedimos Ver código del UserForm1 obtendremos la siguiente ventana.


Aquí se programan todos los botones y etiquetas que utilizamos en el UserForm1.


En el desplegable de arriba, a la izquierda podemos elegir diferentes elementos como se ve en la siguiente imagen.


En el desplegable de la derecha podemos elegir diferentes eventos.



El UserForm2 es el siguiente.


El código del UserForm2 se muestra en la siguiente imagen.


El UserForm3 es el siguiente.



El código del UserForm3 se muestra en la siguiente imagen.


Un Ejemplo

En el siguiente vídeo se puede ver un ejemplo realizando un UserForm. Jose Luis Martín es uno de mis alumnos que ha creado una Calculadora Financiera programando todos los pasos con VBA en Excel.

30 comentarios:

  1. muy buena la explicacion, basica para dar inicio a la introduccion a los userform, muuuuuuy buena

    ResponderEliminar
  2. Gracias Ingeniero por el aporte, de una utilidad invaluable. Esta es la base para hacer tablas mas complejas...muy buen inicio..

    ResponderEliminar
  3. Soy principiante en los userfomr, me gustaria que me ayudaran a contactar a mi correo robiervalencia@gmail.com para aclarar algunas dudas, mi skype ramavaro Gracias

    ResponderEliminar
  4. Muy buena la explicacion pero tengo una pregunta para ti Adolfo, que creo que fue el que publico este blog, como se hace con este formulario para no introducir datos repetidos, cualquier informacion me la puedes hacer llegar a cualquiera de mis correos, que son los siguientes: rafa1122000@hotmail.com ;
    rafa1122000@gmail.com y bhmasociados@cantv.net
    Esperando tu respuesta
    Rafael

    ResponderEliminar
    Respuestas
    1. Adjunto te dejo la programación para evitar que se repitan los nombres de las personas. Esto debes pegarlo justo en el USERFORM2 ( Abajo de Nombre = TextBox1 ) :

      Dim eMail As String

      Nombre = TextBox1


      Z = Cells(Rows.Count, 2).End(xlUp).Row

      Range("B6").Select


      For k = 1 To Z - 6
      Range("B6").Select

      ActiveCell.Offset(k, 0).Select





      If ActiveCell.Value = Nombre Then


      MsgBox ("El nombre se repite")



      End If


      Next k




      Departamento = TextBox2
      Extension = TextBox3
      eMail = TextBox4

      Eliminar
  5. Buen día Ingeniero
    Excelente uso de userform y una explicacion por demás agradable y muy entendible.
    Tengo una inquietud al respecto:
    si quisiera enviar la informacion a la hoja "basededatos" y a otro más por decir "registromovimientos", ¿como sería la macro en este caso específico?
    Muchas gracias por tu valiosos aporte

    Juan Fiallo

    ResponderEliminar
  6. buenos dias ing, muy buena publicacion, mi pregunta. como busco un dato dentro de mi base de datos y que me lo muestre en un userform, luego que lo busque imprimirlo.
    se puede ? y como lo ago?
    seria de gran ayuda gracias

    ResponderEliminar
    Respuestas
    1. Primero debes crear un userform con un botón para buscar. Dentro del botón colocas el siguiente código:

      Private Sub CommandButton1_Click()
      Dim cont As Integer

      Dim colum As Integer


      buscar = InputBox("Ingrese el texto a buscar:")

      colum = InputBox("Ingrese el número de columna donde buscar:")

      Z = Cells(Rows.Count, 2).End(xlUp).Row

      cont = 0


      Range("B6").Select


      For k = 1 To Z - 6
      Cells(6, colum).Select


      ActiveCell.Offset(k, 0).Select



      If ActiveCell.Value = buscar Then

      cont = cont + 1


      MsgBox "Se encontraron " & cont & " coincidencias."

      TextBox1 = buscar


      End If

      Next k





      End Sub

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  7. Hola Sr. Adolfo Buenas tardes.. me llamo Eli.. tengo un codigo para busqueda que no logro que de un buen resultado.. quiza me puedan ayudar..
    ---------------------------------
    Es un formulario donde inserto numero de DNI y lo busca.. hasta ahora lo encuentra.. pero no se porque en lugar de devolverlo en el label que le indico.. me borra los datos.. o los vuelve a "0"...

    quisiera porfavor me pudieran decir en que me equivoco... y poder corregirme..

    CODIGO:

    Private Sub IBUSCAR_Click()

    Dim RESPUESTADNI As Single
    Dim RESPUESTANOMBRES As Double
    Dim RESPUESTAFNAC As Double
    Dim RESPUESTASISFOH As Double

    Dim n As Range
    Set n = Cells.Find(what:=txtFIND, MatchCase:=False)
    If n Is Nothing Then
    MsgBox "La Persona no se encuentra registrada en el Sistema", vbExclamation
    Else
    n = RESPUESTADNI
    n.Offset(0, 1) = RESPUESTANOMBRES
    n.Offset(0, 4) = RESPUESTAFNAC
    n.Offset(0, 6) = RESPUESTASISFOH

    resDNI.Caption = RESPUESTADNI
    resAPELLIDOS.Caption = RESPUESTANOMBRES
    resFNAC.Caption = RESPUESTAFNAC
    resSISFOH.Caption = RESPUESTASISFOH

    End If

    End Sub

    ResponderEliminar
  8. Holaaa mucho gusto estaba viendo que buenaa la explicación y el ejemplo pero de casualidad !! No Sabe O no tiene un ejemplo de una base de datos de una Joyeria en VBA con Excell con la que me pueda ayudar Gracias :D !!

    ResponderEliminar
  9. no lograron responder mi pregunta.. gracias de todas formas por el gran tutorial, logre aclarar mi duda, y conseguir que funcionara.. sin embargo, mientras mas lo avanzo, mas pesado se vuelve el archivo, y mas problemas me genera, y pues tuve que dejarlo, porque en esa data, necesito estar guardando cambios todo el tiempo y se me malograba el archivo.. gracias de todas formas.. buscare otra manera, quiza puro VB. o con PowerBuilder..

    ResponderEliminar
  10. Buenas Tardes Ing.Arnulfo,
    exelente ejemplo, pero como le puedo hacer para que los datos me los inserte a SQL 2005. Seria de gran ayuda grax!

    ResponderEliminar
  11. como puedo hacer que un cuadro de lista , dependa de un cuadro combinado, es decir, al seleccionar ej: un nombre en el combobox de una persona, en el cuadro de lista aparesca su respectiva información, sea esta direccion, telefono, etc.
    Gracias!

    ResponderEliminar
  12. Buenos Días, gracias por la explicación, me ha ayudado mucho. Quisiera pedirle un favor, necesito crear un formulario donde una vez introducidos todos sus datos me dirija a un determinado archivo que ya está creado, es decir, yo tengo una serie de documentos en pdf y necesito encontrarlos de forma rápida, creo que a través de un formulario de datos y con un hipervinculo podría resultar. Gracias de antemano

    ResponderEliminar
  13. Adolfo, hace unas semanas sigo fielmente tu blog para un sistema de remuneraciones que estoy haciendo. Te felicito!!
    Sabes, a mi me sale un error que segun he visto en foros de MS, es muy recurrente y se debe a falta de fm20.dll... Todo lo que he leido al respecto, es al problema de que no esta tal dll... pero yo si lo tengo en System32... Tengo W7 y Office 2010, todas sus actualziaciones al dia y ya no se que hacer... Si me redirigieras a un enlace donde poder solucionar, o tu tuvieras la solucion... Te lo agradeceria muchisimo!!

    ResponderEliminar
  14. Muy buena aportacion, me gusta mucho el Blog ya que estoy aprendiendo mucho de excel.. me gustaria tu ayuda quiero aprender a realizar formularios para rellenar pero no se como hacer para imprimirlos en paginas que ya tienen datos.. osea solo lo rellenado que se imprima si me puedes ayudar o dar un link donde pueda ver como hacer te lo agradeceria mucho..

    ResponderEliminar
  15. Sr. Adolfo,

    muchas gracias por este Blog es de gran utilidad.
    Tengo una duda, si ya tengo mas e 3000 contactos en excel y quiero introducirlos a traves de un User Form, hay alguna forma de hacerlo automaticamente?
    O deben ser 1 a 1?
    Sino, que sugiere? Access?

    SAludos desde Africa,
    Erika

    ResponderEliminar
  16. Muchisimas gracias!. Me sirvió de mucho para generar datos en inventarios.

    Saludos master!

    ResponderEliminar
  17. Excelente aporte. En lo personal estoy interesado en utilizar algún procedimiento parecido pero para PowerPoint.

    En otras palabras, ofrecer un PPT a un usuario para que al completar un formulario pueda luego insertarlo en una base de datos.

    Me pregunto si las técnicas que comentas aquí pueden ser trasladadas a PowerPoint VBA.

    ResponderEliminar
  18. Muy buena explicación, me ha servido de base para hacer mi propia macro. Me gustaría saber si se pudiera agregar un botón para "adjuntar un archivo" que al darle click aparezca una ventana en donde se puede buscar la ubicación de dicho archivo, después crear un botón para aceptar y que en la hoja de cálculo aparezca como un hipervínculo en una celda donde la macro vaciará el nombre de la persona que se registra. De antemano gracias por la atención prestada

    ResponderEliminar
  19. uso 2010 funciona bien y la adapte un poco con controles pero no encuentro en controles y useform como agregar un box de dato numerico

    ResponderEliminar
  20. hola...te agradeceria tu colaboracion.
    busco pasar de una pagina a otra con un combobox
    busque en internet y encontre este Ej:
    Private Sub ComboBox1_Click()
    Sheets(ComboBox1.Value).Select
    End Sub

    Private Sub UserForm_Activate()
    Dim Hoja As Worksheet

    For Each Hoja In ActiveWorkbook.Sheets

    ComboBox1.AddItem Hoja.Name

    Next Hoja

    Set Hoja = Nothing

    End Sub

    funciona bien y se hubica en la hoja al darle click,pero el problema es que tengo un libro con muchas hojas y se me es dificil cambiarles el nombre de numero de hojas (HOJA1,HOJA2....)a las pestañas POR UN DETERMINADO NOMBRE O PRODUCTO.
    Entonces organice la formula de esta forma, cambie esta parte y la puse asi:
    ComboBox1.AddItem Hoja.range("z1")
    porque?...en estas celdas de todas las hojas tengo nombres o productosy que con el combobox me aparecerian como una lista...y asi es ....y si sucede; aparece la lista pero biene lo malo;no se va a esa hoja determinada y al darle click aparece el error y se va por depuracion a esta parte de la formula:
    Sheets(ComboBox1.Value).Select

    mi pregunta; que parte de la formula esta mal enfocada que no selecciona la hoja y ocurre el error .gracias por su atencion

    ResponderEliminar
  21. buen dia Ingeniero, su explicacion me aclaro muchas dudas para crear mis primeros userforms, me plantee una pregunta, es posible que este userform lo manejen hasta 4 o mas personas a la vez, pero que toda la informacion que introduzcan vaya a un libro diferente a donde esta la userform y si es asi podria iluminarme en como hacerlo?

    ResponderEliminar
  22. Estimado Eduardo.

    Excel no es una aplicación que funcione bien como multiusuario. Para ello es recomendable utilizar Access que si es multiusuario.

    Aunque lo realmente aconsejable es la programación de un Formulario Web utilizando alguno de los lenguajes de programación clásicos que permiten crear aplicaciones en Web, como son: PHP, JAVA, ASP.

    Por ejemplo, se podría hacer una aplicación en PHP y con base de datos MySQL que luego se podría tratar con Excel. Esto es lo realmente recomendable, así podría crear una aplicación realmente profesional multiusuario y deslocalizada.

    Un saludo.

    ResponderEliminar
  23. Muchas gracias Adolfo por este instructivisimo aporte

    Saludos

    ResponderEliminar
  24. Excelente información. Como se podría actualizar la información que ya se ha guardado por medio de un userform.

    ResponderEliminar
  25. Ing. Muy buena explicacion y muy buen aporte para todos los que quieren seguir aprendiendo, le agradezco su apoyo.

    ResponderEliminar
  26. BUENAS TARDES ESTIMADO ADOLFO
    UNA CONSULTA. EL FORMULARIO FUNCIONA BIEN, PERO COMO YA TENGO MAS DE 5MIL FILAS, CADA VEZ QUE INGRESO, LEE DESDE EL INICIO, HASTA EL FINAL Y DEMORA UN POCO. COMO HACER PARA QUE VAYA DIRECTO A LA ULTIMA FILA SIN ESE RECORRIDO
    SALUDOS Y MUCHAS GRACIAS

    JACK

    ResponderEliminar