Automatización de procesos empresariales en Excel o cómo salvar a una niña del procesamiento

Mi novia se dedica a compras en la red de distribución. Recientemente, la compañía ha sufrido una gran reducción, por lo que la cantidad de trabajo por empleado ha aumentado dramáticamente. Por lo tanto, tenía que quedarse regularmente en el trabajo, a veces incluso salir los sábados. Sus colegas tenían el mismo problema.

imagen

Sobre la decisión que permitió a mi novia regresar a casa a tiempo, puedes leer debajo del corte.

Además, una parte importante de lo que hicieron se puede automatizar: recibir datos desde el frente, completar documentos de Excel, actualizar datos en el frente, etc.

Lo más razonable que se puede hacer en esta situación es escribir una declaración de trabajo sobre el desarrollo de la funcionalidad necesaria y pasarla a los desarrolladores a través de las autoridades. Sin embargo, la reducción afectó a todos, incluidos los desarrolladores. Como resultado, no tenían suficientes recursos para implementar esta automatización. Y la compañía no planeaba comprar sistemas RPA especializados en el futuro previsible.

Además, una mayor supervisión de lo que hacen los empleados en el trabajo y en qué aplicaciones trabajan.

Basado en el resultado de todas estas circunstancias adversas y mi deseo desesperado de ayudar, decidí escribir funciones para Excel en VBA, gracias a lo cual sería posible automatizar las operaciones de rutina de mi novia y sus colegas.

Requisitos del producto


Como punto de partida, elegí la tarea para la cual la niña pasaba la mayor parte de su tiempo de acuerdo con sus sentimientos. Como parte de esta tarea, la niña necesitaba:

  • Transfiera el número de artículo del archivo de Excel a la barra de búsqueda del sistema de recepción;
  • Para este artículo, de los resultados de búsqueda, obtenga la compra, el precio de venta, una cantidad de valores adicionales;
  • Procese los datos recopilados en Excel para crear el precio final del producto;
  • Sube los precios al sistema.
  • La descarga y posterior carga de datos por día tomó aproximadamente 3 horas.

Dado que mi novia no tenía conocimientos de programación, era necesario hacer una herramienta con una interfaz simple y familiar en forma de funciones en Excel. Las secuencias de acciones deben definirse simplemente como una secuencia de funciones. En una palabra, BESO .

Basado en este caso, formé los siguientes requisitos funcionales:

  • Controle el mouse (movimiento, pulsación de tecla) para resaltar los elementos correspondientes en la pantalla;
  • Simule una pulsación de tecla en el teclado para ingresar datos;
  • Transfiera datos de Excel a aplicaciones de terceros;
  • Recuperando datos de una aplicación en Excel;
  • Realizar las mismas operaciones al extraer una fórmula en Excel.

El raton y las primeras dificultades


Antes de mover el cursor a cualquier lugar, debe comprender exactamente dónde moverlo. Me parece lo más apropiado en esta situación simplemente recordar la posición del cursor cuando está sobre un determinado elemento. Para recordar las coordenadas, utilicé la función GetCursorPos de la biblioteca user32.

Bueno, tenemos las coordenadas, ahora sería bueno recordarlas. Bueno, pensé que no hay nada complicado, solo cuente una o dos celdas de la celda activa y escriba las coordenadas X e Y. Sin embargo, ActiveCell.Offset (0, 1) .Value = x no funcionó. El valor no ha cambiado. Y como resultado de la ejecución, un error. Después de verificar varios supuestos, resultó que cambiar el valor en la hoja conduce a un recuento de toda la hoja y, por lo tanto, a la fórmula que causa este recuento. Para evitar esta limitación, en lugar de una llamada directa desde una función de ciertas acciones, fue necesario reemplazar estas llamadas con Evaluar, lo que nos permitió lograr el resultado deseado.

El resultado fue la función PrintCursorPosition (), que registró en dos celdas a la derecha la posición del cursor en el momento en que se ejecutó la función. Era necesario escribir PrintCursorPosition () en el área para ingresar fórmulas, mover el cursor y presionar enter en el teclado.

Para mover el mouse, utilicé SetCursorPos de la misma biblioteca user32. Para usar esta función, necesitaba pasar el valor de las coordenadas xey que se le habían almacenado previamente como entrada. Usando SetCursorPosition (x, y), pude mover el cursor sobre las coordenadas almacenadas previamente. El primer resultado visible. ¡Hurra!

Para simular acciones del mouse, usé mouse_event de la misma biblioteca user32. Al pasar las banderas de las teclas a la entrada, pude simular las pulsaciones de las teclas correspondientes. Inicialmente, planeé escribir una función MouseButtonPrees (flag), donde flag es la designación de la tecla presionada, pero después de la primera demostración, la niña se dio cuenta de que era mejor reemplazar el grupo de funciones LeftClick (), RightClick () y DoubleClick (). Este enfoque facilita la lectura de la función resultante.

Teclado


En VBA, hay una instrucción SendKeys que realiza todas las acciones necesarias. El texto se pasa fácilmente a la función por referencia a la celda y se cumple sin problemas. Sin embargo, presionar teclas especiales (Intro, Tabulador, Alt, Ctrl, flechas del teclado, etc.) causó rechazo (para presionarlas, era necesario escribirlas entre llaves {ENTER}). Por lo tanto, para los más utilizados, escribí funciones como PressEnter (). Para los que rara vez se usan, creé una hoja de trucos en el mismo documento.

La información se transfirió entre el sistema y Excel mediante la copia al búfer y el pegado del búfer. La copia al búfer se realizó esencialmente simulando presionar Control + C, después de lo cual los datos del búfer se llevaron a MSForms.DataObject y se transfirieron a una celda específica.

Pruebas y problemas de rendimiento


Los problemas comenzaron de inmediato.

El proceso de escribir una secuencia de comandos de acciones consiste en elaborar pequeños grupos de acciones y combinarlas en una sola. Pero al cambiar a una celda libre, toda la secuencia se resolvió de inmediato, lo cual fue extremadamente molesto, especialmente si el tiempo que tomó el grupo de acciones tomó más de 10 segundos. Para resolver este problema, verifiqué la presencia en el texto de la fórmula de la celda activa del nombre de la función. Ayudó

Además, durante las pruebas, agregó la función de espera WaitS (segundos) y WaitMS (milisegundos), para realizar un seguimiento de lo que funcionó y lo que no funcionó. Se basa en la suspensión de la biblioteca kernel32. La diferencia entre WaitS y WaitMS es que en WaitMS el tiempo está en milisegundos y en WaitS en segundos.

Otro problema fue la ejecución inconsistente de las funciones cuando se introdujo en las celdas. Esto se debió al cálculo asincrónico de Excel. Distribuyó el cálculo de cada celda a diferentes procesadores. Como resultado, la secuencia se ejecuta primero en la celda dos, luego en la quinta, luego en la tercera, etc. Además, las secuencias mismas se llevaron a cabo de principio a fin sin ningún problema. Para deshacerme de este comportamiento, desactivé los cálculos de subprocesos múltiples en la configuración de Excel (Configuración de Excel -> Avanzado -> Fórmulas).

Resultados


Después de explicar cómo trabajar con todo esto y aprender a usarlo, lanzó a su novia para automatizar los procesos en la empresa de una manera tan desagradecida.

Gracias a dicha automatización, resultó reducir el tiempo de tres horas a 30 minutos. Al mismo tiempo, la automatización permitió cambiar ligeramente el enfoque del proceso de carga y descarga de datos. Ahora la descarga ocurre durante el tiempo en que mi novia se va a almorzar y carga por la noche. Por lo tanto, podemos decir que la carga disminuyó en casi la mitad del día laboral, lo que permitió a mi novia regresar a casa a tiempo y podemos hacer cosas más interesantes que la automatización.

Source: https://habr.com/ru/post/447346/


All Articles