Meine Freundin kauft im Vertriebsnetz ein. In jüngster Zeit wurde das Unternehmen stark reduziert, sodass der Arbeitsaufwand pro Mitarbeiter dramatisch gestiegen ist. Deshalb musste sie regelmäßig bei der Arbeit bleiben, manchmal sogar samstags ausgehen. Ihre Kollegen hatten das gleiche Problem.

Über die Entscheidung, die es meiner Freundin ermöglichte, pünktlich nach Hause zurückzukehren, können Sie unter dem Schnitt lesen.
Darüber hinaus kann ein wesentlicher Teil ihrer Arbeit automatisiert werden: Empfangen von Daten von vorne, Ausfüllen von Excel-Dokumenten, Aktualisieren von Daten von vorne usw.
In dieser Situation ist es am vernünftigsten, eine Arbeitserklärung zur Entwicklung der erforderlichen Funktionalität zu verfassen und diese über die Behörden an die Entwickler weiterzugeben. Die Reduzierung betraf jedoch alle, einschließlich der Entwickler. Infolgedessen verfügten sie nicht über genügend Ressourcen, um diese Automatisierung zu implementieren. Und das Unternehmen hatte in absehbarer Zeit nicht vor, spezialisierte RPA-Systeme zu kaufen.
Darüber hinaus wurde verstärkt überwacht, was Mitarbeiter bei der Arbeit tun und in welchen Anwendungen sie arbeiten.
Aufgrund all dieser widrigen Umstände und meines verzweifelten Wunsches zu helfen, entschied ich mich, Funktionen für Excel in VBA zu schreiben, dank derer es möglich wäre, die Routineoperationen meiner Freundin und ihrer Kollegen zu automatisieren.
Produktanforderungen
Als Ausgangspunkt wählte ich die Aufgabe, für die das Mädchen die meiste Zeit nach ihren Gefühlen verbrachte. Im Rahmen dieser Aufgabe brauchte das Mädchen:
- Übertragen Sie die Artikelnummer aus der Excel-Datei in die Suchleiste des Front-Office-Systems.
- Für diesen Artikel erhalten Sie aus den Suchergebnissen den Kauf- und Verkaufspreis sowie eine Reihe zusätzlicher Werte.
- Verarbeiten Sie die gesammelten Daten in Excel, um den endgültigen Produktpreis zu erstellen.
- Laden Sie die Preise zurück in das System.
- Das Entladen und anschließende Laden der Daten pro Tag dauerte ca. 3 Stunden.
Da meine Freundin keine Programmierkenntnisse hatte, war es notwendig, ein Tool mit einer einfachen und vertrauten Oberfläche in Form von Funktionen in Excel zu erstellen. Aktionssequenzen sollten einfach als eine Sequenz von Funktionen definiert werden. Mit einem Wort,
KISS .
Basierend auf diesem Fall habe ich die folgenden funktionalen Anforderungen gebildet:
- Steuern Sie die Maus (bewegen, Tastendruck), um die entsprechenden Elemente auf dem Bildschirm hervorzuheben.
- Simulieren Sie einen Tastendruck auf der Tastatur, um Daten einzugeben.
- Übertragen Sie Daten von Excel an Anwendungen von Drittanbietern.
- Abrufen von Daten aus einer Anwendung in Excel;
- Ausführen derselben Vorgänge beim Abrufen einer Formel in Excel.
Die Maus und die ersten Schwierigkeiten
Bevor Sie den Cursor irgendwohin bewegen, müssen Sie genau wissen, wohin Sie ihn bewegen müssen. In dieser Situation erscheint es mir am besten, sich einfach an die Position des Cursors zu erinnern, wenn er sich über einem bestimmten Element befindet. Um mich an die Koordinaten zu erinnern, habe ich die Funktion GetCursorPos aus der user32-Bibliothek verwendet.
Nun, wir haben die Koordinaten, jetzt wäre es schön, sich an sie zu erinnern. Nun, es gibt nichts Kompliziertes, dachte ich, zähle einfach ein oder zwei Zellen aus der aktiven Zelle und schreibe die Koordinaten X und Y auf. ActiveCell.Offset (0, 1) .Value = x hat jedoch nicht funktioniert. Der Wert hat sich nicht geändert. Und als Ergebnis der Ausführung ein Fehler. Nach Überprüfung verschiedener Annahmen stellte sich heraus, dass das Ändern des Werts auf dem Blatt zu einer Nachzählung des gesamten Blattes und damit der Formel führt, die diese Nachzählung verursacht. Um diese Einschränkung zu umgehen, war es anstelle eines direkten Aufrufs einer Funktion bestimmter Aktionen erforderlich, diese Aufrufe durch Auswerten zu ersetzen, wodurch wir das gewünschte Ergebnis erzielen konnten.
Das Ergebnis war die Funktion PrintCursorPosition (), die in zwei Zellen rechts die Cursorposition zum Zeitpunkt der Ausführung der Funktion aufzeichnete. Es war notwendig, PrintCursorPosition () in den Bereich für die Eingabe von Formeln einzugeben, den Cursor zu bewegen und die Eingabetaste auf der Tastatur zu drücken.
Um die Maus zu bewegen, habe ich SetCursorPos aus derselben user32-Bibliothek verwendet. Um diese Funktion verwenden zu können, musste der Wert der zuvor gespeicherten x- und y-Koordinaten als Eingabe übergeben werden. Mit SetCursorPosition (x, y) konnte ich den Cursor über zuvor gespeicherte Koordinaten bewegen. Das erste sichtbare Ergebnis. Hurra!
Um Mausaktionen zu simulieren, habe ich mouse_event aus derselben user32-Bibliothek verwendet. Durch Übergeben der Flags der Tasten an den Eingang konnte ich die Tastenanschläge der entsprechenden Tasten simulieren. Ursprünglich wollte ich eine Funktion MouseButtonPrees (Flag) schreiben, wobei Flag die Bezeichnung der gedrückten Taste ist. Nach der ersten Demonstration erkannte das Mädchen jedoch, dass es besser ist, die Funktionsgruppe LeftClick (), RightClick () und DoubleClick () zu ersetzen. Dieser Ansatz erleichtert das Lesen der resultierenden Funktion.
Tastatur
In VBA gibt es eine SendKeys-Anweisung, die alle erforderlichen Aktionen ausführt. Der Text wird unter Bezugnahme auf die Zelle leicht an die Funktion übergeben und erfüllt problemlos. Das Drücken von Sondertasten (Eingabetaste, Tabulatortaste, Alt, Strg, Tastaturpfeile usw.) führte jedoch zu einer Ablehnung (um sie zu drücken, mussten sie in geschweiften Klammern {ENTER} geschrieben werden). Daher habe ich für die am häufigsten verwendeten Funktionen wie PressEnter () geschrieben. Für selten verwendete habe ich im selben Dokument einen Spickzettel erstellt.
Informationen wurden zwischen dem System und Excel übertragen, indem sie in den Puffer kopiert und aus dem Puffer eingefügt wurden. Das Kopieren in den Puffer wurde im Wesentlichen durch Simulieren des Drückens von Strg + C durchgeführt, wonach Daten aus dem Puffer in das MSForms.DataObject übernommen und in eine bestimmte Zelle übertragen wurden.
Test- und Leistungsprobleme
Die Probleme begannen sofort.
Das Schreiben einer Skriptsequenz von Aktionen besteht darin, kleine Gruppen von Aktionen zu erarbeiten und zu einer zu kombinieren. Beim Wechsel zu einer freien Zelle wurde jedoch sofort die gesamte Sequenz ausgearbeitet, was äußerst ärgerlich war, insbesondere wenn die Zeit, die die Gruppe von Aktionen benötigte, mehr als 10 Sekunden dauerte. Um dieses Problem zu lösen, habe ich überprüft, ob im Funktionstext der aktiven Zelle der Funktionsname vorhanden ist. Es hat geholfen.
Während des Tests fügte er außerdem die Wartefunktionen WaitS (Sekunden) und WaitMS (Millisekunden) hinzu, um zu verfolgen, was funktionierte und was nicht. Es basiert auf Sleep aus der Kernel32-Bibliothek. Der Unterschied zwischen WaitS und WaitMS besteht darin, dass in WaitMS die Zeit in Millisekunden und in WaitS in Sekunden angegeben wird.
Ein weiteres Problem war die inkonsistente Ausführung von Funktionen beim Ziehen in Zellen. Dies lag an der asynchronen Berechnung von Excel. Er verteilte die Berechnung jeder Zelle an verschiedene Prozessoren. Infolgedessen wird die Sequenz zuerst in Zelle zwei, dann in der fünften, dann in der dritten usw. ausgeführt. Darüber hinaus wurden die Sequenzen selbst von Anfang bis Ende ohne Probleme durchgeführt. Um dieses Verhalten zu beseitigen, habe ich Multithread-Berechnungen in den Excel-Einstellungen (Excel-Einstellungen -> Erweitert -> Formeln) deaktiviert.
Ergebnisse
Nachdem er erklärt hatte, wie man mit all dem umgeht und wie man es benutzt, ließ er seine Freundin los, um die Prozesse im Unternehmen auf solch undankbare Weise zu automatisieren.
Dank dieser Automatisierung konnte die Zeit von drei Stunden auf 30 Minuten verkürzt werden. Gleichzeitig ermöglichte die Automatisierung eine geringfügige Änderung des Ansatzes zum Hoch- und Herunterladen von Daten. Jetzt erfolgt das Entladen während der Zeit, in der meine Freundin zum Mittagessen abreist und nachts lädt. Wir können also sagen, dass die Last um fast die Hälfte des Arbeitstages abgenommen hat, wodurch meine Freundin pünktlich nach Hause zurückkehren konnte und wir interessantere Dinge als die Automatisierung tun können.