"Überlauf" - Formel-Ausgabe mehrerer Werte

In früheren Excel-Versionen hat man teilweise trotz korrekter Eingabe einer Formel die Fehlermeldung "#WERT!" erhalten. Dies war beispielsweise bei "=BEREICH.VERSCHIEBEN" der Fall, wenn das Ergebnis der Formel mehrere Werte beinhaltete. Dabei kommt es zu einem "Überlauf", da innerhalb einer Zelle nur ein Wert dargestellt werden kann. Angewendet hat man die erwähnte Formel unter anderem, um dynamische Bereiche zu definieren - damit Pivot-Tabellen oder Drop-Down-Listen (allenfalls nach dem Aktualisieren) die angepassten Datenquellen berücksichtigen. Dabei wird mit dem Namensmanager gearbeitet, wie bereits auf Excelblog.ch im Beitrag "Pivot-Datenquelle automatisch erweitern" sowie "Bereich eines Namens automatisch erweitern" erläutert wurde.

In diesem Beitrag gehen wir erneut auf die Formel "BEREICH.VERSCHIEBEN" ein und stellen damit innerhalb einer Excel-Tabelle eine dynamische Liste erneut dar - ohne den Namensmanager zu verwenden. Dabei simulieren wir erneut den angesprochenen "Überlauf" und zeigen, wie der Ergebnisbereich neuerdings in Excel dargestellt wird. Um dieses Beispiel zu erläutern, verwenden wir nachfolgende Länder-Liste auf dem Tabellenblatt "Parameter":

Laenderliste_Ausgangslage

Eine Drop-Down-Liste könnte ganz einfach auf diesen Bereich verweisen und nur diese Werte wären zulässig. Falls man jedoch weitere Länder in die Liste eintragen sollte, bleibt der Bezug der Drop-Down-Liste statisch. Weitere Erläuterungen zu diesem dynamischen Bereich findest Du im bereits verlinkten Beitrag "Bereich eines Namens automatisch erweitern". Die Formel, die wir verwenden, um den Bereich in unserem Beispiel dynamisch zu gestalten, lautet wie folgt:

=BEREICH.VERSCHIEBEN(Parameter!$A$2;;;ANZAHL2(Parameter!$A:$A)-1;)

Ausgehend von der Zelle "A2" (erstes Land) wird gemessen, wie viele Einträge in der Spalte A vorhanden sind (abzüglich 1 für die Überschrift). Dies ergibt unseren dynamischen Bereich, welchen wir in einer Drop-Down-Liste verwenden können:

Laenderliste_DropDown

Falls man obige Formel jedoch nicht im Namen eingibt, sondern wie ansonsten üblich in einer einfachen Zelle (im Screenshot unten Zelle "B2"), dann erhalten wir folgendes Resultat:

Laenderliste_BereichVerschieben

Die Liste wird exakt gleich dargestellt und die Werte werden in den Zellen unterhalb von B2 weitergeführt - die Zelle B2 ist "überlaufen". Wenn Du in die Zelle B2 klickst, siehst Du die Formel in der Bearbeitungsleiste normal angezeigt. Klickst Du jedoch beispielsweise in die Zelle "B3", dann ist die Formel zwar angezeigt, aber ausgegraut. Du kannst sie da auch nicht bearbeiten - nur eben in Zelle "B2". Falls Du einen Wert in den "Überlaufbereich" einfügst (z.B. in Zelle "B3"), dann erhältst Du neu die Fehlermeldung "#ÜBERLAUF!". Dies ist ein Hinweis, dass der Überlaufbereich nicht leer ist. Über die Fehlermeldung kann man auch direkt in die "blockierende Zelle" navigieren - dies kann vor allem bei grösseren Listen hilfreich sein:

Laenderliste_Ueberlauf

=SORTIEREN - ein weiterer Anwendungsfall

Eine weitere Formel, die nun ein interessantes Ergebnis mit Überlauf liefert, ist "=SORTIEREN". Dies kann erneut mit der obigen Länder-Liste illustriert werden. Angenommen die Länder sind einfach über die Zeit in die Liste eingetragen worden, ohne einer Reihenfolge oder Sortierung zu unterliegen. Mit der Formel "=SORTIEREN" kann einfach die gesamte Liste markiert werden, um die Länder im Zielbereich alphabetisch zu sortieren - dafür benötigt es in der Formel keine weiteren Angabe, der Bereich (z.B. "A2:A11") genügt! Die Formel wird in einer Zelle eingetragen, sämtliche Länder werden mithilfe des Überlaufs als Bereich ausgegeben. Dies ist das Resultat, nebeneinander dargestellt:

Laenderliste_SORTIEREN

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.

Outlook-Termine aus Excel erstellen

Mit VBA können nicht nur in Excel selbst Arbeitsschritte automatisiert werden, sondern es lassen sich auch andere MS Office-Produkte wie Outlook anbinden. Dieser Beitrag illustriert, wie aus einer Excel-Tabelle basierend auf einzelnen Zellinhalten ein Outlook-Termin erstellt werden kann.

Um die Funktionalitäten zu erschliessen, ist die Microsoft Outlook Object Library in VBA zu aktivieren. Gehe dafür wie folgt vor:
Öffne die VBA-Umgebung, indem Du entweder einen Rechtsklick auf ein bestehendes Tabellenblatt machst → "Code anzeigen..."oder mit der Tastenkombination Alt + F11. Unter "Extras" findest Du dann "Verweise", wie im Screenshot unten illustriert.

VBAVerweise

Suche da nach "Microsoft Outlook 16.0 Object Library" und aktiviere diesen Eintrag. Beachte: Die Version kann abhängig von Deiner MS Office Installation sein.

MOfficeObjLibrary

Die Excel-Tabelle zur Erstellung von Outlook-Terminen habe ich wie folgt aufgebaut:
OutlookTerminFile

Dem Benutzer stehen im oberen Bereich Eingabefelder zur Verfügung, welche sowohl als Steuerungsfelder für den effektiven Outlook-Termin dienen, aber auch die Texte unterhalb wie die "Anschrift" beeinflussen (Du = Lieber/Liebe; Sie = Sehr geehrter Herr/sehr geehrte Frau). Dies kann mit Wenn-Dann-Formeln erreicht werden und den Ablauf weiter optimieren, ist aber nicht zwingend. Zudem habe ich drei Sektionen (Einleitung - A; Hauptteil - B; Abschluss - C) in den Zellen 21, 23 und 25 eingepflegt, um die Email weiter zu strukturieren. Sämtliche Angaben werden durch das Makro weiterverarbeitet und an die entsprechenden Stellen des Termins als Variablen weitergereicht.

Lege nun in der VBA-Umgebung (siehe oben) ein neues Modul an und setze folgenden Beispielcode ein:

Sub TerminErstellen()

Dim OL As Outlook.Application, Appoint As Outlook.AppointmentItem, ES As Worksheet, WB As Workbook

Set WB = ThisWorkbook
Set TP = WB.Sheets("Terminplanung")
Set OL = New Outlook.Application

'Load Variables
Recipient = TP.Cells(3, 2).Value
DayMeeting = TP.Cells(9, 2).Value
StartTime = TP.Cells(10, 6).Value
EndTime = TP.Cells(11, 6).Value
Location = TP.Cells(12, 2).Value
Project = TP.Cells(13, 2).Value
Subject = TP.Cells(17, 2).Value
Greeting = TP.Cells(19, 2).Value
BodyA = TP.Cells(21, 2).Value
BodyB = TP.Cells(23, 2).Value
BodyC = TP.Cells(25, 2).Value
FinishA = TP.Cells(27, 2).Value
FinishB = TP.Cells(28, 2).Value

Set Appoint = OL.CreateItem(olAppointmentItem)
With Appoint
.Subject = Subject
.Start = StartTime
.End = EndTime
.Location = Location
.AllDayEvent = False
.Body = Greeting & Chr(10) & Chr(10) & BodyA & Chr(10) & Chr(10) & BodyB & Chr(10) & Chr(10) & BodyC & Chr(10) & Chr(10) & FinishA & Chr(10) & FinishB
.Save
End With

Set OL = Nothing

End Sub

Zuoberst werden die Objekte bestimmt und die Variablen geladen (das Tabellenblatt "Terminplanung" wird als "TP" deklariert, die Inhalte für beispielsweise den Empfänger oder den Betreff werden aus den Zellen B3 respektive B17 ausgelesen).
Im unteren Bereich (ab "Set Appoint") wird das effektive Outlook-Objekt - der Termin - erstellt, mit sämtlichen Angaben. Beachte: Hier ist aktuell kein Empfänger eingefügt, was für Testzwecke dazu führt, dass der Termin in Deinem eigenen Kalender angelegt wird. Du findest zu diesem AppointItem-Objekt weitere Eigenschaften unter diesem Link:

https://docs.microsoft.com/en-us/office/vba/api/outlook.appointmentitem#properties

Unter .Body siehst Du eine Zusammensetzung aus diversen Elementen. Mit "Chr(10)" werden Zeilenumbrüche eingefügt, um die Email besser zu strukturieren, das Resultat ist in der letzten Abbildung in diesem Blog ersichtlich. Die beiden Abbildungen unten illustrieren den erstellten Termin mit diesem Makro - sowohl für die Kalenderübersicht als auch wie erwähnt die zusätzlichen Informationen in der Email selbst.

OutlookTerminOverview

OutlookTerminDetails