{"id":55000432,"date":"2024-06-01T00:00:00","date_gmt":"2024-08-07T10:19:30","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=432"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"To_Do_mit_VBA_und_Power_Automate_steuern","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/To_Do_mit_VBA_und_Power_Automate_steuern\/","title":{"rendered":"To Do mit VBA und Power Automate steuern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/d0e758bb3e3f4607b443496ec53aa2cf\" width=\"1\" height=\"1\" alt=\"\"><b>In einem weiteren Artikel namens &#8220;To Do-Aufgabe mit Power Automate und VBA anlegen&#8221; (www.vbentwickler.de\/431) haben wir die Grundlagen zur Steuerung von Microsoft To Do mit VBA &uuml;ber Power Automate beschrieben und einen ersten Anwendungsfall vorgestellt &#8211; das Anlegen einer Aufgabe f&uuml;r eine vorgegebene Liste. In diesem Artikel haben wir die wichtigsten Vorbereitungen getroffen, n&auml;mlich das Anlegen eines Power Automate Kontos und das Freigeben des Zugriffs auf das To Do-Konto, dessen Listen und Aufgaben wir verwalten wollen. Dabei schauen wir uns in diesem Artikel an, wie wir die Aufrufe noch genauer gestalten k&ouml;nnen, um beispielsweise die Liste einzustellen, der wir eine neue Aufgabe hinzuf&uuml;gen. Au&szlig;erdem schauen wir uns an, wie wir Aufgaben auslesen, bearbeiten oder l&ouml;schen k&ouml;nnen und wie wir Listen auslesen, anlegen, bearbeiten oder l&ouml;schen k&ouml;nnen. Es gibt viel zu tun!<\/b><\/p>\n<p>Wir starten direkt dort, wo wir im oben genannten Artikel aufgeh&ouml;rt haben, n&auml;mlich beim Anlegen einer Aufgabe. In dem dort verwendeten Code haben wir beispielsweise noch nicht die Liste dynamisch angegeben, in die wir die neue Aufgabe &uuml;bertragen wollen. Wir konnten diese nur aus den vorhandenen Listen ausw&auml;hlen, was wir aber gern direkt von der VBA-Anwendung aus erledigen w&uuml;rden. Dazu m&uuml;ssen wir die Listen und ihre Eigenschaften ausw&auml;hlen, was wir nun erledigen.<\/p>\n<h2>Neuen Flow anlegen<\/h2>\n<p>Dazu legen wir einen neuen Flow mit der Vorlage <b>Sofortiger Cloud-Flow <\/b>(siehe Bild 1) und dem Typ <b>Beim Empfang einer HTTP-Anforderung <\/b>an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_001.png\" alt=\"Anlegen eines sofortigen Cloud-Flows\" width=\"499,6267\" height=\"375,5756\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anlegen eines sofortigen Cloud-Flows<\/span><\/b><\/p>\n<p>Hier brauchen wir nichts weiter festzulegen &#8211; wir wollen alle Listen von To Do abfragen, dazu ben&ouml;tigen wir keine Requestparameter. Danach f&uuml;gen wir mit einem Klick auf das Plus-Zeichen und anschlie&szlig;ender Auswahl von Aktion hinzuf&uuml;gen die Aktion zum Abfragen der To Do-Listen hinzu (siehe Bild 2). Hier sehen wir bereits das Ergebnis.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_002.png\" alt=\"Hinzuf&uuml;gen einer Aktion\" width=\"374,6267\" height=\"330,3047\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen einer Aktion<\/span><\/b><\/p>\n<p>Vorher w&auml;hlen wir jedoch noch aus dem Bereich <b>Eine Aktion hinzuf&uuml;gen <\/b>die gew&uuml;nschte Aktion hinzu. Dazu geben wir als Suchbegriff <b>Aufgabe <\/b>ein und scrollen dann nach unten, bis wir den Connector <b>Microsoft To-Do <\/b>finden. Hier klicken wir auf <b>Mehr anzeigen <\/b>und finden alle Aktionen f&uuml;r Microsoft To-Do vor (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_003.png\" alt=\"Alle Microsoft To-Do-Aktionen\" width=\"474,6267\" height=\"530,2\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Alle Microsoft To-Do-Aktionen<\/span><\/b><\/p>\n<p>Hier w&auml;hlen wir den Eintrag <b>Alle Aufgabenlisten auflisten <\/b>aus. Dessen Eigenschaften erscheinen nun auf der linken Seite. Auf der Seite Parameter erhalten wir wie bereits angedeutet den Hinweis, dass keine zus&auml;tzlichen Informationen n&ouml;tig sind. Im unteren Bereich sollten wir, wenn wir bereits die Schritte aus dem eingangs erw&auml;hnten Artikel ausgef&uuml;hrt haben, die Information vorfinden, dass wir bereits mit Microsoft To-Do verbunden sind. Wir brauchen auch bei diesem Schritt nichts weiter zu tun (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_004.png\" alt=\"Einstellungen f&uuml;r die neue Aktion\" width=\"474,6267\" height=\"204,7409\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Einstellungen f&uuml;r die neue Aktion<\/span><\/b><\/p>\n<p>Wir k&ouml;nnen den Flow nun speichern und das wird auch ohne Probleme gelingen. Damit k&ouml;nnen wir nun zur ersten Aktion beziehungsweise zum Trigger mit der Beschriftung <b>manual <\/b>zur&uuml;ckkehren. Klicken wir diesen an, sehen wir nun unter <b>HTTP-URL <\/b>die URL, die wir aufrufen m&uuml;ssen. Hier m&uuml;ssen wir au&szlig;erdem noch pr&uuml;fen, ob <b>Wer kann den Flow ausl&ouml;sen <\/b>den Wert <b>Jeder <\/b>aufweist (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_005.png\" alt=\"Pr&uuml;fen des Ausl&ouml;sers und Abholen der URL\" width=\"474,6267\" height=\"206,0277\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Pr&uuml;fen des Ausl&ouml;sers und Abholen der URL<\/span><\/b><\/p>\n<p>Im Gegensatz zum Beispiel aus dem eingangs erw&auml;hnten Artikel wollen wir hier eine Antwort erhalten, die &uuml;ber einen Status mit einer Erfolgsmeldung hinausgeht. Dazu f&uuml;gen wir noch eine weitere Aktion hinzu. Diese hei&szlig;t <b>Antwort<\/b> und wir finden diese wie in Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_006.png\" alt=\"Anlegen der Antwort-Aktion\" width=\"424,6267\" height=\"257,2861\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anlegen der Antwort-Aktion<\/span><\/b><\/p>\n<h2>Antwort als Eigenschaft hinzuf&uuml;gen<\/h2>\n<p>Hier m&uuml;ssen wir allerdings Hand anlegen. Die Parameter der <b>Antwort<\/b>-Aktion sehen wir in Bild 7. Wichtig sind hier die Eigenschaften <b>Status Code <\/b>und <b>Body<\/b>. Wenn wir den Flow aufrufen, ohne diese letzte Aktion hinzuzuf&uuml;gen, bekommen wir immer den Status <b>202 <\/b>zur&uuml;ck &#8211; ohne einen <b>Response<\/b>-Text. Hier legen wir nun fest, dass wir den Status <b>200<\/b> erhalten, wenn dieser Schritt erreicht wird, und mit der Eigenschaft <b>Body <\/b>definieren wir, welchen Inhalt wir zur&uuml;ckerhalten wollen. Deshalb klicken wir auf die Schaltfl&auml;che mit dem Blitz und dem Text <b>fx<\/b>, um die verf&uuml;gbaren Elemente anzuzeigen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_008.png\" alt=\"Eintragen des Body-Wertes\" width=\"424,6267\" height=\"241,0043\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Eintragen des Body-Wertes<\/span><\/b><\/p>\n<p>Diese sehen wir nun in Bild 8. Hier sehen wir alle m&ouml;glichen Ergebnisse der Aktion <b>Alle Aufgabenlisten auflisten<\/b>. Wir w&auml;hlen den Eintrag <b>Textk&ouml;rper <\/b>aus. Mit allen anderen Eintr&auml;gen konnten wir den Flow nicht ohne Fehlermeldungen speichern. Nun gelingt dies jedoch, und wir k&ouml;nnen uns dem Aufruf per VBA zuwenden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_007.png\" alt=\"Hinzuf&uuml;gen des Elements Textk&ouml;rper zur Eigenschaft Body der Antwort\" width=\"700\" height=\"446,8365\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Hinzuf&uuml;gen des Elements Textk&ouml;rper zur Eigenschaft Body der Antwort<\/span><\/b><\/p>\n<h2>Alle Aufgabenlisten per VBA ermitteln<\/h2>\n<p>Nachdem wir uns so praktisch unseren eigenen ma&szlig;geschneiderten Webservice gebaut haben, k&ouml;nnen wir diesen per VBA aufrufen. Um diese optimal verarbeiten zu k&ouml;nnen, wollen wir jedoch noch zwei Voraussetzungen schaffen. Als Erstes ben&ouml;tigen wir einen Verweis auf die Bibliothek <b>Microsoft Scripting Runtime<\/b>. Au&szlig;erdem f&uuml;gen wir zwei Module namens <b>mdlJSON <\/b>und <b>mdlJSONDOM <\/b>zum VBA-Projekt hinzu. Diese enthalten wichtige Funktionen zum Auswerten der Antwort des Webservices.<\/p>\n<p>In der Prozedur <b>GetToDoLists<\/b> aus Listing 1 rufen wir den Webservice auf. Hier deklarieren wir einige Variablen und weisen dann der Variablen <b>strURL <\/b>die URL zu, die wir weiter oben dem Element <b>manual <\/b>entnommen haben. Dann rufen wir diese URL. Liefert diese den Wert <b>200 <\/b>als Status zur&uuml;ck, war der Aufruf erfolgreich.  Dann k&ouml;nnen wir den Inhalt der Eigenschaft <b>responseText<\/b> des <b>XMLHTTP<\/b>-Objekts in die Variable <b>strResponse<\/b> schreiben. Da es sich hierbei um ein JSON-Dokument handelt, verwenden wir die Funktion <b>GetJSONDOM<\/b>, um die Referenzen zu den einzelnen Inhalten des Dokuments im Direktbereich auszugeben. Dieser sieht f&uuml;r das erste Element wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>GetToDoLists()\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.ServerXMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>strUrl<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objJSON<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.ServerXMLHTTP60\r\n     strUrl = \"https:\/\/prod2-25.germanywestcentral.logic.azure.com:443\/workflows\/...\"\r\n     <span style=\"color:blue;\">With<\/span> objXMLHTTP\r\n         .Open \"POST\", strUrl, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"application\/json\"\r\n         .send \"{}\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Select Case objXMLHTTP.status\r\n         <span style=\"color:blue;\">Case <\/span>200\r\n             strResponse = objXMLHTTP.responseText\r\n             <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strResponse)\r\n             <span style=\"color:blue;\">Debug.Print<\/span> GetJSONDOM(strResponse, <span style=\"color:blue;\">True<\/span>)\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler: \" & objXMLHTTP.status & \" - \" & objXMLHTTP.statusText\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Ermitteln aller Aufgabenlisten von To Do<\/span><\/b><\/p>\n<pre>objJSON.Item(1).Item(\"@odata.etag\"): W\/\"5kiLK5VJy0...\"\r\nobjJSON.Item(1).Item(\"displayName\"): Tasks\r\nobjJSON.Item(1).Item(\"isOwner\"): Wahr\r\nobjJSON.Item(1).Item(\"isShared\"): Falsch\r\nobjJSON.Item(1).Item(\"wellknownListName\"): defaultList\r\nobjJSON.Item(1).Item(\"id\"): AQMkADAwATNiZmYAZC05M2I2LTRiYTgtMDACLTAwCgAuAAADKTYDS538L0CXniiMkbeMfQEA5kiLK5VJy0Cml8itxoUMYQAAAgESAAAA<\/pre>\n<p>Uns interessieren prim&auml;r der Anzeigename (<b>displayName<\/b>) und die <b>id<\/b>. Letztere ben&ouml;tigen wir, um gezielt die Aufgaben einer Liste zu bearbeiten.<\/p>\n<p>Wir haben den Inhalt mit der Funktion <b>ParseJSON <\/b>ausgelesen und in eine Objektstruktur geschrieben, die wir mit der Variablen <b>objJSON <\/b>referenzieren. &Uuml;ber diese k&ouml;nnen wir die enthaltene Werte nun mit den von <b>GetJSONDOM <\/b>gelieferten Referenzen ermitteln.<\/p>\n<p>Wenn wir <b>GetJSONDOM <\/b>nun durch die folgende Schleife ersetzen, erhalten wir alle Anzeigenamen plus ID im Direktbereich:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\nFor i = 1 To objJSON.Count\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objJSON.Item(i).Item(\"displayName\"), _\r\n        objJSON.Item(i).Item(\"id\")\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Damit k&ouml;nnen wir arbeiten &#8211; wir k&ouml;nnen die Informationen nun beispielsweise in eine Access- oder Excel-Tabelle schreiben, um weiter damit zu arbeiten.<\/p>\n<h2>Aufgaben einer Aufgabenliste abrufen<\/h2>\n<p>Im n&auml;chsten Schritt wollen wir zu einer dieser Aufgabenlisten alle Aufgaben ausgeben. Dazu legen wir einen neuen Flow an. Das ist bereits deutlich anspruchsvoller, wie wir gleich sehen werden.<\/p>\n<p>Grunds&auml;tzlich ist der Aufbau des Flows &auml;hnlich: Wir verwenden wieder das <b>manual<\/b>-Objekt zum Start, dann eines, das die Eintr&auml;ge liefert und am Ende die Antwort. Allerdings k&ouml;nnen wir die Eintr&auml;ge nicht so einfach wie zuvor als Antwort zur&uuml;ckschicken, sondern m&uuml;ssen diese zwischendurch noch prozessieren. Das erscheint gleich in der Beschreibung leicht, aber da wir im Web kein Beispiel daf&uuml;r gefunden haben und alles selbst herausfinden mussten, sind daf&uuml;r einige Stunden draufgegangen.<\/p>\n<p>Der vollst&auml;ndige Flow wird sp&auml;ter wie in Bild 9 aussehen. Wir starten mit dem Request-Element, dem wir mitteilen, welche Liste ausgelesen werden soll und wie viele Eintr&auml;ge wir maximal erhalten wollen. Dann folgt das eigentliche Auslesen durch die Aktion <b>Aufgaben nach Ordner auflisten<\/b>. Die damit erhaltenen Informationen m&uuml;ssen wir allerdings noch verarbeiten. Dazu erstellen wir eine Array-Variable, die wir in der folgenden Schleife mit den Elementen der gefundenen Aufgaben f&uuml;llen. Mit der Verfassen-Aktion bereiten wir die Inhalte zur R&uuml;ckgabe als Response vor und geben diese schlie&szlig;lich mit dem Response-Element zur&uuml;ck.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_009.png\" alt=\"Vollst&auml;ndiger Flow zum Abfragen der Aufgaben einer Aufgabenliste\" width=\"424,6267\" height=\"948,487\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Vollst&auml;ndiger Flow zum Abfragen der Aufgaben einer Aufgabenliste<\/span><\/b><\/p>\n<p>Dies schauen wir uns nun im Detail an.<\/p>\n<h2>Trigger f&uuml;r den Request hinzuf&uuml;gen<\/h2>\n<p>Wir starten mit einem neuen Flow, f&uuml;r den wir wieder den Typ <b>Beim Empfang einer HTTP-Aufforderung<\/b>. F&uuml;r diesen legen wir unter <b>Wer kann den Flow ausl&ouml;sen <\/b>wieder <b>Jeder <\/b>fest.<\/p>\n<p>F&uuml;r JSON-Schema des Anforderungstexts hinterlegen wir das folgende JSON-Dokument, mit dem wir diesmal nicht nur die <b>listId <\/b>abfragen, sondern mit <b>count <\/b>auch die maximale Anzahl der zur&uuml;ckzugebenden Elemente:<\/p>\n<pre>{\r\n   \"properties\": {\r\n     \"listId\": {\r\n       \"type\": \"string\"\r\n     },\r\n     \"count\": {\r\n       \"type\": \"integer\"\r\n     }\r\n   },\r\n   \"type\": \"object\"\r\n}<\/pre>\n<h2>Aktion zum Abfragen der Aufgaben hinzuf&uuml;gen<\/h2>\n<p>&Uuml;ber das Pluszeichen f&uuml;gen wir nun ein neues Element hinzu. Leider ist die Suche nach Aktionen so schlecht, dass wir uns behelfen, indem wir das Suchwort <b>Aufgaben <\/b>eingeben und etwas nach unten scrollen, bis wir die Gruppe <b>Microsoft To-Do <\/b>finden. Diese enth&auml;lt auch die Aktion <b>Aufgaben nach Ordner auflisten<\/b>, die wir durch Anklicken hinzuf&uuml;gen.<\/p>\n<p>Hier finden wir in den Eigenschaften unter Parameter die beiden Parameter <b>To-Do-List <\/b>und <b>H&ouml;chstzahl<\/b>. Wenn wir das Nachschlagfeld f&uuml;r <b>To-Do-Liste <\/b>&ouml;ffnen, sehen wir alle To-Do-Listen f&uuml;r das angegebene Konto und ganz unten den Eintrag <b>Benutzerdefinierten Wert eingeben<\/b>. Dies blendet die Schaltfl&auml;che aus Bild 10 ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_010.png\" alt=\"Weitere Auswahlm&ouml;glichkeiten\" width=\"599,6265\" height=\"262,9278\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Weitere Auswahlm&ouml;glichkeiten<\/span><\/b><\/p>\n<p>Klicken wir auf den Blitz oben, erhalten wir die aus den bisherigen Elementen verf&uuml;gbaren Parameter, hier <b>listId <\/b>und <b>count <\/b>aus dem <b>manual<\/b>-Element (siehe Bild 11). Hier w&auml;hlen wir folglich das Element <b>listId <\/b>f&uuml;r <b>To-Do-Liste <\/b>aus und <b>count <\/b>f&uuml;r <b>H&ouml;chstanzahl<\/b> und haben so schon alle Einstellungen f&uuml;r diese Aktion festgelegt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_011.png\" alt=\"Hinzuf&uuml;gen der Parameter\" width=\"649,627\" height=\"326,9035\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Hinzuf&uuml;gen der Parameter<\/span><\/b><\/p>\n<p>Du solltest an dieser Stelle auch noch pr&uuml;fen, ob du mit einem Microsoft To-Do-Konto verbunden bist und dies gegebenenfalls an der Stelle aus Bild 12 erledigst.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_012.png\" alt=\"Pr&uuml;fen der Verbindung mit Microsoft To-Do\" width=\"549,6265\" height=\"302,7831\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Pr&uuml;fen der Verbindung mit Microsoft To-Do<\/span><\/b><\/p>\n<h2>Array-Variable initialisieren<\/h2>\n<p>Im vorherigen Beispiel konnten wir an dieser Stelle bereits die <b>Antwort<\/b>-Aktion hinzuf&uuml;gen. Das ist hier noch nicht m&ouml;glich, denn wir m&uuml;ssen die Elemente des Ergebnisses der Aufgaben nach <b>Ordner auflisten<\/b>-Aktion noch aufbereiten.<\/p>\n<p>Dazu geben wir als Suchbegriff <b>Variable <\/b>an und w&auml;hlen dort den Eintrag <b>Variable initialisieren <\/b>aus (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_013.png\" alt=\"Hinzuf&uuml;gen der Aktion Variable initialisieren\" width=\"424,6267\" height=\"395,8532\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Hinzuf&uuml;gen der Aktion Variable initialisieren<\/span><\/b><\/p>\n<p>F&uuml;r dieses neue Variable-Element stellen wir nun die Parameter ein (siehe Bild 14). Hier finden wir den Parameter <b>Name<\/b>, dem wir den Wert <b>tasksArray <\/b>zuweisen. Der Parameter <b>Type <\/b>erh&auml;lt den Wert <b>Array <\/b>und f&uuml;r <b>Value <\/b>stellen wir mit einem eckigen Klammernpaar ein leeres Array ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_014.png\" alt=\"Einstellen der Parameter\" width=\"424,6267\" height=\"398,6475\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Einstellen der Parameter<\/span><\/b><\/p>\n<h2>Schleife &uuml;ber alle Aufgaben<\/h2>\n<p>Nun ben&ouml;tigen wir eine Schleife, in der wir alle Aufgaben in die Array-Variable eintragen. Diese finden wir unter dem Namen <b>Auf alle anwenden <\/b>im Bereich <b>Control<\/b> (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_015.png\" alt=\"Hinzuf&uuml;gen der Aktion Auf alle anwenden\" width=\"424,6267\" height=\"341,3486\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Hinzuf&uuml;gen der Aktion Auf alle anwenden<\/span><\/b><\/p>\n<p>In den Parametern dieses neuen Elements legen wir nun fest, welchen Output eines vorherigen Elements wie verarbeiten wollen. Hier w&auml;hlen wir den Eintrag <b>Textk&ouml;rper <\/b>aus <b>Aufgaben nach Ordner auflisten aus<\/b> (siehe Bild 16).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_016.png\" alt=\"Ausw&auml;hlen des Outputs, der in der Schleife verarbeitet werden soll\" width=\"599,6265\" height=\"373,9245\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Ausw&auml;hlen des Outputs, der in der Schleife verarbeitet werden soll<\/span><\/b><\/p>\n<p>Danach m&uuml;ssen wir noch festlegen, was genau mit diesen Inhalten geschehen soll. Dazu klicken wir auf die <b>Plus<\/b>-Schaltfl&auml;che innerhalb des <b>Auf alle anwenden<\/b>-Elements (siehe Bild 17) und w&auml;hlen die <b>Aktion hinzuf&uuml;gen<\/b>-Anweisung aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_017.png\" alt=\"Hier f&uuml;gen wir noch ein Element hinzu.\" width=\"249,6268\" height=\"467,3669\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Hier f&uuml;gen wir noch ein Element hinzu.<\/span><\/b><\/p>\n<p>Hier suchen wir im Suchen-Feld wieder nach dem Schl&uuml;sselwort <b>Variable <\/b>und w&auml;hlen diesmal den Eintrag <b>An Arrayvariable anf&uuml;gen <\/b>aus.<\/p>\n<p>Hier sind nun zwei Parameter festzulegen. F&uuml;r Name w&auml;hlen wir den Namen der Variable aus, also <b>tasksArray<\/b>. Einen anderen Eintrag gibt es auch nicht.<\/p>\n<p>F&uuml;r <b>Value<\/b> klicken wir wieder auf das Blitz-Symbol und finden dann eine ganze Reihe von Elementen vor, wenn wir f&uuml;r <b>Aufgaben nach Ordner auflisten <\/b>auf <b>Mehr anzeigen (19) <\/b>klicken (siehe Bild 18).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_018.png\" alt=\"Auswahl der Eigenschaften der Aufgabe\" width=\"674,627\" height=\"437,0821\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Auswahl der Eigenschaften der Aufgabe<\/span><\/b><\/p>\n<p>Aber k&ouml;nnen wir hier nun nur ein Element ausw&auml;hlen? Was ist, wenn wir beispielsweise die ID und den Titel selektieren wollen? Das ist kein Problem: Wir k&ouml;nnen beliebig viele Elemente ausw&auml;hlen und diese nacheinander per Mausklick zur Eigenschaft <b>Value <\/b>hinzuf&uuml;gen.<\/p>\n<p>In diesem Fall wollen wir uns jedoch mit ID und Titel begn&uuml;gen, damit die R&uuml;ckgabe &uuml;berschaubar bleibt.<\/p>\n<p>Das reicht allerdings noch nicht aus, denn so werden die Elemente einfach in einem JSON-Dokument aneinandergeh&auml;ngt. Wir bearbeiten also die beiden Elemente in der Eigenschaft Value, indem wir die Struktur eines JSON-Dokuments hinzuf&uuml;gen &#8211; hier in Form von geschweiften Klammern und den Namen f&uuml;r die Elemente, hier <b>id <\/b>und <b>title<\/b> (siehe Bild 19).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_019.png\" alt=\"Strukturieren der Eigenschaften der Aufgabe in einem JSON-Dokument\" width=\"449,6267\" height=\"334,6997\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Strukturieren der Eigenschaften der Aufgabe in einem JSON-Dokument<\/span><\/b><\/p>\n<h2>Verfassen der Antwort<\/h2>\n<p>Nach der Schleife f&uuml;gen wir eine weitere Aktion hinzu. Diese finden wir &uuml;ber die Suche nach dem Begriff <b>Verfassen <\/b>sehr schnell und f&uuml;gen sie hinzu.<\/p>\n<p>F&uuml;r den Parameter <b>Eingaben <\/b>w&auml;hlen wir &uuml;ber die durch Anklicken des Blitz-Icons erscheinende Variable <b>tasksArray <\/b>aus.<\/p>\n<h2>Hinzuf&uuml;gen des Antwort-Elements<\/h2>\n<p>Schlie&szlig;lich ben&ouml;tigen wir noch das Antwort-Element selbst, das wir nach Eingabe des Suchbegriffs Antwort im Bereich Anforderung finden.<\/p>\n<p>Hier behalten wir den Wert <b>200 <\/b>f&uuml;r den Parameter <b>Status Code <\/b>bei und f&uuml;gen f&uuml;r <b>Body <\/b>den Wert <b>Verfassen|Ausgaben <\/b>hinzu.<\/p>\n<h2>Speichern des Flows<\/h2>\n<p>Ob wir alles korrekt angelegt haben, erfahren wir, wenn wir den Flow mit einem Klick auf die entsprechende Schaltfl&auml;che speichern. Wenn dies gelingt, k&ouml;nnen wir ihn mit der im Anschluss vorgestellten VBA-Prozedur testen.<\/p>\n<p>Diese finden wir in Listing 2. Die Prozedur <b>GetTaskOfAList <\/b>nimmt mit dem Parameter <b>strListID <\/b>die ID der Liste entgegen, deren To Do-Aufgaben ermittelt werden sollen. Folglich ben&ouml;tigen wir noch einen Aufruf dieser Prozedur, mit der wir die ID ermitteln und &uuml;bergeben. Hier haben wir die ID bereits vorab ermittelt und &uuml;bergeben diese als Parameter:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>GetTasksOfAList(strListID<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.ServerXMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>strUrl<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objJSON<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.ServerXMLHTTP60\r\n     strUrl = \"https:\/\/prod2-11.germanywestcentral.logic.azure.com:443\/workflows\/2641fd9330094a83bf60f40088c...\"\r\n     <span style=\"color:blue;\">With<\/span> objXMLHTTP\r\n         .Open \"POST\", strUrl, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"application\/json\"\r\n         strRequest = \"{\"\"listId\"\": \"\"\" & strListID & \"\"\", \"\"count\"\":999}\"\r\n         .send strRequest\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Select Case objXMLHTTP.status\r\n         <span style=\"color:blue;\">Case <\/span>200\r\n             strResponse = objXMLHTTP.responseText\r\n             <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strResponse)\r\n             For i = 1 To objJSON.Count\r\n                 <span style=\"color:blue;\">Debug.Print<\/span> objJSON.Item(i).Item(\"id\"), objJSON.Item(i).Item(\"title\")\r\n             <span style=\"color:blue;\">Next<\/span> i\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler: \" & objXMLHTTP.status & \" - \" & objXMLHTTP.statusText\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Prozedur zum Ermitteln aller Aufgaben einer Liste in To Do<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_GetTasksOfAList()\r\n     <span style=\"color:blue;\">Dim <\/span>strListID<span style=\"color:blue;\"> As String<\/span>\r\n     strListID = \"AQMkADAwATNiZmYAZC05M2I2LTRiYTgtMD...\"\r\n     GetTasksOfAList strListID\r\n<span style=\"color:blue;\">End Sub<\/span> <\/pre>\n<p>Die Prozedur verwendet eine Variable namens <b>strURL<\/b>, der wir noch die URL zuweisen m&uuml;ssen, die wir f&uuml;r den Aufruf des Flows verwenden k&ouml;nnen. Diese wurde beim Speichern des Flows im Element <b>manual <\/b>im Parameter <b>HTTP-URL <\/b>hinterlegt. Dort k&ouml;nnen wir sie herauskopieren und f&uuml;r <b>strUrl <\/b>einf&uuml;gen. Dann rufen wir die URL mit dem <b>objXMLHTTP<\/b>-Objekt auf und &uuml;bergeben neben der Methode <b>POST <\/b>die URL. Au&szlig;erdem setzen wir den &uuml;blichen Request-Header. F&uuml;r die <b>Send<\/b>-Methode stellen wir vorab in der Variablen <b>strRequest <\/b>ein JSON-Dokument mit der <b>listId <\/b>und der maximalen Anzahl (<b>count<\/b>) zusammen.<\/p>\n<p>Danach werten wir das Ergebnis, zuerst die <b>status<\/b>-Eigenschaft. Diese liefert optimalerweise den Wert <b>200<\/b>, dann hat alles funktioniert. In diesem Fall lesen wir den Inhalt der Eigenschaft <b>responseText <\/b>in die Variable <b>strResponse <\/b>ein. Wir verwenden die <b>ParseJSON<\/b>-Funktion, um aus dem zur&uuml;ckgelieferten JSON-Dokument eine Objektstruktur zu machen, die wir nach bew&auml;hrter Manier &uuml;ber das mit <b>GetJSONDOM <\/b>einzusehende Objektmodell auslesen k&ouml;nnen.<\/p>\n<p>In diesem Fall durchlaufen wir in einer Schleife von <b>1<\/b> bis zur Anzahl der Element von <b>objJSON <\/b>die mit <b>objJSON.Item(i).Item(&#8220;id&#8221;)<\/b> und <b>objJSON.Item(i).Item(&#8220;title&#8221;) <\/b>referenzierten <b>IDs <\/b>und <b>Titel <\/b>der Aufgaben. Diese geben wir hier der Einfachheit halber im Direktbereich des VBA-Editors aus.<\/p>\n<p>Sollte ein Fehler auftreten und der Flow liefert nicht den Wert <b>200 <\/b>zur&uuml;ck, geben wir den gelieferten Status plus Text in einem Meldungsfenster aus.<\/p>\n<p>Die IDs und Titel k&ouml;nnten wir beispielsweise in eine Excel- oder Access-Tabelle schreiben und sie dann nutzen, um gezielt weitere Eigenschaften einer einzelnen Aufgabe auszulesen.<\/p>\n<h2>Update des Flows zum Anlegen einer Aufgabe<\/h2>\n<p>Im Artikel <b>To Do-Aufgabe mit Power Automate und VBA anlegen <\/b>(<b>www.vbentwickler.de\/431<\/b>) haben wir einfach nur eine To Do-Aufgabe angelegt. Den dortigen Flow wollen wir noch erweitern um die R&uuml;ckgabe der ID des neu angelegten Flows.<\/p>\n<p>Dazu f&uuml;gen wir den beiden Elementen <b>manual <\/b>und <b>Aufgabe hinzuf&uuml;gen <\/b>noch das Element <b>Antwort <\/b>hinzu (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AddToDoTask(strTitle<span style=\"color:blue;\"> As String<\/span>, datDue<span style=\"color:blue;\"> As Date<\/span>, <span style=\"color:blue;\">Optional<\/span> strID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>strUrl<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objJSON<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.XMLHTTP60\r\n     strUrl = \"https:\/\/prod2-20.germanywestcentral.logic.azure.com:443\/workflows\/966850d91ed3480badfcb64c1...\"\r\n     strJSON = \"{\"\"title\"\":\"\"\" & strTitle & \"\"\",\"\"dueDate\"\":\"\"\" & Format(datDue, \"yyyy-mm-ddT00:00:00Z\") _\r\n         & \"\"\",\"\"importance\"\":\"\"normal\"\"}\"\r\n     <span style=\"color:blue;\">With<\/span> objXMLHTTP\r\n         .Open \"POST\", strUrl, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"application\/json\"\r\n         .send strJSON\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Select Case objXMLHTTP.status\r\n         <span style=\"color:blue;\">Case <\/span>200\r\n             strResponse = objXMLHTTP.responseText\r\n             <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strResponse)\r\n             AddToDoTask = <span style=\"color:blue;\">True<\/span>\r\n             strID = objJSON.Item(\"id\")\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler: \" & objXMLHTTP.status & \" - \" & objXMLHTTP.statusText\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = Nothing\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozedur zum Anlegen einer Aufgabe mit R&uuml;ckgabe der ID<\/span><\/b><\/p>\n<p>F&uuml;r diese legen wir f&uuml;r den Parameter <b>Body<\/b> den Wert aus Bild 20 fest.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_020.png\" alt=\"R&uuml;ckgabewert beim Anlegen einer neuen Aufgabe\" width=\"674,627\" height=\"375,0417\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: R&uuml;ckgabewert beim Anlegen einer neuen Aufgabe<\/span><\/b><\/p>\n<p>Nat&uuml;rlich m&uuml;ssen wir auch die Prozedur anpassen, welche die neue Aufgabe anlegt. Diese legen wir gleich als Funktion an, die den Wert <b>True <\/b>oder <b>False <\/b>zur&uuml;ckgibt und die im Falle von <b>True <\/b>mit dem Parameter <b>strID <\/b>die ID der neuen Aufgabe liefert. Au&szlig;erdem soll die Funktion den Titel und das Datum der anzulegenden Aufgabe als Parameter entgegennehmen.<\/p>\n<p>Diese werden in das mit dem Request gesendete JSON-Dokument geschrieben. Der Request erfolgt wie in den bereits zuvor beschriebenen Prozeduren.<\/p>\n<p>Beim Auswerten des Ergebnisses lesen wir den Wert von <b>objJSON.Item(&#8220;id&#8221;) <\/b>in den R&uuml;ckgabeparameter <b>strID <\/b>ein.<\/p>\n<p>Der Aufruf erfolgt mit einer Prozedur wie der folgenden:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_AddToDoTask()\r\n     <span style=\"color:blue;\">Dim <\/span>strID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>AddToDoTask(\"Neue Aufgabe\", Date, strID) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Neue ID: \" & strID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Eingaben und R&uuml;ckgabewerte erweitern<\/h2>\n<p>Gerade beim Anlegen einer Aufgabe m&ouml;chten wir vielleicht noch mehr Flexibilit&auml;t und wollen noch weitere Eigenschaften von VBA aus &uuml;bergeben wie zum Beispiel einen Body-Text.<\/p>\n<p>Dazu sind folgende Schritte n&ouml;tig:<\/p>\n<ul>\n<li>Erweitern des JSON-Schemas im Element <b>manual <\/b>des Flows<\/li>\n<li>Erweitern des mit dem Request gesendeten JSON-Dokuments im VBA-Code<\/li>\n<li>Hinzuf&uuml;gen der zus&auml;tzlichen Informationen im Element <b>Aufgabe hinzuf&uuml;gen<\/b><\/li>\n<\/ul>\n<p>Schauen wir uns an, wie das funktioniert &#8211; insbesondere im Hinblick darauf, dass wir gegebenenfalls &uuml;bergebene Werte nur optional verwenden wollen.<\/p>\n<p>Dazu schauen wir uns erst einmal an, welche Werte wir einer neuen Aufgabe &uuml;berhaupt zuweisen k&ouml;nnen. Dies finden wir im Element <b>Aufgabe hinzuf&uuml;gen <\/b>(siehe Bild 21). Alle dort angegebenen Elemente k&ouml;nnen wir mit dem Request &uuml;bergeben. Diesen gestalten wir dazu wie folgt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_023.png\" alt=\"Leere Parameter einer neuen Aufgabe\" width=\"424,643\" height=\"445,9438\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 21: Leere Parameter einer neuen Aufgabe<\/span><\/b><\/p>\n<pre>{\r\n     \"type\": \"object\",\r\n     \"properties\": {\r\n         \"listID\": {\r\n             \"type\": \"string\"\r\n         },\r\n         \"title\": {\r\n             \"type\": \"string\"\r\n         },\r\n         \"dueDateTime\": {\r\n             \"type\": \"string\"\r\n         },\r\n         \"reminderDateTime\": {\r\n             \"type\": \"string\"\r\n         },\r\n         \"importance\": {\r\n             \"type\": \"string\"\r\n         },\r\n         \"status\": {\r\n             \"type\": \"string\"\r\n         },\r\n         \"bodyContent\": {\r\n             \"type\": \"string\"\r\n         }\r\n     }\r\n}<\/pre>\n<p>Nun erweitern wir den VBA-Code f&uuml;r die anzulegende Aufgabe um die entsprechenden Elemente. Da das JSON-Dokument nun schon etwas umfangreicher wird, stellen wir es auf alternative Weise zusammen. Au&szlig;erdem wollen wir alle Werte f&uuml;r die zu erstellende Aufgabe als Parameter &uuml;bergeben und passen den Funktionskopf entsprechend an (Erweiterungen siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AddToDoTask(strTitle<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strListID<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> datDue<span style=\"color:blue;\"> As Date<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> datReminder<span style=\"color:blue;\"> As Date<\/span>, <span style=\"color:blue;\">Optional<\/span> strImportance<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strStatus<span style=\"color:blue;\"> As String<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strBody<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     ...\r\n     <span style=\"color:blue;\">Dim <\/span>dicRequest<span style=\"color:blue;\"> As <\/span>Dictionary\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.XMLHTTP60\r\n     strUrl = \"https:\/\/prod2-20.germanywestcentral.logic.azure.com:443\/workflows\/966850d91ed3480badfcb64c1b...\"\r\n     <span style=\"color:blue;\">Set<\/span> dicRequest = <span style=\"color:blue;\">New<\/span> Dictionary\r\n     <span style=\"color:blue;\">With<\/span> dicRequest\r\n         .Add \"listId\", strListID\r\n         .Add \"title\", strTitle\r\n         .Add \"dueDate\", Format(datDue, \"yyyy-mm-ddT00:00:00Z\")\r\n         .Add \"reminderDateTime\", Format(datReminder, \"yyyy-mm-ddT00:00:00Z\")\r\n         .Add \"importance\", strImportance\r\n         .Add \"status\", strStatus\r\n         .Add \"bodyContent\", strBody\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     strJSON = ConvertToJson(dicRequest)\r\n     ...\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur zum Anlegen einer Aufgabe mit allen Parametern<\/span><\/b><\/p>\n<p>Dazu deklarieren wir eine <b>Dictionary<\/b>-Objektvariable namens <b>dicRequest<\/b>. Dieses f&uuml;llen wir mit einem neuen <b>Dictionary<\/b>-Objekt, das wir anschlie&szlig;end &uuml;ber die <b>Add<\/b>-Methode mit den Parametern f&uuml;llen.<\/p>\n<p>Dabei passen wir das Format f&uuml;r die Datumsangaben noch auf <b>yyyy-mm-ddT00:00:00Z<\/b> an. F&uuml;r den Parameter <b>importance <\/b>k&ouml;nnen wir die Werte <b>high<\/b>, <b>low <\/b>oder <b>normal    <\/b>verwenden. F&uuml;r den Parameter <b>status <\/b>nutzen wir einen der Werte <b>notStarted<\/b>, <b>inProgress<\/b>, <b>completed<\/b>, <b>waitingOnOthers <\/b>oder <b>deferred<\/b>. Das so zusammengestellte <b>Dictionary<\/b>-Objekt wandeln wir mit der Funktion <b>ConvertToJson <\/b>in eine Zeichenkette mit dem JSON-Dokument um. Der Rest der Funktion arbeitet wie die vorherige Version.<\/p>\n<p>Den Aufruf k&ouml;nnen wir nun so gestalten:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_AddToDoTask()\r\n     <span style=\"color:blue;\">Dim <\/span>strID<span style=\"color:blue;\"> As String<\/span>\r\n     If AddToDoTask(\"Neue Aufgabe normal\", _\r\n             \"AQMkADAwATNiZmYAZC05M...\", Date, Date, _\r\n             \"normal\", \"notStarted\", \"Inhalt der Aufgabe\", _\r\n             strID) = <span style=\"color:blue;\">True<\/span> Then\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Neue ID: \" & strID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit stellen wir nun sicher, dass die Parameter wie im Element <b>manual <\/b>des Flows definiert &uuml;bergeben werden.<\/p>\n<h2>Parameter den Eigenschaften der neuen Aufgabe zuweisen<\/h2>\n<p>Nun m&uuml;ssen wir diese noch entsprechend in die zu erstellende Aufgabe einarbeiten. Dazu klicken wir das Element <b>Aufgabe hinzuf&uuml;gen <\/b>an und erhalten den Dialog aus Bild 22.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_022.png\" alt=\"Parameter beim Anlegen einer neuen Aufgabe\" width=\"549,643\" height=\"573,994\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 22: Parameter beim Anlegen einer neuen Aufgabe<\/span><\/b><\/p>\n<p>Hier klicken wir jeweils auf das Element, f&uuml;r das wir den Parameter f&uuml;llen wollen und dann auf das Blitz-Symbol. Nun sehen wir die Liste der verf&uuml;gbaren Elemente, von denen wir das jeweils gew&uuml;nschte anklicken und so den Parameter einf&uuml;gen.<\/p>\n<h2>R&uuml;ckgabe definieren<\/h2>\n<p>Nun wollen wir noch die R&uuml;ckgabewerte definieren. Diese k&ouml;nnen wir so nicht nur f&uuml;r das Anlegen einer neuen Aufgabe nutzen, sondern auch beispielsweise dann, wenn wir den Inhalt einer speziellen Aufgabe auslesen wollen. Dazu klicken wir auf das Element <b>Antwort<\/b>.<\/p>\n<p>Hier ist nun wieder ein wenig Handarbeit angesagt. Wir m&uuml;ssen n&auml;mlich ein JSON-Dokument zusammenstellen, das die korrekten Bezeichnungen sowie die aktuellen Werte der Parameter enth&auml;lt. Das Ergebnis sieht wie in Bild 23 aus. Wir schreiben hier jeweils eine neue Zeile in das JSON-Dokument und platzieren die Einf&uuml;gemarke dann zwischen den beiden Anf&uuml;hrungszeichen f&uuml;r den Wert eines Name-Wert-Paares.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_024.png\" alt=\"R&uuml;ckgabewert beim Anlegen einer neuen Aufgabe zusammenstellen\" width=\"700\" height=\"576,3914\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 23: R&uuml;ckgabewert beim Anlegen einer neuen Aufgabe zusammenstellen<\/span><\/b><\/p>\n<p>Dann klicken wir auf das Blitz-Symbol und sehen die im Flow verf&uuml;gbaren Elemente. Hier erweitern wir die Anzeige von Aufgabe hinzuf&uuml;gen und finden nun alle Elemente, die wir ben&ouml;tigen, in der Liste.<\/p>\n<p>Auf diese Weise stellen wir das JSON-Dokument mit allen relevanten Informationen zusammen.<\/p>\n<h2>Tipp: Antwort f&uuml;r andere Flows &uuml;ber Zwischenablage kopieren<\/h2>\n<p>Diese Antwort k&ouml;nnen wir noch anderen Stellen gebrauchen, zum Beispiel beim Ermitteln der Werte einer Aufgabe oder nach dem &Auml;ndern einer Aufgabe. Dazu kopieren wir einfach den Inhalt aus dem Feld <b>Body<\/b> in die Zwischenablage und f&uuml;gen diesen im gew&uuml;nschten Flow wieder ein.<\/p>\n<p>Wir k&ouml;nnen dies auch in einer Textdatei oder an einem anderen Ort zwischenspeichern. Hier sehen wir, dass sich hinter den Platzhaltern wiederum Ausdr&uuml;cke in einer bestimmten Notation befinden, die wir hier nicht weiter untersuchen, sondern nur einmal vorstellen wollen. Anbei die gek&uuml;rzte Fassung unserer Antwort:<\/p>\n<pre>{  \"id\": \"@{outputs(''Aufgabe_hinzuf&uuml;gen'')?[''body\/id']}\",  \"createdDateTime\": \"@{outputs(''Aufgabe_hinzuf&uuml;gen'')?[''body\/createdDateTime']}\",  \"lastModifiedDateTime\": \"@{outputs(''Aufgabe_hinzuf&uuml;gen'')?[''body\/lastModifiedDateTime']}\",\r\n   ...}<\/pre>\n<p>In der oben beschriebenen Funktion <b>AddToDoTask<\/b> werten wir jedoch nur die ID des neuen Elements aus, da wir die &uuml;brigen Informationen f&uuml;r das neue Element ja bereits kennen &#8211; wir haben sie schlie&szlig;lich &uuml;bergeben.<\/p>\n<h2>Eine Aufgabe l&ouml;schen<\/h2>\n<p>Wenn wir Aufgaben per VBA hinzuf&uuml;gen, wollen wir diese gegebenenfalls auch wieder l&ouml;schen.<\/p>\n<p>Auch daf&uuml;r gibt es eine Aktion. Diese hei&szlig;t <b>Aufgabe l&ouml;schen <\/b>und wir f&uuml;gen sie einem neuen Flow namens <b>Aufgabe l&ouml;schen <\/b>hinzu.<\/p>\n<p>Diese Aktion erwartet die Angabe der To Do-Liste als auch die ID der zu l&ouml;schenden Aufgabe als Parameter.  Also f&uuml;gen wir diese beiden zum Element manual unter Parameter f&uuml;r den Anforderungstext im JSON-Format in Form des Schemas aus Bild 24 hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_025.png\" alt=\"Flow zum L&ouml;schen einer Aufgabe\" width=\"700\" height=\"421,0998\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 24: Flow zum L&ouml;schen einer Aufgabe<\/span><\/b><\/p>\n<p>Danach bearbeiten wir das Element <b>Aufgabe l&ouml;schen<\/b>.<\/p>\n<p>Hier f&uuml;gen wir f&uuml;r die beiden Parameter <b>To-Do-List <\/b>und <b>To-Do-Aufgabe <\/b>die beiden zuvor im Element <b>manuel<\/b> definierten Parameter hinzu (siehe Bild 25).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_026.png\" alt=\"Parameter der Aktion Aufgabe l&ouml;schen\" width=\"700\" height=\"295,9731\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 25: Parameter der Aktion Aufgabe l&ouml;schen<\/span><\/b><\/p>\n<p>Hier ben&ouml;tigen wir au&szlig;erdem kein Antwort-Element. Die Aktion <b>Aufgaben l&ouml;schen <\/b>liefert bereits den Wert <b>202 <\/b>f&uuml;r den Status zur&uuml;ck, wenn die Aufgabe erfolgreich gel&ouml;scht werden konnte.<\/p>\n<p>Wenn wir nun aus dem Element manual wieder die URL kopieren und den Flow f&uuml;r alle freigegeben haben, brauchen wir nur noch die VBA-Funktion zum Aufruf des Flows zu gestalten.<\/p>\n<p>Diese Funktion sieht wie in Listing 5 aus. Diese rufen wir wie folgt auf:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DeleteToDoTask(strListID<span style=\"color:blue;\"> As String<\/span>, strTaskID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>strUrl<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.XMLHTTP60\r\n     strUrl = \"https:\/\/prod2-15.germanywestcentral.logic.azure.com:443\/workflows\/8d95215737f04d238ce06892628d48b8\/...\"\r\n     strJSON = \"{\"\"listId\"\":\"\"\" & strListID & \"\"\",\"\"taskId\"\":\"\"\" & strTaskID & \"\"\"}\"\r\n     <span style=\"color:blue;\">With<\/span> objXMLHTTP\r\n         .Open \"POST\", strUrl, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"application\/json\"\r\n         .send strJSON\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Select Case objXMLHTTP.status\r\n         <span style=\"color:blue;\">Case <\/span>202\r\n             DeleteToDoTask = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler: \" & objXMLHTTP.status & \" - \" & objXMLHTTP.statusText\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = Nothing\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Funktion zum L&ouml;schen eines Tasks<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_DeleteToDoTask()\r\n     <span style=\"color:blue;\">Dim <\/span>strListID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTaskID<span style=\"color:blue;\"> As String<\/span>\r\n     strListID = \"AQMkADAwATNiZmYAZC05M2I2LTRiYTgtMDACL...\"\r\n     strTaskID = \"AQMkADAwATNiZmYAZC05M2I2LTRiYTgtMDACL...\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> DeleteToDoTask(strListID, strTaskID)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit k&ouml;nnen wir Aufgaben zuverl&auml;ssig l&ouml;schen. Das L&ouml;schen einer Aufgabe liefert immer das Ergebnis <b>202<\/b>. Allerdings wird dieses Ergebnis auch geliefert, wenn keine Aufgabe gel&ouml;scht wird. Letztlich bedeutet <b>202 <\/b>auch nur, dass die Anfrage akzeptiert wurde. Ob die Ausf&uuml;hrung tats&auml;chlich erfolgreich war, k&ouml;nnen wir aktuell nur &uuml;ber den Ausf&uuml;hrungsverlauf des Flows pr&uuml;fen. Dazu klicken wir den Flow in der Liste an und schauen uns die Liste des Ausf&uuml;hrungsverlaufs an (siehe Bild 26). Hier sehen wir, dass einige Ausf&uuml;hrungen einen Fehler als Status liefern. Diese Ausf&uuml;hrungen haben jedoch keinen Fehler zur&uuml;ckgeliefert. Und die Aktion <b>Aufgabe l&ouml;schen <\/b>liefert auch keine M&ouml;glichkeit, das Ergebnis auszuwerten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_027.png\" alt=\"Ergebnisse eines Flows\" width=\"649,643\" height=\"516,7615\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 26: Ergebnisse eines Flows<\/span><\/b><\/p>\n<p>Wie k&ouml;nnen dies jedoch so anpassen, dass wir vor dem L&ouml;schen pr&uuml;fen, ob die Aufgabe &uuml;berhaupt vorhanden ist und anschlie&szlig;end pr&uuml;fen, ob sie gel&ouml;scht wurde. Damit k&ouml;nnen wir uns auch gleich einmal den Umgang mit Bedingungen in Power Automate ansehen.<\/p>\n<p>Wie wollen wir pr&uuml;fen, ob das L&ouml;schen erfolgreich war oder nicht?<\/p>\n<p>Dazu erweitern wir unseren Flow erheblich, sodass er anschlie&szlig;end wie in Bild 27 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_028.png\" alt=\"Flow zum L&ouml;schen einer Aufgabe, neue Version\" width=\"649,643\" height=\"831,9445\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 27: Flow zum L&ouml;schen einer Aufgabe, neue Version<\/span><\/b><\/p>\n<p>Nach dem Start versuchen wir, die Aufgabe mit der Aktion <b>Aufgabe abrufen <\/b>abzurufen. Dies kann fehlschlagen, wenn die Aufgabe nicht vorhanden ist. Wir schalten eine Bedingung nach, in der wir pr&uuml;fen, ob der Wert der ID der mit <b>Aufgabe abrufen <\/b>gefundenen Aufgabe mit dem Wert der ID der zu l&ouml;schenden Aufgabe aus dem Aufruf &uuml;bereinstimmt. Ist dies der Fall, fahren wir mit dem <b>True<\/b>-Pfad fort.<\/p>\n<p>Hier l&ouml;schen wir nun die Aufgabe mit <b>Aufgabe l&ouml;schen <\/b>und rufen die Aufgabe danach mit <b>Aufgabe abrufen 1 <\/b>erneut ab. In der folgenden Bedingung pr&uuml;fen wir, ob die ID der mit <b>Aufgabe abrufen 1 <\/b>ermittelten Aufgabe mit der beim Start &uuml;bergebenen Aufgabe &uuml;bereinstimmt.<\/p>\n<p>Falls ja, geben wir mit der Antwort den Status <b>400 <\/b>zur&uuml;ck und den Text <b>Task not deleted<\/b>. Falls die ID nicht &uuml;bereinstimmt, liefert die Antwort unter <b>False <\/b>den Status <b>200 <\/b>und den Text <b>Task deleted <\/b>zur&uuml;ck.<\/p>\n<p>Wenn bereits bei der ersten Bedingung die &uuml;bergebene ID nicht mit der abgerufenen ID &uuml;bereinstimmt, was der Fall ist, wenn diese nicht vorhanden ist, gehen wir in den <b>False<\/b>-Teil der ersten Bedingung.<\/p>\n<p>Die dortige Antwort gibt den Status <b>400 <\/b>und den Text <b>Task not found <\/b>zur&uuml;ck.<\/p>\n<p>Hier sind einige Feinheiten zu beachten. Die Elemente f&uuml;gen wir jeweils durch Anklicken des Plus-Zeichens und anschlie&szlig;endes Ausw&auml;hlen von <b>Aktion hinzuf&uuml;gen <\/b>aus.<\/p>\n<p>F&uuml;r die erste Bedingung stellen wir unter Parameter die Bedingung aus Bild 28 ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_029.png\" alt=\"Bedingung zum Pr&uuml;fen, ob der zu l&ouml;schende Task vorhanden ist\" width=\"549,643\" height=\"212,5157\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 28: Bedingung zum Pr&uuml;fen, ob der zu l&ouml;schende Task vorhanden ist<\/span><\/b><\/p>\n<p>Dir ist vielleicht schon aufgefallen, dass &uuml;ber der Bedingung ein roter und ein gr&uuml;ner Punkt abgebildet sind. Diese kannst Du beeinflussen, indem Du f&uuml;r die Bedingung auf den Bereich <b>Einstellungen <\/b>klickst.<\/p>\n<p>Hier klickst Du nochmals auf den Namen <b>Aufgabe abrufen<\/b>. Es erscheinen die vier Optionen <b>Ist erfolgreich<\/b>, <b>Timeout<\/b>, <b>Wurde &uuml;bersprungen <\/b>und <b>Fehlgeschlagen<\/b>.<\/p>\n<p>Wir markieren wie in Bild 29 die beiden Eintr&auml;ge <b>Ist erfolgreich <\/b>und <b>Fehlgeschlagen<\/b>. Normalerweise ist hier nur <b>Ist erfolgreich <\/b>aktiviert. Das bedeutet, dass die weiteren Aktionen beim Fehlschlagen einer Aktion standardm&auml;&szlig;ig gar nicht erst ausgef&uuml;hrt werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_030.png\" alt=\"Einstellung, f&uuml;r welches Ergebnis der Aktion Aufgabe abrufen die Bedingung &uuml;berhaupt aufgerufen werden soll\" width=\"549,643\" height=\"310,4201\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 29: Einstellung, f&uuml;r welches Ergebnis der Aktion Aufgabe abrufen die Bedingung &uuml;berhaupt aufgerufen werden soll<\/span><\/b><\/p>\n<p>Damit wir auch beim Fehlschlagen das korrekte Ergebnis in Form einer Antwort zur&uuml;ckgeben k&ouml;nnen, m&uuml;ssen wir hier auch <b>Fehlgeschlagen <\/b>aktivieren.<\/p>\n<p>Das Gleiche gilt f&uuml;r den ersten Schritt im ersten <b>True<\/b>-Zweig nach dem L&ouml;schen der Aufgabe und auch f&uuml;r die zweite Bedingung. Wir m&uuml;ssen hier immer <b>Ist erfolgreich <\/b>und <b>Fehlgeschlagen <\/b>aktivieren, damit der Flow in beiden F&auml;llen weiterl&auml;uft.<\/p>\n<p>Die aufrufende VBA-Funktion m&uuml;ssen wir noch nicht einmal anpassen. Nur, wenn uns der Grund f&uuml;r einen anderen Statuswert als <b>200 <\/b>interessiert, k&ouml;nnen wir diesen beispielsweise in der <b>MsgBox <\/b>noch wie folgt ausgeben:<\/p>\n<pre><span style=\"color:blue;\">MsgBox<\/span> \"Fehler: \" & objXMLHTTP.status & \" - \" & objXMLHTTP.statusText & \" \" & objXMLHTTP.responseText<\/pre>\n<h2>Testen eines Flows<\/h2>\n<p>Oben rechts k&ouml;nnen wir nach dem Speichern eines Flows auf die Schaltfl&auml;che Testen klicken. Dies zeigt einen Bereich an, mit dem wir unter der Option <b>Automatisch <\/b>festlegen k&ouml;nnen, dass wir einen k&uuml;rzlich verwendeten Ausl&ouml;ser zum Testen nutzen wollen (siehe Bild 30). Wir haben in diesem Fall den Flow bereits einmal per VBA aufgerufen und somit Testdaten bereitgestellt. Diese k&ouml;nnen wir nun zum Aufruf zu Testzwecken nutzen. Klicken wir nach der Auswahl unten auf <b>Testen<\/b>, wird der Flow mit diesen Daten ausgef&uuml;hrt. Wir erhalten nun im Flow-Diagramm ausf&uuml;hrliche Informationen, welcher Schritt wie lange gedauert hat und welches Ergebnis diese geliefert haben. Au&szlig;erdem erfahren wir, welchen Pfad der Flow bei Verwendung von Bedingungen verwendet hat.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_031.png\" alt=\"Aufruf eines Tests\" width=\"424,643\" height=\"442,781\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 30: Aufruf eines Tests<\/span><\/b><\/p>\n<p>Zur Veranschaulichung haben wir in Bild 31 einmal den oberen Teil des Testergebnisses abgebildet.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2024_03\/pic_432_032.png\" alt=\"Ergebnis eines Tests\" width=\"674,643\" height=\"452,1127\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 31: Ergebnis eines Tests<\/span><\/b><\/p>\n<h2>Komplette Steuerung von Rest-APIs m&ouml;glich<\/h2>\n<p>Mit den hier vorgestellten Techniken k&ouml;nnen wir alle Aktionen, die in Flows m&ouml;glich sind, in einen Rest-API-Aufruf integrieren und die Antworten entsprechend aufbereiten. Und es gibt einige M&ouml;glichkeiten.<\/p>\n<p>Hier haben wir nur ein Beispiel geliefert daf&uuml;r, wie man mit VBA &uuml;ber eine Rest-API einen Flow starten kann. Es gibt jedoch noch viele andere M&ouml;glichkeiten, die deutlich werden, wenn wie einmal einen neuen Flow erstellen und uns die Vorlagen anschauen.<\/p>\n<p>Wir k&ouml;nnen vieles rund um die verschiedenen Connectoren erledigen &#8211; Office 365 Outlook, SharePoint, OneDrive for Business, Microsoft Forms, Microsoft Teams, Outlook.com und viele mehr.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit den hier vorgestellten Techniken kannst Du Deine To Do-Aufgaben vollst&auml;ndig von einer VBA-Anwendung aus steuern.<\/p>\n<p>Du kannst neue Listen anlegen, neue Aufgaben hinzuf&uuml;gen und Aufgaben l&ouml;schen.<\/p>\n<p>Aber es geht noch weiter, denn Du hast einige Grundlagen zur Programmierung von Power Automation gelernt. Damit kannst Du viele der Dienste im Microsoft-Universum steuern. In weiteren Artikeln werden wir sicher auf dieses Thema zur&uuml;ckkommen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ToDoAufgabeMitPowerAutomateUndVBAAnlegen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/12AB51BC-3525-40BA-B54C-202B7C46B83D\/vbe_432.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einem weiteren Artikel namens &#8220;To Do-Aufgabe mit Power Automate und VBA anlegen&#8221; (www.vbentwickler.de\/431) haben wir die Grundlagen zur Steuerung von Microsoft To Do mit VBA &uuml;ber Power Automate beschrieben und einen ersten Anwendungsfall vorgestellt &#8211; das Anlegen einer Aufgabe f&uuml;r eine vorgegebene Liste. In diesem Artikel haben wir die wichtigsten Vorbereitungen getroffen, n&auml;mlich das Anlegen eines Power Automate Kontos und das Freigeben des Zugriffs auf das To Do-Konto, dessen Listen und Aufgaben wir verwalten wollen. Dabei schauen wir uns in diesem Artikel an, wie wir die Aufrufe noch genauer gestalten k&ouml;nnen, um beispielsweise die Liste einzustellen, der wir eine neue Aufgabe hinzuf&uuml;gen. Au&szlig;erdem schauen wir uns an, wie wir Aufgaben auslesen, bearbeiten oder l&ouml;schen k&ouml;nnen und wie wir Listen auslesen, anlegen, bearbeiten oder l&ouml;schen k&ouml;nnen. Es gibt viel zu tun!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662024,66032024,44000012,44000023],"tags":[],"yst_prominent_words":[],"class_list":["post-55000432","post","type-post","status-publish","format-standard","hentry","category-662024","category-66032024","category-Interaktiv","category-PowerApps"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000432","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000432"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000432\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000432"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000432"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}