{"id":55000459,"date":"2025-02-01T00:00:00","date_gmt":"2025-04-23T16:05:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=459"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Automationen_mit_Zapier_per_VBA_starten","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Automationen_mit_Zapier_per_VBA_starten\/","title":{"rendered":"Automationen mit Zapier per VBA starten"},"content":{"rendered":"<p><b>Zapier ist ein Tool, mit dem wir SaaS-Anwendungen f&uuml;r verschiedene Bereiche automatisieren k&ouml;nnen. Das geschieht nach dem Prinzip, dass eine solche Anwendung eine Automation triggert und dadurch Aktionen mit der gleichen oder auch mit anderen Anwendungen angesto&szlig;en werden. Wie zum Beispiel das Eintragen einer Aufgabe in eine Aufgabenliste, wenn eine neue E-Mail eingegangen ist. Wie haben in weiteren Artikel bereits gezeigt, wie wir solche Automationen mit Tools wie Zapier realisieren k&ouml;nnen. Aber welchen Bezug gibt es zum eigentlichen Thema dieses Magazins, n&auml;mlich dem Programmieren mit Sprachen wie VBA, VB6, twinBASIC et cetera &#8211; abgesehen davon, dass wir diese Automationen als Selbstst&auml;nderiger, Freiberufler, aber auch als Angestellter f&uuml;r unser Unternehmen gewinnbringend einsetzen k&ouml;nnen? Genau: Wie k&ouml;nnen diese Automationen nat&uuml;rlich auch per Code triggern. Wie das im Falle von Zapier funktioniert, erkl&auml;ren wir im vorliegenden Artikel.<\/b><\/p>\n<p>Wenn Du Dich bereits mit Zapier zur Automation von SaaS-Anwendungen besch&auml;ftigt hast, kannst Du direkt in diesen Artikel einsteigen. Falls nicht, empfehlen wir zuvor die Lekt&uuml;re der folgenden Artikel:<\/p>\n<ul>\n<li><b>Automation mit Zapier, Make und Co. <\/b>(<b>www.vbentwickler.de\/448<\/b>)<\/li>\n<li><b>Automation mit Zapier in der Praxis <\/b>(<b>www.vbentwickler.de\/4<\/b>)<\/li>\n<\/ul>\n<p>Hier findest Du einige Grundlagen allgemein zum Thema Automatisierung und ein erstes Beispiel f&uuml;r eine Automation auf Basis von Microsoft Outlook und Microsoft To Do.<\/p>\n<h2>Automation per VBA nutzen<\/h2>\n<p>Wie Du in den obigen Artikeln erf&auml;hrst, gibt es verschiedene M&ouml;glichkeiten, wie Du Automationen mit den verschiedenen Tools von VBA aus starten kannst. F&uuml;r das Tool Zapier sind die M&ouml;glichkeiten ein klein wenig eingeschr&auml;nkter, denn wir k&ouml;nnen damit keine Ergebnisse &uuml;ber die Erfolgsmeldung hinaus als R&uuml;ckgabewert erhalten. Bei dem anderen Tool Make.com sieht dies anders aus &#8211; hier k&ouml;nnen wir explizit festlegen, welche Informationen nach dem Durchlaufen einer Automation an den aufrufenden VBA-Code zur&uuml;ckgeliefert werden sollen. Dies schauen wir uns in weiteren Artikeln an.<\/p>\n<p>Daf&uuml;r liefert Zapier wieder mehr M&ouml;glichkeiten bei der Zusammenarbeit mit dem SQL Server und anderen Datenbanksystemen, denn hier k&ouml;nnen wir mit dem sogenannten Polling auch auf &Auml;nderungen im Datenbestand reagieren.<\/p>\n<h2>VBA und Software wie Access, Excel, Outlook und Co. als Trigger f&uuml;r Zapier<\/h2>\n<p>Wie in den oben angegebenen Artikeln beschrieben, haben Automationen einen Trigger und anschlie&szlig;end auszuf&uuml;hrende Aktionen. Au&szlig;erdem hat jedes namhafte SaaS-Tool Schnittstellen, die man von Zapier aus nutzen kann.<\/p>\n<p>Wenn wir einen neuen Zap anlegen, finden wir hier die beiden mindestens notwendigen Elemente <b>Trigger <\/b>und <b>Action <\/b>(siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_002.png\" alt=\"Diesen Trigger wollen wir per VBA ansteuern.\" width=\"424,6267\" height=\"306,7788\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Diesen Trigger wollen wir per VBA ansteuern.<\/span><\/b><\/p>\n<p>Klicken wir hier auf Trigger, erscheint der Dialog zur Auswahl der verf&uuml;gbaren Trigger (siehe Bild 2). Hier k&ouml;nnen wir in der Suchleiste <b>Visual Basic<\/b>, <b>Microsoft Access <\/b>oder andere Office-Anwendungen eingeben &#8211; wir finden keinen passenden Trigger, der uns weiterhilft. Es gibt zwar welche f&uuml;r Outlook, Excel oder Word, aber dies betrifft die Online-Anwendungen, nicht die gleichnamigen Desktop-Programme.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_001.png\" alt=\"Einen Trigger f&uuml;r VBA oder eine der Office-Anwendungen finden wir nicht. Daf&uuml;r aber einen f&uuml;r Webhooks.\" width=\"424,6267\" height=\"353,7198\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einen Trigger f&uuml;r VBA oder eine der Office-Anwendungen finden wir nicht. Daf&uuml;r aber einen f&uuml;r Webhooks.<\/span><\/b><\/p>\n<h2>Die L&ouml;sung: Webhooks<\/h2>\n<p>Wir sehen hier jedoch einen Eintrag namens Webhooks. Das ist unser Weg zum Triggern von Zapier-Automationen per Visual Basic.<\/p>\n<p>Webhooks sind nichts anderes als URLs, die von Zapier zur Verf&uuml;gung gestellt werden und die wir von beliebigen anderen Anwendungen aus aufrufen k&ouml;nnen.<\/p>\n<p>Diese k&ouml;nnen wir mit Visual Basic genauso aufrufen, wie wir es bereits mit verschiedenen Rest-APIs gemacht haben. Dazu sind grunds&auml;tzlich erst einmal nur wenige Zeilen Code notwendig.<\/p>\n<p>Bevor wir uns dem Code zuwenden, f&uuml;hren wir aber erst einmal die notwendigen Arbeiten mit Zapier durch. Nach einem Klick auf den Eintrag <b>Webhooks<\/b> finden wir drei verschiedene Trigger vor (siehe Bild 3). Diese k&ouml;nnen wir wie folgt verwenden:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_003.png\" alt=\"Verschiedene Webhooks\" width=\"649,627\" height=\"415,651\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Verschiedene Webhooks<\/span><\/b><\/p>\n<ul>\n<li><b>Catch Hook<\/b>: Hier erhalten wir eine URL von Zapier, die wir von au&szlig;en aufrufen und so einen Trigger ausl&ouml;sen k&ouml;nnen. Mitgelieferte Daten beispielsweise im JSON-Format werden automatisch geparst und die enthaltenen Daten k&ouml;nnen in weiteren Schritten direkt verwendet werden.<\/li>\n<li><b>Catch Raw Hook<\/b>: Hier erhalten wir ebenfalls eine Zapier-URL. Der Unterschied ist, dass mitgelieferte Daten nicht direkt von Zapier verarbeitet werden. Damit k&ouml;nnen wir beispielsweise vollst&auml;ndige Dateien an Zapier schicken.<\/li>\n<li><b>Retrieve Poll<\/b>: Hier geben wir einen externen Webhook an, also eine URL einer weiteren Anwendung, die regelm&auml;&szlig;ig abgerufen werden soll.<\/li>\n<\/ul>\n<h2>Webhook mit Catch Hook verwenden<\/h2>\n<p>Wir schauen uns zun&auml;chst die Variante mit <b>Catch Hook <\/b>an. Damit k&ouml;nnen wir zum n&auml;chsten Schritt namens Configure weitergehen. Hier sehen wir die Option <b>Pick off a Child Key<\/b>.<\/p>\n<p>Damit k&ouml;nnen wir festlegen, dass nur bestimmte Elemente eines eventuell &uuml;bergebenen JSON-Dokuments weiterverarbeitet werden sollen. Aktuell wollen wir dies nicht nutzen und klicken direkt auf <b>Continue<\/b>.<\/p>\n<p>Damit gelangen wir zum Bereich <b>Test<\/b>, wo wir die URL vorfinden, die wir zum Ausl&ouml;sen des Triggers nutzen k&ouml;nnen (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_004.png\" alt=\"Die fertige Webhook-URL\" width=\"424,6267\" height=\"509,3455\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die fertige Webhook-URL<\/span><\/b><\/p>\n<p>Klicken wir nun auf <b>Test trigger<\/b>, erhalten wir als Antwort <b>No request found<\/b>. Das ist logisch, denn diese URL wurde speziell f&uuml;r uns definiert und wir haben sie noch nicht aufgerufen. Das k&ouml;nnen wir nun erst einmal &uuml;ber den Webbrowser erledigen. Dazu kopieren wir die URL in die Zwischenablage und f&uuml;gen sie in die URL-Leiste des Browsers ein.<\/p>\n<p>Die Antwort sehen wir in Bild 5. Wichtig ist das unterste Name-Wert-Paar namens <b>status<\/b>, das den Wert <b>success <\/b>liefert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_005.png\" alt=\"Aufruf mit der Antwort von Zapier\" width=\"499,6267\" height=\"201,7393\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Aufruf mit der Antwort von Zapier<\/span><\/b><\/p>\n<p>Wechseln wir nun zur&uuml;ck nach Zapier, k&ouml;nnen wir erneut testen und erhalten auch hier einen Eintrag namens <b>request A<\/b>.<\/p>\n<h2>Daten an Zapier &uuml;bergeben<\/h2>\n<p>Auch wenn wir einfach nur eine Automation starten k&ouml;nnen, indem wir die URL des Webhooks aufrufen, wollen wir vermutlich in den meisten F&auml;llen Daten &uuml;bergeben, die in den folgenden Aktionen weiterverarbeitet werden sollen.<\/p>\n<p>Dazu haben wir zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>wir h&auml;ngen die Informationen als URL-Parameter an die URL an oder<\/li>\n<li>wir f&uuml;gen dem Aufruf eine JSON-Datei mit den ben&ouml;tigten Informationen hinzu.<\/li>\n<\/ul>\n<p>Unabh&auml;ngig davon, welche Variante wir nutzen, ist es wichtig, dass wir die Informationen immer in der gleichen Form &uuml;bergeben und dass wir diese auch beim Einrichten der Automation so angeben.<\/p>\n<p>Wir k&ouml;nnen in den folgenden Aktionen nur auf Daten zugreifen, die in einem der vorherigen Testaufrufe auch &uuml;bergeben wurden. Wir schauen uns das an einem Beispiel an und &uuml;bergeben einige Parameter, den wir an die URL anh&auml;ngen &#8211; hier <b>email<\/b>, <b>subject <\/b>und <b>body<\/b>. Die URL sieht nun wie folgt aus:<\/p>\n<pre>https:\/\/hooks.zapier.com\/hooks\/catch\/21909841\/2qbfvbz\/?email=andre@minhorst.com&subject=Test&body=Dies%20ist%20ein%20Test<\/pre>\n<p>Nun k&ouml;nnen wir in Zapier auf <b>Find new records <\/b>klicken und sehen den neuen Eintrag. Klicken wir diesen an, erscheint ein Bereich, der alle mit diesem Aufruf gelieferten Informationen anzeigt (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_006.png\" alt=\"Ein Aufruf mit einem Parameter\" width=\"549,6265\" height=\"481,8199\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Ein Aufruf mit einem Parameter<\/span><\/b><\/p>\n<p>Dies k&ouml;nnen wir nun als Basis f&uuml;r eine weitere Aktion nutzen. Dazu klicken wir auf <b>Continue with selected record <\/b>und landen in der Auswahl der App, die wir f&uuml;r den n&auml;chsten Schritt nutzen wollen.<\/p>\n<h2>E-Mail per Outlook versenden<\/h2>\n<p>Wie den Parametern unschwer zu entnehmen ist, wollen wir als Aktion eine E-Mail versenden.<\/p>\n<p>Dazu w&auml;hlen wir im n&auml;chsten Schritt, wo es um die App f&uuml;r die folgende Aktion geht, Microsoft Outlook aus (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_007.png\" alt=\"Auswahl von Microsoft Outlook f&uuml;r die Aktion\" width=\"424,6267\" height=\"325,0461\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Auswahl von Microsoft Outlook f&uuml;r die Aktion<\/span><\/b><\/p>\n<p>Nun w&auml;hlen wir unter <b>Action event <\/b>den Eintrag <b>Send Email <\/b>aus (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_008.png\" alt=\"Anlegen der Aktion zum Senden einer E-Mail\" width=\"599,6265\" height=\"367,4888\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Anlegen der Aktion zum Senden einer E-Mail<\/span><\/b><\/p>\n<p>Unter Account w&auml;hlen wir nun den Outlook-Account aus, mit dem wir die E-Mails versenden wollen. Wenn Du bereits das Beispiel aus dem Artikel <b>Automation mit Zapier in der Praxis <\/b>(<b>www.vbentwickler.de\/4<\/b>) ausprobiert hast, findest Du hier bereits einen Account vor.<\/p>\n<p>Anschlie&szlig;end weisen wir der Aktion <b>Send Email <\/b>die Parameter zu, die wir der URL hinzugef&uuml;gt haben (siehe Bild 9):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_009.png\" alt=\"Hinzuf&uuml;gen der Parameter aus dem Trigger\" width=\"599,6265\" height=\"525,6515\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Hinzuf&uuml;gen der Parameter aus dem Trigger<\/span><\/b><\/p>\n<ul>\n<li>F&uuml;r <b>From Email <\/b>legen wir den Absender als Zeichenkette an.<\/li>\n<li>Unter <b>To Email(s) <\/b>w&auml;hlen wir <b>Querystring Email <\/b>aus.<\/li>\n<li>Entsprechende Platzhalter tragen wir f&uuml;r <b>Subject <\/b>und <b>Body <\/b>ein und stellen au&szlig;erdem die Eigenschaft <b>Body Format <\/b>auf <b>Text <\/b>ein.<\/li>\n<\/ul>\n<p>Mit einem Klick auf Continue landen wir wieder im Test-Bereich. Hier k&ouml;nnen wir nun mit einem Klick auf <b>Test Step <\/b>einen erneuten Test durchf&uuml;hren.<\/p>\n<p>Wenn wir alles korrekt konfiguriert haben, erscheint kurz danach bereits die versendete E-Mail in unserem Posteingang. Damit sind die ersten Voraussetzungen erf&uuml;llt, um das Ausl&ouml;sen des Triggers per VBA zu realisieren<\/p>\n<h2>Programmieren des Zapier-Zugriffs mit VBA<\/h2>\n<p>Wer bereits einmal die Ansteuerung einer Rest-API programmiert hat, wei&szlig;, dass es je nach Authentifizierungsmethode manchmal je nach API etwas komplizierter sein kann, die Anmeldung an der Rest-API zu programmieren.<\/p>\n<p>Da ist es sehr erfreulich, dass dies hier nicht der Fall ist. Es gibt weder eine API-Key noch eine andere Authentifierungsmethode. Wir k&ouml;nnen den Request einfach an Zapier schicken.<\/p>\n<p>Das ist auch logisch: Immerhin konnten wir das auch einfach &uuml;ber das Browser-Fenster durch Eingabe der URL erledigen.<\/p>\n<p>Eine gewisse Sicherheit ist auch bereits dadurch gegeben, dass Zapier eine URL zusammenstellt, die nicht einfach zu erratende Elemente enth&auml;lt.<\/p>\n<p>Wenn wir diese URL nur von unserer Access-Anwendung aus aufrufen, besteht auch kaum Gefahr, dass jemand Kenntnis dieser URL erh&auml;lt.<\/p>\n<p>Wenn wir dennoch die Sicherheit erh&ouml;hen m&ouml;chten, k&ouml;nnen wir noch einen Parameter hinzuf&uuml;gen, mit dem wir einen selbst vergebenen Schl&uuml;ssel &uuml;bergeben. Diesen k&ouml;nnen wir in der Automation pr&uuml;fen und diese nur dann durchf&uuml;hren, wenn der Schl&uuml;ssel korrekt ist.<\/p>\n<p>Zun&auml;chst einmal wollen wir jedoch ohne diese zus&auml;tzliche Sicherheitsma&szlig;nahme arbeiten.<\/p>\n<h2>Vorbereitungen<\/h2>\n<p>Dazu erstellen wir eine neue, leere Access-Datenbank und &ouml;ffnen den VBA-Editor, dem wir zun&auml;chst zwei Module zum Verarbeiten von JSON-Dokumenten hinzuf&uuml;gen. Diese hei&szlig;en <b>mdlJSON <\/b>und <b>mdlJSONDOM <\/b>und wir finden diese in der Beispieldatenbank.<\/p>\n<p>F&uuml;r die in diesen Modulen verwendeten Dictionaries und die f&uuml;r den Zugriff auf Zapier verwendete Klasse <b>ServerXMLHTTP60 <\/b>ben&ouml;tigen wir zwei Verweise, die wir wie in Bild 10 &uuml;ber den <b>Verweise<\/b>-Dialog zum VBA-Projekt hinzuf&uuml;gen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_010.png\" alt=\"Hinzuf&uuml;gen von Verweisen\" width=\"499,6267\" height=\"393,8742\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Hinzuf&uuml;gen von Verweisen<\/span><\/b><\/p>\n<h2>Funktion zum Ausf&uuml;hren der Anfrage an Zapier<\/h2>\n<p>Die Funktion zum Ausf&uuml;hren der Anfrage hei&szlig;t <b>HTTPRequest <\/b>und erwartet die folgenden Parameter (siehe Listing 1):<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>HTTPRequest(strURL<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strMethod<span style=\"color:blue;\"> As String<\/span> = \"POST\", _\r\n         <span style=\"color:blue;\">Optional<\/span> strContentType<span style=\"color:blue;\"> As String<\/span> = \"application\/json\", <span style=\"color:blue;\">Optional<\/span> strData<span style=\"color:blue;\"> As String<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strResponse<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objHTTP<span style=\"color:blue;\"> As <\/span>ServerXMLHTTP60\r\n     <span style=\"color:blue;\">Set<\/span> objHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.ServerXMLHTTP60\r\n     <span style=\"color:blue;\">With<\/span> objHTTP\r\n         .Open strMethod, strURL, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"application\/json\"\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strData) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             .setRequestHeader \"Body\", strData\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         .send strData\r\n         strResponse = .responseText\r\n         HTTPRequest = .status\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die Funktion zum Ausf&uuml;hren von Anfragen an Zapier<\/span><\/b><\/p>\n<ul>\n<li><b>strURL<\/b>: URL der Anfrage, die wir bei Zapier im Element <b>Webhook <\/b>auslesen k&ouml;nnen<\/li>\n<li><b>strMethod <\/b>(optional, Standardwert <b>POST<\/b>): Methode des Aufrufs, hier immer <b>POST<\/b>.<\/li>\n<li><b>strContentType <\/b>(optional, Standardwert <b>application\/json<\/b>): Inhaltsart. Normalerweise &uuml;bergeben wir JSON-Dokumente als Inhalt.<\/li>\n<li><b>strData <\/b>(optional, standardm&auml;&szlig;ig leer): F&uuml;r die &Uuml;bergabe beispielsweise von JSON-Dokumenten oder anderen Anfragen<\/li>\n<li><b>strResponse <\/b>(optional, standardm&auml;&szlig;ig leer): R&uuml;ckgabevariable, die mit der Antwort des Aufrufs gef&uuml;llt wird<\/li>\n<\/ul>\n<p>In der Prozedur deklarieren wir ein <b>ServerXMLHTTP60<\/b>-Objekt, das wir zum Versenden nutzen. Darauf basierend erstellen wir ein neues Objekt, das wir mit der Variablen <b>objHTTP <\/b>referenzieren. F&uuml;r dieses rufen wir die <b>Open<\/b>-Methode auf und &uuml;bergeben die Methode, die URL und f&uuml;r den dritten Parameter <b>varAsync <\/b>den Wert <b>False<\/b>. Dadurch wird die Methode synchron aufgerufen und der aufrufende Code zwischenzeitlich angehalten.<\/p>\n<p>Danach stellen wir mit <b>setRequestHeader <\/b>den Inhaltstyp auf den Wert des Parameters <b>strContentType <\/b>ein, der normalerweise den Wert <b>application\/json <\/b>enth&auml;lt.<\/p>\n<p>Wenn <b>strData <\/b>einen Wert enth&auml;lt, beispielsweise ein JSON-Dokument, wird dieses f&uuml;r den Request-Header <b>Body <\/b>hinterlegt.<\/p>\n<p>Schlie&szlig;lich rufen wir die <b>send<\/b>-Methode mit dem Inhalt von <b>strData <\/b>auf und lesen den R&uuml;ckgabewert aus der Eigenschaft <b>ResponseText <\/b>in die Variable <b>strResponse <\/b>ein.<\/p>\n<p>Au&szlig;erdem geben wir den Status der Anfrage als Funktionsergebnis zur&uuml;ck.<\/p>\n<h2>Aufruf der Funktion HTTPRequest zum Versenden einer einfachen E-Mail<\/h2>\n<p>Damit kommen wir zum Aufruf dieser Funktion. Diesen erledigen wir mit der Prozedur aus Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_EMailParameter()\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intStatus<span style=\"color:blue;\"> As Integer<\/span>\r\n     strURL = \"https:\/\/hooks.zapier.com\/hooks\/catch\/21909841\/2qbfvbz\/\"\r\n     strURL = strURL & \"?email=andre@minhorst.com\"\r\n     strURL = strURL & \"&subject=Test\"\r\n     strURL = strURL & \"&body=Dies%20ist%20ein%20Test%201\"\r\n     intStatus = HTTPRequest(strURL, \"POST\", , , strResponse)\r\n     Select Case intStatus\r\n     <span style=\"color:blue;\">Case <\/span>200\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Success: \" & strResponse\r\n     <span style=\"color:blue;\">Case Else<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> intStatus, strResponse\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Aufruf der Funktion zum Versenden einer E-Mail<\/span><\/b><\/p>\n<p>Diese stellt in der Variablen <b>strURL <\/b>die URL zusammen und deklariert au&szlig;erdem noch leere Variablen namens <b>strResponse<\/b> und <b>intStatus<\/b>.<\/p>\n<p>Die URL und die leere Variable &uuml;bergibt sie dem Aufruf der Funktion <b>HTTPRequest <\/b>und wertet anschlie&szlig;end den Wert des R&uuml;ckgabewertes aus, der in der Variablen <b>intStatus <\/b>gelandet ist.<\/p>\n<p>Im Falle des Wertes <b>200 <\/b>wird eine Erfolgsmeldung mit <b>strResponse <\/b>in den Direktbereich geschrieben, anderenfalls der Status samt Antwort aus <b>strResponse<\/b>.<\/p>\n<p>Im Erfolgsfall sieht die Antwort beispielsweise wie folgt aus:<\/p>\n<pre>{\"attempt\":\"01955cb0-4c9a-044a-f855-035eb968fd65\",\"id\":\"01955cb0-4c9a-044a-f855-035eb968fd65\",\"request_id\":\"01955cb0-4c9a-044a-f855-035eb968fd65\",\"status\":\"success\"}<\/pre>\n<p>Mehr ist nicht n&ouml;tig, um einen einfachen Aufruf zu starten, bei dem wir alle Parameter in die URL integrieren.<\/p>\n<h2>Aufruf mit Eigenschaften im JSON-Dokument programmieren<\/h2>\n<p>Allerdings kann es auch passieren, dass der Aufruf wesentlich umfangreichere Daten enthalten soll, die wir nicht problemlos in die URL integrieren k&ouml;nnen.<\/p>\n<p>In diesem Fall ben&ouml;tigen wir ein entsprechendes JSON-Dokument. Dieses k&ouml;nnten wir einfach wie folgt zusammenstellen und in der Variablen <b>strJSON <\/b>speichern:<\/p>\n<pre>{\"email\":\"andre@minhorst.com\",\"subject\":\"Beispielbetreff\",\"body\":\"Dies ist ein Beispielinhalt einer E-Mail\"}<\/pre>\n<p>Allerdings wollen wir direkt unsere bew&auml;hrte Methode verwenden, die wir im Artikel <b>JSON-Dokumente per Objektmodell zusammenstellen <\/b>(<b>www.vbentwickler.de\/412<\/b>) vorstellen.<\/p>\n<p>Der Aufbau der Prozedur <b>Test_EMailJSON <\/b>aus Listing 3 entspricht weitgehend der aus dem vorherigen Beispiel. Allerdings verwenden wir zwei Variablen namens <b>objJSON <\/b>und <b>strJSON<\/b>. In der ersten Variablen <b>objJSON<\/b>, das wir hier als <b>Dictionary <\/b>deklariert haben, stellen wir das JSON-Dokument zusammen. Dazu f&uuml;gen wir in diesem einfachen Fall einfach alle ben&ouml;tigten Name-Wert-Paare in der folgenden Form hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_EMailJSON()\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intStatus<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objJSON<span style=\"color:blue;\"> As <\/span>Dictionary\r\n     <span style=\"color:blue;\">Dim <\/span>strJSON<span style=\"color:blue;\"> As String<\/span>\r\n     strURL = \"https:\/\/hooks.zapier.com\/hooks\/catch\/21909841\/2qbfvbz\/\"\r\n     <span style=\"color:blue;\">Set<\/span> objJSON = <span style=\"color:blue;\">New<\/span> Dictionary\r\n     objJSON.Add \"email\", \"andre@minhorst.com\"\r\n     objJSON.Add \"subject\", \"Beispielbetreff\"\r\n     objJSON.Add \"body\", \"Dies ist ein Beispielinhalt einer E-Mail\"\r\n     strJSON = ConvertToJson(objJSON)\r\n     intStatus = HTTPRequest(strURL, \"POST\", , strJSON, strResponse)\r\n     Select Case intStatus\r\n     <span style=\"color:blue;\">Case <\/span>200\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Success: \" & strResponse\r\n     <span style=\"color:blue;\">Case Else<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> intStatus, strResponse\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Aufruf der Funktion zum Versenden einer E-Mail mit einem JSON-Dokument<\/span><\/b><\/p>\n<pre>objJSON.Add \"email\", \"andre@minhorst.com\"<\/pre>\n<p>Danach ermitteln wir aus <b>objJSON <\/b>mit der Funktion <b>ConvertToJson <\/b>das JSON-Dokument als Zeichenkette und schreiben diese in die Variable <b>strJSON<\/b>. Diese &uuml;bergeben wir beim Aufruf der Funktion <b>HTTPRequest <\/b>mit dem Parameter <b>strData<\/b>.<\/p>\n<p>Wenn wir die Prozedur nun aufrufen, erhalten wir zwar eine Erfolgsmeldung. Das bedeutet aber lediglich, dass der Trigger erfolgreich aufgerufen wurde.<\/p>\n<p>Es kommt aber niemals eine E-Mail an, also schauen wir uns an, ob wir bei Zapier einen Hinweis auf einen Fehler finden k&ouml;nnen.<\/p>\n<h2>Automation analysieren<\/h2>\n<p>Dazu schauen wir uns bei Zapier den entsprechenden Zap an und zeigen den Bereich an, der uns alle Aufrufe liefert (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_011.png\" alt=\"Die Automation konnte nicht erfolgreich durchgef&uuml;hrt werden.\" width=\"700\" height=\"426,4634\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Die Automation konnte nicht erfolgreich durchgef&uuml;hrt werden.<\/span><\/b><\/p>\n<p>Hier sehen wir bereits, dass die letzten Versuche, die wir mit der neuen Version mit JSON-Dokument durchgef&uuml;hrt haben, gestoppt wurden.<\/p>\n<p>Klicken wir beispielsweise den aktuellsten Eintrag an, sehen wir auch, welcher Schritt nicht ausgef&uuml;hrt wurde.<\/p>\n<p>Es handelt sich um den zum Versenden der E-Mail.  Hier sehen wir auch direkt den Grund: Offenbar konnten die Eigenschaften <b>To Email(s)<\/b>, <b>Subject <\/b>und <b>Body <\/b>nicht gef&uuml;llt werden. Aber warum nicht?<\/p>\n<p>Dazu schauen wir uns die beiden Bereiche <b>Data out <\/b>des Trigger-Elements der Automation sowohl f&uuml;r einen der Aufrufe an, bei dem wir die Daten per URL gesendet haben, als auch f&uuml;r einen der neueren Aufrufe, wo wir dazu das JSON-Dokument genutzt haben.<\/p>\n<p>Im ersten Fall sehen wir alle dort angegebenen Informatonen unterhalb des Elements <b>querystring<\/b> und mit vorangestelltem <b>Querystring <\/b>(siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_012.png\" alt=\"Aufruf mit Querystring \" width=\"424,6267\" height=\"333,7916\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Aufruf mit Querystring <\/span><\/b><\/p>\n<p>Im zweiten Fall finden wir auch das <b>querystring<\/b>-Element, aber die &uuml;bergebenen Daten werden alle separat davon angezeigt (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_013.png\" alt=\"Aufruf mit JSON\" width=\"424,6267\" height=\"356,2452\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Aufruf mit JSON<\/span><\/b><\/p>\n<p>Offensichtlich werden die Elemente, seit wir sie als Teil eines JSON-Dokuments geschickt haben, nicht mehr verarbeitet.<\/p>\n<p>Wir m&uuml;ssen die Informationen aus dem JSON-Dokument also anders zuordnen.<\/p>\n<h2>Neue Automation f&uuml;r JSON erstellen<\/h2>\n<p>Da wir die alte Automation beibehalten wollen, um auch Automationen per URL mit Parametern aufrufen zu k&ouml;nnen, erstellen wir eine neue Automation auf Basis der ersten. <\/p>\n<h2>Automation duplizieren<\/h2>\n<p>Dazu gehen wir zur&uuml;ck zur &Uuml;bersicht der Automationen und klicken die zu duplizierende Automation an. Klicken wir auf die Schaltfl&auml;che den drei vertikal angeordneten Punkten, finden wir den Befehl zum Duplizieren vor (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_014.png\" alt=\"Duplizieren einer Automation\" width=\"700\" height=\"262,2112\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Duplizieren einer Automation<\/span><\/b><\/p>\n<p>In der nun erscheinenden Meldung klicken wir auf <b>Duplicate and edit<\/b>. Alles sieht zun&auml;chst aus wie beim Original. Aber nat&uuml;rlich hat Zapier eine neue Webhook-URL angelegt. Diese kopieren wir und f&uuml;gen diese in unsere Prozedur f&uuml;r den Aufruf der Automation mit &Uuml;bergabe der Daten im JSON-Format ein.<\/p>\n<p>Diese rufen wir nun auf, damit wir Beispieldaten zum Zuweisen der Eigenschaften zu der zu verwendenden E-Mail haben.<\/p>\n<p>Unter <b>Catch Hook <\/b>finden wir nun im Bereich <b>Test <\/b>bereits den neuen Request (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_016.png\" alt=\"Es wurden neue Daten gefunden.\" width=\"424,6267\" height=\"760,3781\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Es wurden neue Daten gefunden.<\/span><\/b><\/p>\n<p>Den neuesten Datensatz w&auml;hlen wir nun aus und klicken auf <b>Continue with selected record<\/b>.<\/p>\n<p>Damit gelangen wir zum Schritt <b>Send Email<\/b>. Wechseln wir hier zum Bereich <b>Configure<\/b>, sehen wir bereits dass die zuvor verwendeten Elemente wie <b>Querystring Email <\/b>mit einem Ausrufezeichen versehen sind (siehe Bild 16). Das deutet daraufhin, dass diese in dem neuen gelieferten Datensatz nicht mehr verf&uuml;gbar sind.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_459_015.png\" alt=\"Einf&uuml;gen der neuen Eigenschaften aus dem JSON-Dokument\" width=\"649,627\" height=\"556,823\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Einf&uuml;gen der neuen Eigenschaften aus dem JSON-Dokument<\/span><\/b><\/p>\n<p>Also l&ouml;schen wir die vorhandenen Elemente und ersetzen sie durch die Elemente, die wir im linken Bereich vorfinden.<\/p>\n<p>Bereits der erste Testdurchlauf zeigt, dass es nun auch mit den Daten aus dem JSON-Dokument funktioniert. Wir m&uuml;ssen also darauf achten, dass wir die Daten immer im gleichen Format liefern.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In diesem Artikel haben wir gezeigt, wie wir erstens eine Automation vorbereiten, die wir &uuml;ber das Aufrufen eines Links von au&szlig;en initiieren k&ouml;nnen. Danach haben wir den Aufruf dieses Links zun&auml;chst &uuml;ber einen Webbrowser durchgef&uuml;hrt und festgestellt, dass dieser wie gew&uuml;nscht funktioniert.<\/p>\n<p>Damit konnten wir auch den Zugriff auf diese Automation per VBA &uuml;ber ein XMLHTTP-Objekt angehen.  Hier haben wir zwei Varianten vorgestellt. Die erste verwendet f&uuml;r die &Uuml;bergabe der Parameter ausschlie&szlig;lich die URL, der sie entsprechende Name-Wert-Paare zugeordnet hat. Im zweiten Fall haben wir die zu &uuml;bergebenden Informationen in einem JSON-Dokument zusammengestellt und dieses an den Aufruf des Webhooks angeh&auml;ngt.<\/p>\n<p>Damit k&ouml;nnen wir nun Zapier-Automationen relativ einfach per VBA von Access und von anderen Office-Anwendungen aus starten.<\/p>\n<p>Das einzige Problem ist, dass wir keine zuverl&auml;ssige R&uuml;ckmeldung &uuml;ber den Erfolg des Zugriffs erhalten. Hier bietet ein anderes Tool namens Make.com bessere M&ouml;glichkeiten.<\/p>\n<p>Wir k&ouml;nnen allerdings einen Workaround bauen, der wiederum Aufwand erfordert. Man k&ouml;nnte im letzten Schritt der Automation das Ergebnis beispielsweise in ein Google Spreadsheet oder in eine SQL Server-Datenbank eintragen, die man nach ein paar Sekunden abfragt und das Ergebnis auswertet. Dabei m&uuml;sste man eine eindeutige ID &uuml;bergeben, die dann ebenfalls abgelegt wird, damit man das Ergebnis f&uuml;r den richtigen Aufruf erh&auml;lt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zapier ist ein Tool, mit dem wir SaaS-Anwendungen f&uuml;r verschiedene Bereiche automatisieren k&ouml;nnen. Das geschieht nach dem Prinzip, dass eine solche Anwendung eine Automation triggert und dadurch Aktionen mit der gleichen oder auch mit anderen Anwendungen angesto&szlig;en werden. Wie zum Beispiel das Eintragen einer Aufgabe in eine Aufgabenliste, wenn eine neue E-Mail eingegangen ist. Wie haben in weiteren Artikel bereits gezeigt, wie wir solche Automationen mit Tools wie Zapier realisieren k&ouml;nnen. Aber welchen Bezug gibt es zum eigentlichen Thema dieses Magazins, n&auml;mlich dem Programmieren mit Sprachen wie VBA, VB6, twinBASIC et cetera &#8211; abgesehen davon, dass wir diese Automationen als Selbstst&auml;nderiger, Freiberufler, aber auch als Angestellter f&uuml;r unser Unternehmen gewinnbringend einsetzen k&ouml;nnen? Genau: Wie k&ouml;nnen diese Automationen nat&uuml;rlich auch per Code triggern. Wie das im Falle von Zapier funktioniert, erkl&auml;ren wir im vorliegenden Artikel.<\/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":[66012025,662025,44000012],"tags":[],"yst_prominent_words":[],"class_list":["post-55000459","post","type-post","status-publish","format-standard","hentry","category-66012025","category-662025","category-Interaktiv"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000459","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=55000459"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000459\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000459"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}