Acelerar los procesos administrativos en Excel

por | Ago 5, 2020 | Excel, Macros, Visual Basic | 0 Comentarios

En este artículo vamos a ingresar datos para un caso determinado, como es el ingreso de facturas en Excel, de una manera mucho más rápida.

Vamos a usar las Macros de Excel para lograr una automatización del ingreso de datos usando como lenguaje de programación Visual Basic.

La idea de este ejercicio es ingresar facturas de forma automática, en el cual nos proporcionan un fichero con 7 campos:
• Número
• Fecha
• Proveedor
• Importe
• IVA
• Importe IVA
• Tota
l

La idea es que podamos introducir cada uno de estos parámetros a partir de una Macro, que nos vaya pidiendo los datos a partir de cuadros de inserción de texto y que los datos introducidos estén dentro de un rango de caracteres.

1. Inserción de tabla

La tabla que vamos a usar como ejemplo tendrá el siguiente aspecto, como bien se explico en el Planteamiento:

2. Apertura del programador

Debemos abrir el programador de Excel y acudir al apartado Visual Basic. Para ello, debemos habilitar el Programador que no viene activado por defecto ¿como lo activamos?:

  • Abrimos la hoja de Excel, vamos al apartado Archivo/Opciones/Personalizar cinta de opciones
  • Activamos la opción Programador en Pestañas principales
  • Ahora podemos observar como en la cinta superior de opciones aparece Programador
  • Clicamos en Visual Basic
  • Una vez dentro, clicamos en Insertar/Modulo y ya podemos empezar a implementar nuestro código

3. Declaración de variables

Una vez abierto el módulo en Visual Basic, vamos a empezar a escribir código y en primer lugar debemos proceder a la declaración de todas las variables que vamos a usar en nuestro código.

Dim msj As String
Dim est As String
Dim def As Variant
Dim numfact As Integer
Dim fechafact As Date
Dim provfact As String
Dim impfact As Single
Dim ivafact As Integer
Dim Iva As Single
Dim ImpIva As Single
Dim Total As Single
Dim Respuesta1 As String
Dim Respuesta2 As String

4. Inicialización

Vamos a comenzar con el código realizando una inicialización, apuntando a la celda “A1” de la “hoja1”. Esto se suele realizar porque desconocemos que movimientos pudo haber antes de que se ejecutara la macro y podrían afectar al desarrollo de la misma.

Sheets("hoja1").Select
Range("A1").Select

5. Código para inserción de datos

Ahora vamos a implementar el código para insertar los datos en cada columna de las dadas en el fichero.
Para la columna Número necesitamos que el usuario introduzca un número y que este no sea un 0, en caso contrario aparecerá un mensaje de aviso de que el valor introducido es necesario que siga estas pautas, posteriormente se le permitirá al usuario repetir la inserción del valor .El código a implementar sería el siguiente:

numerofact:
 msj1 = "Introduzca numero de factura"
 est1 = "Numero de factura"
 def1 = 1
 numfact = InputBox(msj1, est1, def1)
 If numfact = 0 Then GoTo numerofact
 If IsNumeric(numfact) = False Then
   Advertencia = "Escribe un número que no sea 0"
   Aviso = MsgBox(Advertencia, vbCritical)
   GoTo numerofact
 End If

Para la columna Fecha necesitamos que el dato introducido sea formato fecha, por tanto para este caso el código será el siguiente:

fechafact:
 msj2 = "Introduzca fecha de factura"
 est2 = "Fecha de factura"
 def2 = Date
 fechafact = InputBox(msj2, est2, def2)
 If IsDate(fechafact) = False Then GoTo fechafact

Para la columna Proveedor necesitamos que el campo no este vacío, por tanto para este caso el código será el siguiente:

proveedor:
 msj3 = "Introduzca proveedor de factura"
 est3 = "Proveedor de factura"
 def3 = "proveedor"
 provfact = InputBox(msj3, est3, def3)
 If provfact = "" Then
   Advertencia = "Escribe un valor"
   Aviso = MsgBox(Advertencia, vbCritical)
   GoTo proveedor
 End If

Para la columna Importe necesitamos que el campo sea numérico, usamos el siguiente código:

importefact:
 msj4 = "Introduzca importe de factura"
 est4 = "Importe de factura"
 def4 = 1
 impfact = InputBox(msj4, est4, def4)
 If IsNumeric(impfact) = False Then
   Advertencia = "Escribe un valor numérico"
   Aviso = MsgBox(Advertencia, vbCritical)
   GoTo importefact
End If

Para la columna IVA necesitamos que el campo sea numérico, usamos el siguiente código:

ivafactura:
 msj5 = "Introduzca IVA de factura "
 est5 = "IVA de factura"
 def5 = 16
 ivafact = InputBox(msj5, est5, def5)
 If IsNumeric(ivafact) = False Then
   Advertencia = "Escribe un valor numérico"
   Aviso = MsgBox(Advertencia, vbCritical)
   GoTo ivafactura
End If

Una vez que se han establecido todas las ventanas de inserción de datos con sus determinadas condiciones vamos a la parte de escribir los valores almacenadas en las variables en las celdas, de acuerdo con la columna que corresponda a cada una.


Primero hay que localizar la última celda donde hay datos, posteriormente guardamos el valor de la fila en cuestión y le sumamos 1 para saber en que punto hay que escribir la siguiente factura sin sobrescribir ninguna de las anteriores, esto lo conseguimos con el siguiente código:

Selection.End(xlDown).Select
 filaactiva = ActiveCell.Row
 filaactiva = filaactiva + 1

Gracias a la función Selection.End(xlDown).Select podemos seleccionar la última celda de la columna seleccionada donde haya datos , que si recordamos habíamos establecido la selección actual en la celda “A1”con el comando Range(“A1”).Select .
Sabiendo en que fila se encuentra la siguiente escritura en nuestro documento procedemos a la misma.


Iremos introduciendo cada valor almacenado en los InputBox en la columna que corresponda, ya que la fila ya la tenemos seleccionada. Vamos a mencionar dos formas de escribir los valores, la primera es la forma con la que venimos escribiendo valores en el resto de ejemplos:

Cells(filaactiva, 1).Value = numfact

La otra manera se basa en seleccionar la celda en la queremos escribir y después usar la función ActiveCell, que selecciona la celda activa, e igualarla al valor deseado:

Cells(filaactiva, 1).Select
 ActiveCell = numfact

Cualquiera de las dos formas es válida, la primera se podría decir que al tener menos líneas de código es algo mas práctica dado que la depuración del código es importante cuando te encuentras con muchas líneas de programación.

Para el resto de ejemplos, el código contendrá lo siguiente:

Cells(filaactiva, 1).Value = numfact
Cells(filaactiva, 2).Value = fechafact
Cells(filaactiva, 3).Value = provfact
Cells(filaactiva, 4).Value = impfact

Para el caso del Iva necesitaremos dividir entre 100 el valor introducido en el InputBox , dado que el valor de la celda tiene un formato porcentaje y nos multiplica el valor por 100 de forma automática:

Cells(filaactiva, 5).Value = ivafact / 100

Después necesitamos guardar el valor del IVA en una variable para posteriormente calcular cuánto será el importe del IVA:

Iva = ivafact / 100
ImpIva = Iva * impfact
Cells(filaactiva, 6).Value = ImpIva

Finalmente calculamos el valor total, es decir, el importe más el IVA:

Total = impfact + ImpIva
Cells(filaactiva, 7).Value = Total

Una vez hemos introducido los datos, pasamos a la etapa en la que preguntamos al usuario si los datos introducidos son correctos, y de no serlo, los eliminará. Esto lo llevaremos a cabo mediante un cuadro de decisión:

mensaje1 = "¿son buenos los datos introducidos?"
estilo1 = vbYesNo + vbCritical
titulo1 = "Verificación de factura"
Respuesta1 = MsgBox(mensaje1, estilo1, titulo1)
If Respuesta1 = vbNo Then
 Rows(filaactiva).ClearContents
End If

En este tramo de código se encuentra la función Rows(filaactiva).ClearContents , esta función se encarga de borrar el contenido de la fila. De manera que si se responde que no se está de acuerdo con los datos introducidos, se hará efectiva la función, borrando el contenido de la fila.

Para Terminar el ejercicio, se preguntará al usuario que si quiere continuar insertando facturas, de ser afirmativa la respuesta volverá a repetir todo el proceso anterior, y de ser negativa finalizará la macro. Esto se llevará a cabo mediante el siguiente código:

mensaje2 = "¿desea ingresar más facturas?"
estilo2 = vbYesNo + vbQuestion
titulo2 = "seguir ingresando facturas"
Respuesta2 = MsgBox(mensaje2, estilo2, titulo2)
If Respuesta2 = vbYes Then GoTo Inicio

Se coloco una etiqueta al principio del código llamada Inicio para volver a ella si esta respuesta fuera afirmativa.

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada.