Automatisation des processus métier dans Excel ou comment sauver une fille du traitement

Ma copine est engagée dans des achats dans le réseau de distribution. Récemment, l'entreprise a subi une forte réduction, de sorte que la quantité de travail par employé a considérablement augmenté. Par conséquent, elle devait rester régulièrement au travail, parfois même sortir le samedi. Ses collègues avaient le même problème.

image

À propos de la décision qui a permis à ma petite amie de rentrer chez elle à l'heure, vous pouvez lire sous la coupe.

De plus, une partie importante de ce qu'ils ont fait peut être automatisée: recevoir des données du front, remplir des documents Excel, mettre à jour les données du front, etc.

La chose la plus raisonnable qui pourrait être faite dans cette situation est d'écrire un énoncé des travaux sur le développement des fonctionnalités nécessaires et de le transmettre aux développeurs par le biais des autorités. Cependant, la réduction a touché tout le monde, y compris les développeurs. Par conséquent, ils ne disposaient pas de suffisamment de ressources pour mettre en œuvre cette automatisation. Et la société n'a pas prévu d'acheter des systèmes RPA spécialisés dans un avenir prévisible.

En outre, une surveillance accrue de ce que les employés font au travail et dans quelles applications ils travaillent.

Sur la base du résultat de toutes ces circonstances défavorables et de mon désir désespéré d'aider, j'ai décidé d'écrire des fonctions pour Excel en VBA, grâce auxquelles il serait possible d'automatiser les opérations de routine de ma petite amie et de ses collègues.

Exigences du produit


Comme point de départ, j'ai choisi la tâche pour laquelle la fille passait le plus de temps en fonction de ses sentiments. Dans le cadre de cette tâche, la fille avait besoin de:

  • Transférez le numéro d'article du fichier Excel vers la barre de recherche du système de front-office;
  • Pour cet article, à partir des résultats de recherche, obtenez l'achat, le prix de vente, un certain nombre de valeurs supplémentaires;
  • Traiter les données collectées dans Excel pour créer le prix final du produit;
  • Transférez les prix dans le système.
  • Le déchargement et le chargement de données ultérieur par jour ont pris environ 3 heures.

Étant donné que ma copine n'avait pas de connaissances en programmation, il fallait faire un outil avec une interface simple et familière sous forme de fonctions dans Excel. Les séquences d'actions doivent être définies simplement comme une séquence de fonctions. En un mot, KISS .

Sur la base de ce cas, j'ai formé les exigences fonctionnelles suivantes:

  • Contrôlez la souris (déplacement, frappe) pour mettre en surbrillance les éléments correspondants à l'écran;
  • Simulez une frappe sur le clavier pour saisir des données;
  • Transférer des données d'Excel vers des applications tierces;
  • Récupération des données d'une application dans Excel;
  • Effectuer les mêmes opérations lors de l'extraction d'une formule dans Excel.

La souris et les premières difficultés


Avant de déplacer le curseur n'importe où, vous devez savoir exactement où le déplacer. Il me semble le plus approprié dans cette situation de se souvenir simplement de la position du curseur lorsqu'il se trouve sur un certain élément. Afin de mémoriser les coordonnées, j'ai utilisé la fonction GetCursorPos de la bibliothèque user32.

Eh bien, nous avons obtenu les coordonnées, maintenant ce serait bien de s'en souvenir. Eh bien, il n'y a rien de compliqué, je pensais, il suffit de compter une ou deux cellules de la cellule active et d'écrire les coordonnées X et Y. Cependant, ActiveCell.Offset (0, 1) .Value = x n'a pas fonctionné. La valeur n'a pas changé. Et à la suite de l'exécution, une erreur. Après avoir vérifié diverses hypothèses, il s'est avéré que la modification de la valeur sur la feuille entraîne un recomptage de la feuille entière, et donc la formule qui provoque ce recomptage. Afin de contourner cette restriction, au lieu d'appeler directement à partir de la fonction de certaines actions, il a fallu remplacer ces appels par Evaluer, ce qui nous a permis d'obtenir le résultat souhaité.

Le résultat a été la fonction PrintCursorPosition (), qui a enregistré dans deux cellules à droite la position du curseur au moment où la fonction a été exécutée. Il était nécessaire de taper PrintCursorPosition () dans la zone de saisie des formules, de déplacer le curseur et d'appuyer sur Entrée sur le clavier.

Pour déplacer la souris, j'ai utilisé SetCursorPos de la même bibliothèque user32. Pour utiliser cette fonction, il lui fallait passer la valeur des coordonnées x et y qui lui étaient précédemment stockées en entrée. En utilisant SetCursorPosition (x, y), j'ai pu déplacer le curseur sur les coordonnées précédemment enregistrées. Le premier résultat visible. Hourra!

Pour simuler les actions de la souris, j'ai utilisé mouse_event de la même bibliothèque user32. En passant les drapeaux des touches à l'entrée, j'ai pu simuler les frappes des touches correspondantes. Initialement, j'avais prévu d'écrire une fonction MouseButtonPrees (flag), où flag est la désignation de la touche enfoncée, mais après la première démonstration, la fille s'est rendu compte qu'il valait mieux remplacer le groupe de fonctions LeftClick (), RightClick () et DoubleClick (). Cette approche facilite la lecture de la fonction résultante.

Clavier


Dans VBA, il existe une instruction SendKeys qui effectue toutes les actions nécessaires. Le texte est facilement transmis à la fonction par référence à la cellule et s'exécute sans problème. Cependant, le fait d'appuyer sur des touches spéciales (Entrée, Tabulation, Alt, Ctrl, flèches du clavier, etc.) provoquait un rejet (pour les appuyer, il fallait les écrire entre accolades {ENTREE}). Par conséquent, pour les plus utilisées, j'ai écrit des fonctions comme PressEnter (). Pour ceux rarement utilisés, j'ai créé une feuille de triche dans le même document.

Les informations ont été transférées entre le système et Excel via une copie dans le tampon et un collage à partir du tampon. La copie dans le tampon a été essentiellement réalisée en simulant en appuyant sur Control + C, après quoi les données du tampon ont été transférées vers MSForms.DataObject et transférées vers une cellule spécifique.

Problèmes de test et de performances


Les problèmes ont commencé tout de suite.

Le processus d'écriture d'une séquence de scripts d'actions consiste à élaborer de petits groupes d'actions et à les combiner en un seul. Mais lors du passage à une cellule libre, la séquence entière a été immédiatement élaborée, ce qui était extrêmement ennuyeux, surtout si le temps nécessaire au groupe d'actions prenait plus de 10 secondes. Pour résoudre ce problème, j'ai vérifié la présence dans le texte de la formule de la cellule active du nom de la fonction. Ça a aidé.

De plus, pendant les tests, il a ajouté la fonction d'attente WaitS (secondes) et WaitMS (millisecondes), afin de garder une trace de ce qui fonctionnait et de ce qui ne fonctionnait pas. Il est basé sur Sleep de la bibliothèque kernel32. La différence entre WaitS et WaitMS est qu'en WaitMS, le temps est en millisecondes et en WaitS en secondes.

Un autre problème était l'exécution incohérente des fonctions lors de leur insertion dans les cellules. Cela était dû au calcul asynchrone d'Excel. Il a distribué le calcul de chaque cellule à différents processeurs. En conséquence, la séquence est d'abord exécutée dans la cellule deux, puis dans la cinquième, puis dans la troisième, etc. De plus, les séquences elles-mêmes ont été réalisées du début à la fin sans aucun problème. Afin de se débarrasser de ce comportement, j'ai désactivé les calculs multithread dans les paramètres Excel (Paramètres Excel -> Avancé -> Formules).

Résultats


Après avoir expliqué comment travailler avec tout cela et appris à l'utiliser, il a libéré sa petite amie pour automatiser les processus de l'entreprise d'une manière si ingrate.

Grâce à une telle automatisation, il s'est avéré réduire le temps de trois heures à 30 minutes. Dans le même temps, l'automatisation a permis de modifier légèrement l'approche du processus de téléchargement et de téléchargement des données. Maintenant, le déchargement a lieu au moment où ma copine part pour le déjeuner et le chargement la nuit. Ainsi, nous pouvons dire que la charge a diminué de près de la moitié de la journée de travail, ce qui a permis à ma petite amie de rentrer chez elle à l'heure et nous pouvons faire des choses plus intéressantes que l'automatisation.

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


All Articles