Dynamische Selektoren in UiPath Studio

Wenn es einen Begriff gibt, der im Kontext von Web Automation und Robotic Process Automation (RPA) nicht ausgelassen werden kann, dann ist dies «Selektoren». Die Hauptursache von Fehlern liegt in falsch gesetzten oder alten Selektoren, welche nicht den Gegebenheiten des entsprechenden User Interface (UI) entsprechen. Um die korrekten UI Elemente anzusteuern, müssen teilweise dynamische Informationen verwendet werden. In diesem Falle wird der notwendige (dynamische) Input in einer Variable zwischengespeichert, welche als Teil des Selektors verwendet wird.

Um den Einsatz von Variablen in Selektoren (dynamische Selektoren) in UiPath Studio zu illustrieren, verwenden wir die Website «www.asvz.ch». ASVZ ist der Akademische Sportsverband Zürich, eine Plattform, auf der Studenten ein breites Angebot an anstehenden Sportaktivitäten in unterschiedlichen Lokalitäten vorfinden und buchen können. Alle Termine werden auf der Website unter «Sportfahrplan» aufgeführt. Die Sportarten können direkt in der Überschrift gefiltert werden. In diesem Beispiel suchen wir zuerst nach «Basketball». Hier wird direkt ersichtlich, dass ein dynamischer Selektor basierend auf einem initialen User Input notwendig ist:

SearchField

Zu Beginn unserer Web Automation wird der Benutzer demnach aufgefordert, die gewünschte Sportart einzugeben (z.B. Basketball). Wie oberhalb erwähnt soll diese Information in einer Variable zwischengespeichert werden, welche direkt in den Selektor eingebaut wird. Eine normale «Click»-Aktivität auf den Filter (in der Überschrift) generiert in UiPath den folgenden Selektor:

InitialSelector

Beachte, dass der Selektor spezifisch auf «Basketball» eingestellt ist. Demnach, wenn der Software-Roboter beispielsweise nach «Badminton» suchen wird, kann das UI Element nicht identifiziert werden und die Prozedur wird nach einem Standard «Timeout» von 30 Sekunden gestoppt und eine entsprechende Fehlermeldung wird ausgegeben. Um den erwähnten Selektor-Teil dynamisch zu gestalten, ist ein Rechtsklick auf das «aaname»-Element notwendig, gefolgt von «Choose variable», da die Variable bereits zuvor definiert wurde (das Resultat/die Ausgabe von der User Input-Aktivität):

InitialSelectorAAName

In der nachfolgenden Maske wird die Variable selektiert. Stelle zuvor auf jeden Fall sicher, dass der Bereich (Scope) der Variable korrekt gesetzt ist, um sie in späteren Aktivitäten ebenfalls abzurufen.

ChooseVariable

Das Resultat ist ein dynamischer Selektor, wie in der Abbildung unten dargestellt. Die Variable wird automatisch mit den notwendigen geschweiften Klammern in den gesamten Selektor integriert. Nun kann die Web Automation jeden beliebigen User Input, der einer verfügbaren Sportart entspricht, selektieren und die Daten danach filtern.

DynamicSelector

Bitte beachte, dass unvollständige Suchbegriffe und Platzhalter nicht in diesem Beitrag berücksichtigt werden. Diese könnten ebenfalls inkludiert werden, um den Selektor und den gesamten Prozess noch robuster zu gestalten.

Loop durch Tabellenblätter mit Sheets.Index (VBA)

Angeknüpft an den letzten Beitrag zu dynamischen Formeln über mehrere Tabellenblätter, behandelt dieser Beitrag die Thematik, wie mittels einer VBA-Schleife (Loop) durch mehrere Tabellenblätter navigiert werden kann, ohne dass der Code jeweils anzupassen ist. [Eine Einführung zum hier angewandten "For"-Loop - einer VBA-Schleife - findest Du in diesem Beitrag.] Ziel ist es also, weitere Tabellenblätter einfügen zu können, ohne auf diese spezifisch im Code verweisen zu müssen.

Unser Beispielunternehmen weist Zahlen für die jeweiligen Regionen und Unternehmenseinheiten aus. Unten ist ein Beispiel dargestellt, bei dem unterschiedliche Kantone ("Basel", "Bern" und "Zürich") vorhanden sind. Zudem werden die Daten auf Konzernebene aggregiert (Tabellenblatt "Total"):

SheetIndexSheetsA

Wir gehen davon aus, dass jede einzelne Region die gleiche Struktur aufweist und wir demnach denselben Makro-Code auf alle Tabellenblätter anwenden können - ein perfekter Anwendungsfall also für einen Loop! In einem ersten Schritt sollten die notwendigen Befehle für ein einzelnes Tabellenblatt aufgezeichnet, geschrieben und getestet werden. Auf jedem Blatt sollen beispielsweise Spalten ausgeblendet sowie Formatierungen vorgenommen werden. Es bieten sich nun unterschiedliche Schleifen an, die sich über alle gewünschten Tabellenblätter erstrecken. In unserem Fall soll der Loop jedoch dynamisch sein, damit wir jederzeit neue Regionen einfügen können. Verweisen wir im Code demnach explizit auf die aktuell erste Region "Basel", hat dies später allenfalls keine Gültigkeit mehr (Beispiel: Wenn wir "Aargau" einfügen, rückt dieser Kanton an erste Stelle). Im anfangs verlinkten Beitrag zu dynamischen Formeln über mehrere Tabellenblätter haben wir Hilfstabellenblätter eingefügt ("Kanton_AA" und "Kanton_ZZ") und diese am Ende ausgeblendet:

SheetIndexSheetsZ

Durch diesen Mechanismus kann nun ein "For"-Loop angewandt werden. Unser Makro ermittelt den "Sheet.Index" dieser Hilfsblätter; das heisst, an welcher Stelle in der Datei diese Tabellenblätter stehen. Wir definieren hier einerseits die Variablen des Typs "Integer" (vereinfacht: Zahlen) im Makro:

Dim SheetIndexStart As Integer
Dim SheetIndexEnd As Integer

Danach kann der Indexwert dieser beiden Tabellenblätter ermittelt werden:

SheetIndexStart = Sheets("Kanton_AA").Index
SheetIndexEnd = Sheets("Kanton_ZZ").Index

In unserem Beispiel wird für "Kanton_AA" der Wert "2" als Variable abgespeichert, für "Kanton_ZZ" ist dies der Wert "6". Nun kann der "For"-Loop eingesetzt werden, der den Code mit den Befehlen für die Tabellenblätter umfasst:

For x = SheetIndexStart + 1 To SheetIndexEnd - 1
Sheets(x).Activate
'Befehle zur Bearbeitung der Tabellenblätter
Next

Da wir die Hilfsblätter nicht zwingend bearbeiten müssen, kannst Du entweder direkt bei der Definition der Variablen "+1" addieren respektive "-1" subtrahieren, oder wie im Code oben beim Beginn des "For"-Loop die Index-Zahl um eins erhöhen und reduzieren. Mit "Sheets(x).Activate" wird dann in jedem Durchlauf der Schleife jeweils das entsprechende Tabellenblatt aktiviert und bearbeitet. Beachte, dass Du die Hilfstabellenblätter "Kanton_AA" und "Kanton_ZZ" allenfalls zuerst durch das Makro einblenden musst. Füge hier zu Beginn Deines Makros einfach ein:

Sheets("Kanton_AA").Visible = True
Sheets("Kanton_ZZ").Visible = True

... und am Ende dasselbe, mit dem Boolean-Wert "False", damit die Blätter direkt wieder ausgeblendet sind.

Fügst Du nun eine neue Region (z.B. "Genf" oder "Aargau") ein, wird das Makro dank der Ermittlung des "Index-Wertes" auch diese Tabellenblätter in der Loop-Bearbeitung berücksichtigen können. Entsprechend reagiert die Selektion, falls Du weitere Tabellenblätter weiter vorne in der Datei einfügst (beispielsweise eine weitere Auswertung neben dem "Total") oder die Kantone mitsamt den beiden Hilfsblätter an eine andere Stelle innerhalb der Datei verschiebst.

Pivot-Datenquelle automatisch erweitern

Pivot-Tabellen aggregieren innert kürzester Zeit immense Datenmengen. Sobald man der Datenquelle weitere Informationen anfügt, wird dies standardmässig nicht direkt erkannt - der neue Bereich ist jeweils manuell anzupassen:

pivotdatenquelleaendern

Es besteht jedoch die Möglichkeit, die Datenquelle automatisch erweitern zu lassen. Dies funktioniert im Grunde genommen, wie wir das bereits in diesem Beitrag hier mittels Namensgebung für Bereiche behandelt haben. Unserer Pivot-Datenquelle teilen wir auch hier zuerst einen Namen zu: Markiere die gesamte Datenquelle und schreibe ins Namensfeld (links neben der Bearbeitungsleiste) Deinen gewünschten Namen, bspw. "Datenbasis":

pivotdatenquellenamensfeld

Gehst Du nun via "Einfügen" → "PivotTable" kannst Du direkt bei "Tabelle/Bereich:" den definierten Namen ("Datenbasis") eingeben:

(Beachte: Unsere Pivot wird in einem neuen Tabellenblatt sein, nicht im selben wie die Datenbasis.)

Nun ist aber noch nicht konfiguriert, dass sich der Bereich automatisch erweitern soll, sobald weitere Daten angefügt werden (weitere Zeilen, weitere Spalten). Hier kommt die Formel "BEREICH.VERSCHIEBEN" zum Einsatz. Gehe via "Formeln" auf "Namensmanager" und bearbeite Deinen bereits angelegten Namen. In der Maske gibst Du bei "Bezieht sich auf:" die nachfolgende Formel ein:

=BEREICH.VERSCHIEBEN(Datenbasis!$A$1;;;ANZAHL2(Datenbasis!$A:$A);ANZAHL2(Datenbasis!$1:$1))

Auf dem Tabellenblatt mit ebenfalls dem Namen "Datenbasis", beginnend bei Zelle "A1" wird einerseits nach unten (Spalte A:A) gezählt, wie viele Einträge vorhanden sind. Dasselbe passiert auf der Zeile 1.

pivotdatenquellenamensmanager

Der Bereich wird entsprechend daraufhin erweitert, sobald neue Einträge angefügt werden. (Beachte, dass die Pivot-Tabelle noch via Rechtsklick → "Aktualisieren" aufzufrischen ist.)