miércoles, 22 de enero de 2014

Macro para ingresar ordenes de pedidos a una base

Uno de los grandes problemas de algunas empresas que no han actualizado sus formas de trabajo (como es el caso de Upmetal) es que no cuentan con un sistema que resuma las distintas ordenes y presupuestos que hacen los clientes a la empresa. Para ayudar a lograr este objetivo se propone una macro que ingrese los pedidos a una gran base de pedidos y que además les entregue un número de identificación (Id) a cada pedido.

La idea es lograr que mediante una interfaz como la siguiente:

 El departamento de ventas pueda ingresar datos que vayan llenando una base de datos como la siguiente:


Para lograr esto es que utilizaremos la herramienta de formularios (userforms) que nos ofrece Visual Basic.

Lo primero que debemos hacer es saber abrir la opción de generar nuevos formularios en nuestro proyecto. Para esto damos click derecho en cualquier lado del espacio en donde se muestran los formularios y módulos existentes en nuestro proyecto, vamos a insertar y clickeamos sobre la opción "UserForm".


En nuestra pantalla aparecerá el siguiente cuadro de trabajo:

Como podemos ver, el programa nos ofrece una cantidad de opciones para editar un cuadro de información; el cual se encuentra bajo el nombre "Cuadro de herramientas". También podemos editar la forma y vista de nuestra userform con la tabla que podemos ver en la ezquina inferior izquierda de la imagen. En nuestro caso le cambiaremos el nombre, de "userform1" (nombre estándar) a "Clientes".

El siguiente paso es llenar nuestro cuadro de la información que queremos que tenga. Lo primero es ingresar el texto que queremos que tenga, para esto vamos al cuadro de herramientas y clickeamos sobre la segunda opción (que es representada por una A mayúscula). Lo dibujamos con el tamaño que queramos sobre nuestra ventana userform y le damos el nombre que queremos que aparezca en la ventana:


Una vez habiendo nombrado la etiqueta; ingresamos el campo de texto que queremos que se vaya rellenando en nuestra ventana (por ejemplo si la etiqueta dice Nombre; un campo de texto en donde el usuario pueda ingresar su nombre); para esto nos dirigimos nuevamente al cuadro de herramientas y damos click sobre la tercera opción de este (es representado por un "ab"). Una vez que este se haya establecido del tamaño que queramos se aconseja cambiarle el nombre al del valor que representa (por ejemplo: "Nombre"), más adelante veremos porque esto es importante. Lo anterior se hace de la misma manera en que le cambiamos el nombre a nuestra userform (en la esquina inferior izquierda de nuestra pantalla).


Repetimos los dos pasos anteriores todas las veces que sea necesario, es decir toda la información que queramos incluir en nuestra base.

Una vez que tengamos lo anterior listo podemos  ingresar los botones que van a realizar la acción que nosotros mandemos en la macro. Para esto vamos al cuadro de herramientas y damos click sobre el décimo icono (un dibujo que busca asemejarse a un botón rectangular).


Una vez habiendo diseñado el botón a nuestro gusto y habiéndole puesto el nombre que queramos (en nuestro caso lo denominaremos "Ingresar"), damos doble click sobre el botón y aparecerá la siguiente ventana en nuestra pantalla:


Es en esta ventana donde programaremos gran parte de nuestra macro.

Lo primero que debemos generar es una variable local auxiliar que nos permita generar los id automáticamente para cada pedido y además que nos permita ordenar la información de la base sin necesidad de tocar esta. Para esto utilizaremos una local que vaya contando las celdas como auxiliar; esta la definiremos de la siguiente manera (Base es el nombre que le dimos a la hoja de cálculo en que queremos que se realice la acción):

Dim m As Integer

m = Application.WorksheetFunction.CountA(Sheets("Base").Range("A1:A1000"))

Una vez que tenemos lo anterior, podemos generar la macro que va automáticamente asignarle un Id a cada pedido que ingresemos. Lo anterior es tan simple como igualar el cuadro en que queremos que se sitúe la id a nuestra variable m.

Sheets("Base").Range("A6").Offset(m, 0).Value = m

Como queremos que la variable vaya bajando de una fila a la vez, incluimos en nuestra instrucción un offset que vaya bajando el número de filas según la cantidad de nuestra variable local "m" (es importante que en range pongamos el número de una fila superior a la primera que queremos que rellene, ya que el primer valor para m es igual 1).

Ahora tenemos que conectar la información que vamos rellenando en nuestra userform a las celdas de la base. Para esto debemos igualar la celda que esperamos rellenar con el valor del cuadro de texto que queramos conectar. Si el cuadro de texto que eremos conectar lo denominamos como "Cliente1" y nuestra userform como "Cliente" entonces la instrucción debiese tener la siguiente forma:

Sheets("Base").Range("B6").Offset(m, 0).Value = Cliente.Cliente1.Value

Lo anterior lo repetimos para todos los cuadros de texto que se deban rellenar. Una vez que hayamos completado esto, podemos ordenar que una vez que se hayan enviado los datos,  los cuadros de texto se borren; para esto tenemos que programar el siguiente código para cada cuadro:

Cliente.Cliente1.Value = ""

De esta manera habremos terminado nuestro botón de "Ingresar"; si queremos ingresar otro botón para cerrar el cuadro de texto seguimos el mismo proceso de crear un botón y simplemente le damos la siguiente instrucción:

Sheets("Menú").Select
Sheets("Menú").Visible = True
Cliente.Hide

En el último paso estaríamos "escondiendo" nuestra ventana y haciendo visible nuestro menú.

Finalmente nuestra ventana se vería como algo similar a lo siguiente:


El siguiente paso sería conectar nuestra userform a nuestro menú de interfaz en excel; para esto necesitaremos programar una pequeña macro. Damos click derecho sobre la pantalla en el mismo espacio donde clickeamos para generar nuestro formulario, sólo que ahora seleccionamos la opción de crear un módulo:


Y nos aparecerá una ventana como la siguiente:


En esta ventana debemos programar una macro que nos haga aparecer nuestra userform. Esta macro sería tan simple como lo siguiente:

Sub boton()
Cliente.Show

End Sub

Luego en nuestro excel insertamos un botón y le asignamos la macro anterior. Podemos generar otra macro que nos permita ver la base de datos, la que llevaría la siguiente instrucción:

Sub Mostrar()

Sheets("Base").Visible = True
Sheets("Base").Select
End Sub

Le asignamos esta base a otro botón en nuestro excel y llegamos al menú que nos habíamos propuesto en un principio; el cual con el click de un botón nos mostrará lo siguiente:

Si le damos click a "Ingresar", nuestra base se verá de la siguiente manera:


De esta manera cumplimos nuestro objetivo.

Si quieren ver como funciona la macro, pueden clickear sobre el siguiente enlace (¡No olviden habilitar las macros!): https://www.dropbox.com/s/2m0pjs8strtrvnz/Blog2.xlsm

No hay comentarios:

Publicar un comentario