{"id":55000306,"date":"2022-04-01T00:00:00","date_gmt":"2023-03-02T17:06:36","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=306"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Outlook_Elemente_durchsuchen_mit_AdvancedSearch","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Outlook_Elemente_durchsuchen_mit_AdvancedSearch\/","title":{"rendered":"Outlook: Elemente durchsuchen mit AdvancedSearch"},"content":{"rendered":"<p><b>Die &#8220;AdvancedSearch&#8221;-Methode der Application-Klasse von Outlook erlaubt das Suchen von Elementen nach bestimmten Kriterien in dem vorgegebenen Ordner &#8211; gegebenenfalls sogar mit Unterordnern. An ihr h&auml;ngen zwei Ereignisse namens &#8220;AdvancedSearchComplete&#8221; und &#8220;AdvancedSearchStopped&#8221;, die je nach dem Ausgang der Suche ausgel&ouml;st werden. Dieser Artikel zeigt, wie wir eine Suche in Outlook-Elementen per VBA durchf&uuml;hren und wie wir die damit zusammenh&auml;ngenden Ereignisse verwenden m&uuml;ssen, damit die Suche wie gew&uuml;nscht funktioniert. Au&szlig;erdem erf&auml;hrst Du, wie Du Suchbegriff und Suchbereich definieren musst.<\/b><\/p>\n<p>Im Artikel <b>Outlook: Die Application-Klasse <\/b>(<b>www.vbentwickler.de<\/b>) haben wir die AdvancedSearch-<b>Methode <\/b>und die beiden Ereignisse <b>AdvancedSearchComplete <\/b>und <b>AdvancedSearchStopped <\/b>zusammen mit den anderen Elementen der <b>Application<\/b>-Klasse von Outlook vorgestellt. Im vorliegenden Artikel nun gehen wir ins Detail und zeigen, wie Du in Outlook mit diesen Techniken suchen kannst.<\/p>\n<h2>Asynchrone Suche<\/h2>\n<p>Als Erstes wollen wir uns dabei ansehen, warum die Suche neben der Methode <b>AdvancedSearch <\/b>&uuml;berhaupt ein weiteres Ereignis namens <b>AdvancedSearchComplete <\/b>ben&ouml;tigt.<\/p>\n<p>Der Grund ist einfach: Die Methode <b>AdvancedSearch <\/b>ist n&auml;mlich eine asynchrone Methode, das hei&szlig;t, sie wird, einmal aufgerufen, unabh&auml;ngig vom aufrufenden Code ausgef&uuml;hrt. Das hei&szlig;t, dass der aufrufende Code einfach weiterl&auml;uft. Das ist insofern ung&uuml;nstig, als dass wir nach dem Aufruf von <b>AdvancedSearch <\/b>nicht einfach abwarten k&ouml;nnen, bis die Suche abgeschlossen ist und dann das Suchergebnis auswerten k&ouml;nnen.<\/p>\n<p>Stattdessen haben wir zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir k&ouml;nnen beispielsweise eine Schleife definieren, die solange l&auml;uft, bis die Suche beendet ist. Wie finden wir das heraus? Wir verwenden in der Schleife ein Abbruchkriterium, das erst dann wahr wird, wenn die Suche fertig ist. Das wiederum erkennen wir, indem wir das Ereignis <b>AdvancedSearchComplete <\/b>implementieren und dort die als Abbruchkriterium verwendete und &ouml;ffentlich deklarierte Variable einstellen. Danach k&ouml;nnen wir die Schleife verlassen und das Suchergebnis auswerten.<\/li>\n<li>Die zweite Variante verschiebt die Auswertung des Suchergebnisses direkt in die Implementierung des Ereignisses AdvancedSearchComplete. Wir k&ouml;nnen auch hier auf das Suchergebnis zugreifen, das in diesem Fall &uuml;ber den Parameter der Ereignisprozedur geliefert wird.<\/li>\n<\/ul>\n<p>Wir schauen uns im Anschluss beide Varianten an.<\/p>\n<h2>Ausprobieren der Suchfunktion mit Endlosschleife<\/h2>\n<p>Die n&auml;chste Frage ist, wo wir die Suchfunktion ausf&uuml;hren wollen. In einer sp&auml;teren Stufe w&uuml;rden wir diese beispielsweise als Teil einer Anwendung wie einer reinen VB-Anwendung oder auch einer Datenbankanwendung verwenden.<\/p>\n<p>Oder wir rufen die Suchfunktion &uuml;ber einen benutzerdefinierten Ribboneintrag auf. Da das f&uuml;r die reine Vorstellung der <b>AdvancedSearch<\/b>-Methode etwas zu aufwendig ist, wollen wir diese zun&auml;chst gesondert betrachten, indem wir sie einfach aus einem Modul aus dem VBA-Editor von Outlook heraus aufrufen.<\/p>\n<p>Als Erstes ben&ouml;tigen wir eine <b>Boolean<\/b>-Variable zum Speichern der Information, ob die Suche bereits beendet ist. Diese deklarieren wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>bolSearchComplete<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Au&szlig;erdem k&ouml;nnen wir das Ereignis nicht einfach f&uuml;r die <b>Application<\/b>-Klasse implementieren, sondern wir m&uuml;ssen daf&uuml;r eine eigene Objektvariable des Typs <b>Outlook.Application <\/b>deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>WithEvents objApplication<span style=\"color:blue;\"> As <\/span>Outlook.Application<\/pre>\n<p>Damit k&ouml;nnen wir nun eine Suche wie in der Prozedur <b>SucheNachMailsMitBestimmtemBetreff<\/b> programmieren (siehe Listing 1). <\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>SucheNachMailsMitBestimmtemBetreff()\r\n     <span style=\"color:blue;\">Dim <\/span>objSearch<span style=\"color:blue;\"> As <\/span>Outlook.Search\r\n     <span style=\"color:blue;\">Dim <\/span>objResults<span style=\"color:blue;\"> As <\/span>Outlook.Results\r\n     <span style=\"color:blue;\">Dim <\/span>strScope<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/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> objApplication = Outlook.Application\r\n     bolSearchComplete = <span style=\"color:blue;\">False<\/span>\r\n     strFilter = \"urn:schemas:httpmail:subject = ''Test A''\"\r\n     strScope = \"Posteingang\"\r\n     <span style=\"color:blue;\">Set<\/span> objSearch = objApplication.AdvancedSearch(strScope, strFilter, False, \"Test\")\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> bolSearchComplete = <span style=\"color:blue;\">True<\/span>\r\n         DoEvents\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objResults = objSearch.Results\r\n     For i = 1 To objResults.count\r\n         <span style=\"color:blue;\">Debug.Print<\/span> objResults.Item(i).Subject\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Beispiel f&uuml;r den Aufruf von AdvancedSearch<\/span><\/b><\/p>\n<p>Die Prozedur deklariert einige wichtige Variablen:<\/p>\n<ul>\n<li><b>objSearch<\/b>: Variable f&uuml;r das <b>Search<\/b>-Objekt, mit dem wir die durch <b>AdvancedSearch <\/b>erstellte Suche referenzieren<\/li>\n<li><b>objResults<\/b>: Objektvariable des Typs <b>Results <\/b>zum Referenzieren des Suchergebnisses<\/li>\n<li><b>strScope<\/b>: <b>String<\/b>-Variable f&uuml;r die Angabe des zu durchsuchenden Bereichs, hier <b>Posteingang<\/b>.<\/li>\n<li><b>strFilter<\/b>: <b>String<\/b>-Variable f&uuml;r den Ausdruck mit dem Filterkriterium<\/li>\n<\/ul>\n<p>Die Prozedur referenziert zun&auml;chst das <b>Application<\/b>-Objekt der aktuellen Outlook-Instanz mit <b>objApplication<\/b>. Dann stellt es <b>bolSearchComplete <\/b>zun&auml;chst auf <b>False <\/b>ein, falls dieses durch eine vorherige Suche noch den Wert <b>True <\/b>enthielt.<\/p>\n<p>Dann schreibt es das Filterkriterium, dazu sp&auml;ter mehr, in die Variable <b>strFilter <\/b>und den zu durchsuchenden Bereich in <b>strScope<\/b>. Schlie&szlig;lich startet die Prozedur mit der Methode <b>AdvancedSearch <\/b>den Suchvorgang.<\/p>\n<p>Neben <b>strScope <\/b>und <b>strFilter <\/b>wird f&uuml;r den dritten Parameter <b>SearchSubFolders <\/b>noch der Wert <b>False <\/b>&uuml;bergeben, weil wir keine Unterordner durchsuchen wollen. Und f&uuml;r den vierten Parameter &uuml;bergeben wir einen Tag, anhand dessen wir sp&auml;ter in der Ereignisprozedur <b>AdvancedSearchComplete <\/b>herausfinden k&ouml;nnen, ob das Ereignis auch durch diese Suche ausgel&ouml;st wurde &#8211; in diesem Fall schlicht <b>Test<\/b>.<\/p>\n<p>Nun geschieht Folgendes: Die Suche wird gestartet und die Prozedur l&auml;uft direkt weiter, da der Aufruf der Suchfunktion wie oben beschrieben asynchron erfolgt. <\/p>\n<p>Damit die aufrufende Prozedur dennoch nach Abschluss der Suche das Suchergebnis untersuchen kann, startet dort nun eine <b>Do While<\/b>-Schleife, die solange wiederholt wird, bis die Variable <b>bolSearchComplete <\/b>den Wert <b>True <\/b>erh&auml;lt. Und das ist genau dann der Fall, wenn das Ereignis <b>AdvancedSearchComplete <\/b>ausgel&ouml;st wird und wir die folgende Ereignisprozedur daf&uuml;r implementiert haben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objApplication_AdvancedSearchComplete(_\r\n         ByVal SearchObject<span style=\"color:blue;\"> As <\/span>Search)\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"The AdvancedSearchComplete Event fired\"\r\n     <span style=\"color:blue;\">If <\/span>SearchObject.Tag = \"Test\"<span style=\"color:blue;\"> Then<\/span>\r\n         bolSearchComplete = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit wir sehen, wann das Ereignis ausgel&ouml;st wird, geben wir per <b>Debug.Print <\/b>eine Meldung im Direktbereich aus. Danach pr&uuml;fen wir, ob der Aufruf von <b>AdvancedSearch <\/b>mit dem Wert <b>Test <\/b>als vierten Parameter  das Ereignis ausgel&ouml;st hat. Ist das der Fall, stellt die Prozedur <b>bolSearchComplete <\/b>auf <b>True <\/b>ein.<\/p>\n<p>Danach kann die aufrufende Prozedur die <b>Do While<\/b>-Schleife verlassen und das Suchergebnis aus der Eigenschaft <b>Results <\/b>von <b>objSearch <\/b>mit der Variablen <b>objResults <\/b>referenzieren. Dieses durchlaufen wir in einer <b>For&#8230;Next<\/b>-Schleife &uuml;ber die Werte <b>1 <\/b>bis zu der mit <b>objResults.Count <\/b>ermittelten Anzahl der Suchergebnisse.<\/p>\n<p>F&uuml;r das jeweils mit <b>objResults.Item(i) <\/b>ermittelte Element der Liste mit den Suchergebnissen geben wir nun den Inhalt der Eigenschaft <b>Subject <\/b>im Direktbereich aus.<\/p>\n<h2>Suchfunktion mit Auswertung in AdvancedSearchComplete<\/h2>\n<p>Die zweite Variante soll, wie weiter oben vorgegeben, das Suchergebnis direkt in der durch das Ereignis AdvancedSearchComplete ausgel&ouml;sten Prozedur analysieren. Die ausl&ouml;sende Prozedur sieht viel schlanker aus und endet bereits mit dem Aufruf von <b>AdvancedSearch<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>SucheImPosteingangErgebnisImEreignis()\r\n     <span style=\"color:blue;\">Dim <\/span>objSearch<span style=\"color:blue;\"> As <\/span>Outlook.Search\r\n     <span style=\"color:blue;\">Dim <\/span>strScope<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objApplication = Outlook.Application\r\n     strFilter = \"urn:schemas:httpmail:subject = ''Test A''\"\r\n     strScope = \"Posteingang\"\r\n     <span style=\"color:blue;\">Set<\/span> objSearch = objApplication.AdvancedSearch(_\r\n         strScope, strFilter, False, \"Test\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auch die Variable <b>bolSearchComplete <\/b>ben&ouml;tigen wir nicht mehr. Die Ereignisprozedur <b>objApplication_AdvancedSearchComplete <\/b>erh&auml;lt daf&uuml;r einige neue Zeilen. Sie deklariert nun die Variable des Typs <b>Outlook.Results <\/b>und f&uuml;llt diese mit der Eigenschaft <b>Results <\/b>des mit dem Parameter <b>SearchObject <\/b>gelieferten Suchobjekts.<\/p>\n<p>Dieser entspricht dem R&uuml;ckgabewert der Methode <b>AdvancedSearch <\/b>aus dem vorherigen Beispiel. Danach pr&uuml;ft die Ereignisprozedur wieder anhand des Tags, ob es sich um das Ereignis der zuvor aufgerufenen Suche handelt. Ist das der Fall, durchl&auml;uft die Prozedur die Elemente des Suchergebnisses in einer <b>For&#8230;Next<\/b>-Schleife und gibt den Wert der Eigenschaft <b>Subject <\/b>der gefundenen Elemente aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objApplication_AdvancedSearchComplete(_\r\n         ByVal SearchObject<span style=\"color:blue;\"> As <\/span>Search)\r\n     <span style=\"color:blue;\">Dim <\/span>objResults<span style=\"color:blue;\"> As <\/span>Outlook.Results\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">If <\/span>SearchObject.Tag = \"Test\"<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objResults = SearchObject.Results\r\n         For i = 1 To objResults.count\r\n             <span style=\"color:blue;\">Debug.Print<\/span> objResults.Item(i).Subject\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Anpassen des zu durchsuchenden Bereichs<\/h2>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000306\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000306?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000306\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"2c929cda42\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die &#8220;AdvancedSearch&#8221;-Methode der Application-Klasse von Outlook erlaubt das Suchen von Elementen nach bestimmten Kriterien in dem vorgegebenen Ordner &#8211; gegebenenfalls sogar mit Unterordnern. An ihr h&auml;ngen zwei Ereignisse namens &#8220;AdvancedSearchComplete&#8221; und &#8220;AdvancedSearchStopped&#8221;, die je nach dem Ausgang der Suche ausgel&ouml;st werden. Dieser Artikel zeigt, wie wir eine Suche in Outlook-Elementen per VBA durchf&uuml;hren und wie wir die damit zusammenh&auml;ngenden Ereignisse verwenden m&uuml;ssen, damit die Suche wie gew&uuml;nscht funktioniert. Au&szlig;erdem erf&auml;hrst Du, wie Du Suchbegriff und Suchbereich definieren musst.<\/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":[66022022,662022,44000004,44000026],"tags":[],"yst_prominent_words":[],"class_list":["post-55000306","post","type-post","status-publish","format-standard","hentry","category-66022022","category-662022","category-Loesungen","category-Outlook_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000306","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=55000306"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000306\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000306"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000306"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}