Formulario ActiveX de entrada de datos

Este artículo es la continuación del  post anterior. La diferencia consiste en que ahora vamos a crear un verdadero formulario, uno que aparece como ventana en la pantalla. Lo que se denomina formulario ActiveX.  No se preocupen por esa denominación pero si quieren saber algo más les dejo este link que les va a aclarar fácilmente el tema.
Tal vez nunca hayan intentado generar un formulario usando el editor de código VBA pero van a ver que no es muy difícil. La parte más complicada es el código para cargar el formulario pero como verán, para este ejemplo es muy sencillo.
Esta vez para que no se pierdan, lo voy a hacer primero con impresiones de pantalla, y luego les muestro el video.
-----------------------------------------------------------------------------------------------------------------------------
Pasos:
1.       El primer paso es entrar a la ventana programador. Para eso tiene que aparecer una pestaña llamada “programador” en la cinta de opciones. Si no aparece, depende de la versión de office que tengan la tienen que activarla.
a.       Excel 2007: Inicio >> Opciones de Excel >> Más Frecuentes >> Mostrar Ficha Programador en la Cinta de Opciones.
b.      Excel 2010: Inicio >> Opciones de Excel >> Personalizar >> agregar ficha programador.
2.       El segundo paso sería, ver las opciones de la cinta. Aparece una que dice Visual Basic, apretamos ahí y nos abre el editor de código de VBA. No se asusten,  es una ventana más solo hay que seguir unos sencillos pasos ahora.

3.       Estando en el editor vamos a la opción crear formulario como se muestra en la figura. Van a ver que aparece el formulario en su forma más primitiva, ahora vamos a tener que trabajar sobre él.



4.       El formulario tiene varias propiedades pero voy a hacer referencia a dos, que son importantes para este post.
a.       La primera es al nombre del formulario “name”. Que es el nombre que utilizamos para referirnos a él en el código.
b.      El segundo es la propiedad “caption” que es el nombre a mostrar del formulario.
Para ver estas propiedades debemos abrir la ventana de propiedades, podemos buscarla en las solapas o directamente apretar “F4”.
Ahora, en la lista de propiedades, a la propiedad “name” le ponemos un nombre, por ejemplo “ingreso”. Y a la propiedad “caption” le ponemos “ingreso al stock” por ejemplo.
5.       En este paso, lo que nos queda es ingresar los 4 campos del formulario. Para eso hay que utilizar el cuadro de herramientas del editor. De los controles elegimos el que dice “cuadro de texto” verán que el puntero del mouse es una cruz, nos movemos hasta el formulario y con clic izquierdo apretado dibujamos el cuadro de texto donde lo queramos. Este primero será el íd. Luego del cuadro de texto elegimos “etiqueta” y con el mismo procedimiento crearemos la etiqueta a la izquierda del cuadro de texto. Verán que aparece en la etiqueta por defecto con la palabra “label”, la deben cambiar por ID.


Para los otros campos proceder de la misma manera.
Para agregar la imagen, en el cuadro de texto elegimos “imagen” y posicionamos con el mouse el lugar donde ira la imagen. Verán que aparece vacía, para que aparezca la imagen que queremos debemos ir a las propiedades de la imagen y donde dice “picture”, a la derecha les dejara abrir el cuadro “examinar” donde podrán buscar la imagen en formato “*.bmp” que deseen.



6.       Ahora nos falta poco, nos queda agregar al formulario dos botones de comando. Uno que sea “aceptar” o “ingresar” y el otro que diga “cancelar” en caso que queramos cerrar el formulario y cancelar el ingreso.
Para crear los botones buscamos del cuadro de herramientas el control que dice “botón de comando”. Con el mismo procedimiento que usamos para los demás controles dibujamos el botón. Nos aparece con la palabra “command button” por lo que en las propiedades le cambiamos las dos propiedades que explicamos anteriormente “name” y “caption” por ejemplo “stock” e “ingresar” para este ejemplo. El botón cancelar le pueden cambiar el caption por “cancelar”.


7.       El último paso sería crear el código para los dos botones creados.
a.       Botón Cancelar: empezamos con el más fácil, este botón tiene que cerrar el formulario solamente.
Para introducir el código le damos doble clic sobre el botón y ponemos el siguiente código.
Private Sub CancelButton_Click()
‘descarga el formulario
Unload Me
End Sub
b.      Botón Ingresar: este el botón más importante, con el vamos a tener que hacer la mismas acciones que hacíamos con el formulario del post anterior. Estas acciones serían en la base de datos, agregar una fila de datos vacios y llenar luego los campos con los datos del formulario.
El código es el siguiente, es fácil de interpretar como verán.

Private Sub stock_Click()
   
‘Inserto una fila en la fila 5 de la hoja “Stock de productos”
Sheets("Stock productos").Rows("5:5").InsertShift:=xlDown, CopyOrigin: = xlFormat_ FromLeftOrAbove
   
‘esta cadena hace que el interior de las celdas de la fila 5 no tengan relleno.
 Sheets("Stock productos").Rows("5:5").Interior.Pattern = xlNone

‘se asigna al rango A5 el valor del cuadro de texto id.
 Sheets("Stock productos").Range("A5").Value = id

‘se asigna al rango B5 el valor del cuadro de texto producto.
 Sheets("Stock productos").Range("B5").Value = producto

‘se asigna al rango C5 el valor del cuadro de texto cantidad.
 Sheets("Stock productos").Range("C5").Value = cantidad

‘se asigna al rango D5 el valor del cuadro de texto desc.
 Sheets("Stock productos").Range("D5").Value = desc

 End Sub
Esos son todos los pasos. No falta nada, excepto probar el formulario. Para poder utilizarlo debemos tener algún botón para cargar el formulario. Para eso agregamos un botón de comando a la hoja e ingresamos el siguiente código
Private Sub Ingresar_Click()
Ingreso.Show
End Sub

----------------------------------------------------------------------------------------------------------------------------
En el video muestro una forma más adecuada para tratar el mismo código. Utilizando el método With.

Espero les sea útil, sobre todo a los que comienzan a ver el tema. Recuerden que pueden dejar un comentario, consulta o sugerencia.  Hasta la próxima!




Controles
Los controles generalmente tienen una denominación en inglés, en este artículo nos referimos a ellos con sus nombres en español.
Estas son los nombres que maneja el código de VB:
·         Cuadro de Texto : “Combobox”
·         Etiqueta : “Label”
·         Formulario : “Form”
·         Botón de Comando: “Command Button”
·         Imagen: “Frame”
Keys:
·         Formulario sencillo en Excel
·         Formulario de entrada de datos en Excel
·         Formulario ActiveX de entrada de datos en Excel

44 comentarios:

Unknown dijo...

Hola excel-ente amigo hice el formulario de ingreso de datos en VB pero siempre me guarda los datos en la hoja donde coloco el boton de ingreso que debo hacer para que el boton aparezca en una hoja pero me guarde los datos en otra hoja o libro

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por el comentario. Puedes hacernos cualquier consulta mediante el formulario de Contacto en el blog. En el artículo esta bien los códigos utilizados.
Sds

Wilmer dijo...

Saludos que bueno muchas gracias, esto me parece muy bien para nosotros los principiantes estoy haciendo un proyecto pronto lo molestare....

Rene Dominguez dijo...

Hola, muchas gracias estoy aprendiendo un monton, explicas muy bien, tanto que personas como yo que no se nada entiendo muy bien. ahora quisiera molestarte en el condigo para el boton de aceptar me da un error "Error de compilacion se esperaba una expresion" exactamente en esta linea
Sheets("Stock productos").Rows("5:5").InsertShift:=xlDown, CopyOrigin: = xlFormat_ FromLeftOrAbove

Excelminiapps dijo...

Hola Rene, cómo estas! Muchas Gracias por tus comentarios!

En cuánto al código, puede ser no te este tomando el Guión "_". Lo puedes borrar y juntar la parte que dice "xlFormatFromLeftOrAbove. Probablemente sea eso pero recuerda que este código es referencial. Cuando tienes dudas podrías grabar la macro para ver que tiene. Recuerda que nos puedes consultar directamente mediante el formulario de contacto. Saludos

Rene Dominguez dijo...

Gracias Joven!

Rene Dominguez dijo...

Hola otra vez, el proyecto en el que estoy trabajando va caminando y eso que no se mucho es decir poco de programacion y de macros, pero tu ayuda ha sido fabulosa, espero que puedas ayudarme en este problema que tengo ahorita, yo deseo abrir varias veces el mismo formulario, pero poder trabajar en ellos, pues deseo cerrarlo hasta terminar el proceso...
te pongo el código que uso
Public Sub OtraOrden_Click()
Dim frmCopia As New Ventas 'Ventas es el formulario que quiero ver dos veces
frmCopia.Show ' este es la copia
End Sub
Este es un boton que se encuentra en el formulario Ventas, me funciona pero no puedo trabajar en Ventas hasta que no cierre la copia, que puedo hacer?, gracias...

Excelminiapps dijo...

Hola amigo, cómo estas!

Recuerda que nos puedes escribir directamente por medio del formulario de consulta del blog. Esta hecho de esa manera, solo puedes trabajar en el formulario activo.
Saludos

Rene Dominguez dijo...

Gracias!

Elizasan19 dijo...

hola buenas como puedo hacer q cuando ingrese los datos apenas se escriban en las celdas en el formulario se borre sin tener q dar cancelar y volver a dar click en ingresar

Elizasan19 dijo...

por favor le estaria agradecida

Elizasan19 dijo...

disculpe si molesto demasiado pero en el caso del buscador tengo una variable q le puse de nombre codigo y nada que me sale los resultados al hacer la buscqueda le envio lo que tengo tanto en el boton de buscar como en el modificar

BOTON BUSCAR

Private Sub buscar_Click()

On Error Resume Next

cedula.Value = WorksheetFunction.VLookup(Val(codigo.Value), Sheets("").Range("B7:B22"), 3, False)
nombre.Value = WorksheetFunction.VLookup(Val(codigo.Value), Sheets("1").Range("B7:B22"), 4, False)
apellido.Value = WorksheetFunction.VLookup(Val(codigo.Value), Sheets("1").Range("B7:B22"), 5, False)
fecha.Value = WorksheetFunction.VLookup(Val(codigo.Value), Sheets("1").Range("B7:B22"), 6, False)
doctor.Value = WorksheetFunction.VLookup(Val(codigo.Value), Sheets("1").Range("B7:B22"), 7, False)
examen.Value = WorksheetFunction.VLookup(Val(codigo.Value), Sheets("1").Range("B7:B22"), 8, False)
cancelo.Value = WorksheetFunction.VLookup(Val(codigo.Value), Sheets("1").Range("B7:B22"), 9, False)


End Sub



BOTON MODIFICAR

Private Sub modificar_Click()

bus_codigo = WorksheetFunction.Match(Val(codigo.Value), Sheets("1").Range("B7:B22"), 0) + 4
With Sheets("base de datos")

.Range("C" & bus_codigo).Value = cedula.Value

.Range("D" & bus_codigo).Value = nombre.Value

.Range("E" & bus_codigo).Value = apellido.Value

.Range("F" & bus_codigo).Value = fecha.Value

.Range("G" & bus_codigo).Value = doctor.Value

.Range("H" & bus_codigo).Value = examen.Value

.Range("I" & bus_codigo).Value = cancelo.Value

End With

End Sub

Excelminiapps dijo...

Hola amiga, cómo estas!
Recuerda que tienes que tratar de entender primero lo que estas haciendo y lo que hace el código, no es solo tratar de copiar el código y reemplazar variable. Por supuesto es de gran ayuda tener el código para verlo, para estudiarlo pero de esa manera no podrás aprender en realidad cómo es. En este caso, te recomendaríamos que trates solo con una variable y con un solo a ingresar así ves como es y puedes estudiarlo ya que el resto es prácticamente lo mismo. Probablemente no te ande porque tienes que cambiar la variable "name". Esperamos tus comentarios. Saludos

Unknown dijo...

Hola!, muy bueno el tutorial! tengo una consulta.
Yo necesito que los nuevos ingresos NO vayan apareciendo sobre los anteriores,
sino por el contrario, que los nuevos aparezcan al final de la planilla.

Intenté modificar algunas cosas pero no pude conseguir hacerlo.

Me podrías dar una mano?

Muchas gracias!

Excelminiapps dijo...

Hola amigo, cómo estas! Recuerda que en los artículos a veces se plasman cosas que ya se han visto en otros para no redundar y mostrar el objetivo del artículo. En este caso para apilar los datos debajo, hay artículos previos. Revisa la lista de artículos que seguramente lo encontrarás. De otra manera nos contactas. Saludos

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

bueanas!! estoy aprendiendo mucho con ustedes pero tengo el mismo problema que Juan Pablo Torres, he buscado el tutorial y me sale que el blog a sido borrado, necesitaria si lo podrian volver a subir ya que es un vinculo fundamental en mi proyecto. gracias

Excelminiapps dijo...

Gracias por tu comentario amigo! Estaba mal el vínvulo en "post anterior" pero recuerda que todos los artículos están listados en la página "lista de artículos". Saludos

Unknown dijo...

perdon, el comentario es de Alan Garcia

Unknown dijo...

Hola que tal, no encuentro el video completo de busqueda inteligente en excel, me falta la parte en que no se muestra toda la lista sino que solo los que coninciden con las palabras que ingreso

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar. Revisa el canal en youtube "Excelminiapps" que ahí están todos los videos.
Saludos

Unknown dijo...

Buenas noches amigo, desearía saber si me podría ayudar a encontrar una manera de crear una macro que me permita ubicar una celda (insertando anteriormente la cédula de un trabajador) y luego insertar unos datos en esa misma fila, pasando los datos que estaban en esta a otra fila. De antemano, muchas gracias. Y disculpe las molestias causadas.

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
En cuanto a tu consulta, ya tenemos ese artículo en el blog. Revisa la lista y verás que hay uno que dice "Formulario de modificación, ingreso, ... de datos".
Esperamos tus comentarios.
Saludos

Unknown dijo...

hola tengo una pregunta, mira me funciona todo guarda y modifica, le agregue unas listas desplegables, necesito lo siguiente que en un textbox1 pueda escribir un monto y que en el siguiente textbox2 se calcule por un % y en el siguiente se calcule del anterior otro %.
ej
monto
textbox1 100.000.000
1er calculo
textbox2 se divida por /0,98 2.040.816
2do calculo
textbox3 el calculo anterior se *0,19 387.755 sin desimales

alguna idea

Unknown dijo...
Este comentario ha sido eliminado por un administrador del blog.
Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
En cuanto a tu consulta, las operaciones aritméticas son fáciles de hacer entre formularios o los puedes hacer en celdas y las pasas a los formularios.
Esperamos tus comentarios.
Saludos

Unknown dijo...

Hola Juan, me has salvado el pellejo he tenido problemas para habilitar una base de datos que me sirva como agenda de tareas y con este tutorial lo e logrado, sabes no se si seria molestia q me.pudieras ayudar a mejorarlo y de paso queda bien lo donaré para blog en caso q otros lo ocupen gracias!!

Excelminiapps dijo...

Hola amigo, cómo estas! Nos alegran tus comentarios.
Saludos

Unknown dijo...

Hola Juan. Quería ver si me puedes ayudar, sabes quiero saber si puedo cambiar el título de mi formulario pero hacerlo desde la hoja de Excel, por ejemplo si tu título en la base de datos de Excel se llama Kiosco que formulario lleve el mismo nombre y q si lo cambias de Excel también cambié en el formulario ayudame si a veces uso este mismo para otras cosas y sólo ocupó cambiar el nombre si necesidad d estar ingresando al VB.

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por tus comentarios!
En cuanto a tu consulta, claro que se puede hacer. Eso es lo de menos, es decir que solo tienes que pensar un poco. Para definir los parametros de inicio del formulario usas "Form_initialize()".
Esperamos tus comentarios.
Saludos

Eduardo Gomez dijo...

Hola buenas tardes amigo, me ha resultado muy util, no se si es un error al digitarla pero esta es la macro que estoy utilizando

Private Sub Ingresar1_Click()
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows("282:282").Select

With Sheets("Empleados")

.Range("B282").Value = Cod1
.Range("C282").Value = Nom1
.Range("D282").Value = Num1
.Range("E282").Value = Fec1
.Range("F282").Value = Tip1
.Range("G282").Value = Sue1
End With

Ingresar.Cod1.Value = ""
Ingresar.Nom1.Value = ""
Ingresar.Num1.Value = ""
Ingresar.Fec1.Value = ""
Ingresar.Tip1.Value = ""
Ingresar.Sue1.Value = ""

End Sub

mi problema es que funciona de maravilla añade los datos del formulario perfecto, pero al cerrarlo y volver a abrirlo reemplaza el ultimo valor que añadi te agradeceria que me ayudaras con este problema

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por comentar!
En cuanto a tu consulta, obviamente hay algo mal en el código. Lo que decimos siempre de esto es que parte de una macro que luego se modifica. Si la grabas siguiendo los pasos correctos no tendrás problema, seguramente se trata de eso. Esperamos tus comentarios.
Saludos

Eduardo Gomez dijo...

muchas gracias ya lo solucione fue mi error olvide la parte de la macro para que el interior de las celas no tenga relleno

Excelminiapps dijo...

Gracias a ti Eduardo. Saludos

JOHN dijo...

Hola Juan Pablo....te agradezco informar que debo hacer para que el boton aparezca en una hoja pero me guarde los datos en otra hoja o libro...Gracias

Excelminiapps dijo...

Hola amigo,cómo estas! Cambias el nombre de la hoja en el código. Eso es todo. Sino sabes cómo hacerlo utiliza una macro de prueba y verás el código también.
Saludos

Unknown dijo...

Hola Juan, estoy armando una macro de carga de datos. Todo funciona bien, el unico inconveniente es que me carga todos los datos como texto y yo los quisiera en numeros

Excelminiapps dijo...

Hola Amigo, cómo estas! Gracias por escribirnos!
En cuanto a tu consulta, no habría problemas solo deberías revisar el formato en el cual pasas los datos de un lugar a otro.
Esperamos tus comentarios.
Saludos

Unknown dijo...

Hola juan pablo! soy de argentina me interesa tu trabajo.
tengo una panadería y he armado unas plantillas para las elaboración diaria de los panaderos me gustaría hacer un formulario para facilitarles el trabajo a ellos, pero por mi ignorancia se me hace muy difícil entender y llevarlo a cabo, he visto muchos vídeos tuyos pero ninguno es similar a lo que yo quiero aplicar!
por favor si no es mucha molestia contactarte con migo y darme algunos consejos me seria de una gran ayuda.
te dejo mi e-mail para poder contactarnos!
Nicolas-carabajal@hotmail.com
Muchas gracias por la ayuda que le das a tanta gente!

Excelminiapps dijo...

Hola Amiga, cómo estas! Muchas Gracias por el contacto y tus comentarios!
Exactamente, no tenemos ningún articulo similar pero si nos cuentas un poco de qué se trata y podemos crear algún articulo para compartir sería bueno.
Nos puedes escribir mediante el formulario de contacto de esta pagina y no tardamos en contestar.
Esperamos tus comentarios.
Saludos

Preinscripcion_Ciprin dijo...

buenas tardes, no comprendo el codigo de grabar nuevo, ya que en el video hay un codigo y en el blog hay otro diferente, sin embargo con cualquiera de los 2 me aparece un error en el renglon
.Rows("2:2").InsertShift:=xlDown, exactamente en la parte donde esta :=xlDown

Excelminiapps dijo...

Hola amigo, cómo estas! Gracias por escribirnos!
En cuanto a tu consulta, ese código es el que te da la macro cuando graba en la acción de insertar los datos después de cortarlos. Es decir, no escribimos ese código. Para verificar el funcionamiento deberías hacer lo que recomendamos que es grabar la macro con las acciones que realizas y luego revisar el código.
Esperamos tus comentarios.
Saludos

Catalina Sierra,Camil Muñoz,Carlos Arturo Goméz, Diego Acevedo dijo...

Hola, hice todos los pasos pero siempre que agrego algo nuevo se reemplaza en la fila 1, por lo cual no me crea la lista.

Excelminiapps dijo...

Hola amigo, cómo estás? Gracias por escribirnos!
En cuanto a tu consulta, tienes que comprender perfectamente qué hace que parte del código. De esta manera detectarás dónde está el problema.
Saludos