Tach,
ich habe mich nun mit dem Zugriff auf die Ordnerstruktur von Outlook befasst. Funzt auch. Nun scheinen mache Mails, die ich da importieren möchte aber merkwürdige Inhalte zu haben, sodass es zu folgendem Fehler kommt:
Laufzeitfehler '438' Objekt unterstützt diese Eigenschaft oder Methode nicht. Die Meldung kommt aber nicht gleich, vorher sind bereits mehrere hundert mails durchlaufen worden und der gewünschte output erzeugt. Nur an bestimmten stellen scheint was faul zu sein.
Habt ihr eine Idee, warum der Fehler auftritt und wie man das abfedern kann?
Private Sub Befehl17_Click()
' ##################### OutlookImport ##################################
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim outObject, Mapi, Inbox1, Mail, Inbox2, Inbox3
Dim strSQL As String
Set rs = CurrentDb.OpenRecordset("OutlookImport")
Set outObject = CreateObject("Outlook.Application")
Set Mapi = outObject.GetNamespace("MAPI")
Set Inbox1 = Mapi.Folders("Öffentliche Ordner")
Set Inbox2 = Inbox1.Folders("Alle Öffentlichen Ordner")
Set Inbox3 = Inbox2.Folders("tt")
For Each Mail In Inbox2.Items
Debug.Print Mail.SenderEmailAddress
Next
End Sub
Danke
Hi,
zunächst einmal setze den Haken bei der VBA-Option "Variablendeklaration erforderlich" und füge die Zeile "Option Explicit" im Kopf eines jeden Moduls ein, da wo es fehlt. Dann kompiliere den Code und bereinige die Fehler.
Wenn besagter Laufzeitfehler auftritt, kannst du in den Unterbrechungsmodus gehen und dir im Lokalfenster den aktuellen Stand der Objekte und deren Eigenschaften anschauen. Vielleicht bringt das neue Erkenntnisse.
Danke danke :)
Variablendeklaration und Option explicit habe ich bereits eingefügt/aktiviert, aber was ist mit kompilieren gemeint und wie aktiviere ich denunterbrechungsmodus?
Das Kompilieren wird über den Menü-Befehl "Debuggen" aus dem VBA-Editor heraus angestoßen.
In den Unterbrechungsmodus kommst du, wenn du bei Auftreten der Fehlermeldung auf "Debuggen" gehst.
Danke für die Antwort.
leider passiert da beim "kompilieren" nix, ob ich nun F8 oder Shift F8 drücke :(
wenn ich das ganze starte, kommt nach etwa zwei bis 3 minuten der fehler. bis dahin funktioniert das debug.print aber gut.
wenn ich dann auf "Debuggen" klicke, springt er in "debug.print Mail.SenderEmailAdresse"
Das hilft mir irgendwie nicht, oder? ich denke, dass er sich an einer dieser Mailadressen stört. manchmal ist es ja spam mit recht merkwürdigen mail-adressen. aber eigentlich soll er ja nur den string ausgeben. ist für mich daher unverständlich, warum da ein fehler entsteht.
habt ihr noch ideen? bzw. was mache ich beim kompilieren über Debuggen für F8/Shift F8 falsch?
nachdem "debug.print Mail.SenderEmailAdresse" gelb markiert wurde, habe ich F8 gedrückt, dann kommt aber wieder die ursprüngliche Fehlermeldung.
Edit:
ich habe das ganze eben auch mal mit "debug.print Mail.SentOn" getestet. auch da tritt es auf. Es scheint also nicht, wie gedacht, explizit an einer Mailadresse zu liegen, sondern an einer Mail selbst. Gibt es bei diesem Vorgang einen maximale Anzahl von durchläufen, sodass es vielleicht an der Menge der Mails scheitert? Wohl eher nicht, oder?
Hi,
Kompilieren solltest du nach Hinzufügen von Option Explicit, das hat nichts mit F8 zu tun.
ZitatDas hilft mir irgendwie nicht, oder?
Doch sicher, dann kannst du dir die aktuelle Position und die Inhalte anschauen.
dann habe ich das noch nicht verstanden.
vor Privat Sub steht folgendes:
Option Compare Database
Option Explicit
aber wie starte oder aktiviere ich denn das Kompilieren nun? Du hast gesagt über das Menü Debuggen, aber was dort? Mit F8 hat das nichts zu tun, sagst du.
und es passiert eben nix. wenn ich das, wie gedacht über den Button im Formular starte, läuft es einfach durch, bis der fehler auftritt. mehr wird mir dann nicht angezeigt. bin verwirrt.
Wenn du im VBA-Editor auf Debuggen klickst, steht direkt darunter "Kompilieren von...".
Mein Hinweis auf das Kompilieren bezieht sich darauf, dass du in der hier gezeigten Prozedur eine nicht deklarierte Variable verwendest. Aber das nur nebenbei.
Das Debuggen selbst nimmst du vor, wenn du dich im Unterbrechungsmodus des laufenden Codes befindest. Dort kannst du dann im Lokalfenster den Stand der Objekte und deren Eigenschaften einsehen und deine Schlüsse daraus ziehen.
Das heißt, du musst selbst aktiv werden, die Informationen werden dir nicht automatisch präsentiert.
PS:
Worauf es hinausläuft ist folgendes: Wenn du die Email identifiziert hast, die den Fehler verursacht, so kannst du vielleicht ein entscheidendes Merkmal finden, das dir hilft den Fehler abzufangen.
Das Kompilieren von... ist ausgegraut.
mit nicht deklarierten Variable meinst du Inbox3? das ist nur beim copy past verloren gegangen, die ist schon vorhanden.
Ich muss leider noch fragen, wo oder was das Lokalfenster sein soll? Sehe ich das erst, wenn es möglich ist, auf "Kompilieren von" zu klicken und warum ist das augegraut?
Wenn der Menüpunkt ausgegraut ist, dann ist die DB kompiliert. Das Thema Kompilieren ist damit erledigt, nun geht es ums Debuggen. Wenn der Fehler auftritt und du im Unterbrechungsmodus bist, kannst du über Menü "Ansicht" das Lokalfenster einblenden und dir die Details des "Mail"-Objekts anschauen. Finde heraus was an dieser Mail Besonderes ist, dass sie keine "SenderEmailAddress"-Eigenschaft hat.
okay. Danke für die Ausführungen, das hat so geklappt.
Aber da steht jede Menge drin. und jedes Element kann man ausklappen:
me
rs
outObject
Mapi
Mail
Inbox1-3
Wo fängt man denn da an und wonach muss man suchen? Wenn man das aufklappt, sind noch weitere unterebenen.
Ein Pfad lautet z.b. Application/Application und darin ist jeweils ein unterpunk "AnswerWizard" und bei Wert steht <Fehler beim Ausführen der Operation>
aber es gibt noch jede Menge weiterte unterbereiche.
aber das meint ihr, oder?
Zitatund jedes Element kann man ausklappen
Ich schrieb ja schon, dass du dir das
Mail-Objekt vornehmen solltest. Finde als erstes heraus um welche Mail es geht, dann schau dir ihre Eigenschaften an.
danke, aber auch das mail-objekt ist einigermaßen voll - siehe anhang.
gehe ich richtig in der Annahme, dass conversationTopic sows wie betreff ist?
aber aus den ganzen anzeigen werde ich als anfänger nicht schlau. ich weiß doch nicht mal, wo ich anfangen soll und welche Eigenschaften gemeint sind, was eine eigenschaft definiert usw. :/
ich habe unten noch ein Subject gefunden, da ist eine Raute (#) drin. kann sowas störend sein und einen fehler auslösen?
Hallo nimora,
Grundsätzlich zu deinem Problem:
In einem Ordner können sich verschiedene Objekte befinden.
Bevor du eine Eigenschaft eines Items abfragst, musst Du sicher gehen, ob es sich überhaupt um ein Mailitem handelt. Entweder über Typename, oder bei den Items über die Class Eigenschaft.
z.B.
If item.Class = olMail
Diese Deklaration:
Dim outObject, Mapi, Inbox1, Mail, Inbox2, Inbox3
würde ich nur sehr sparsam einsetzen. Datentyp Variant kann ja bekanntlich alles aufnehmen.
Wenn verschiedene Objekte in einer Auflistung sind, muss man natürlich einen Variablen Typen einsetzen.
dim Item as Object, Mail as Mailitem
for each Item in Folder
if Item.Class = olmail then
set Mail = item
jetzt kannst du auf die Auflistung aller Eigenschaften und Methoden in Mail zugreifen und bekommst in der Folge einen fehlerfreien Code
LG Markus
Hi,
wie mal an dem Screenshot sieht, handelt es sich ja um eine Email, das kann es also nicht sein. Um mehr zu sagen, müsste man auch den unteren Teil der Auflistung noch sehen zu können, evtl. muss man aber auch noch tiefere Ebenen aufblättern. Folge doch einfach mal deiner Intuition und finde ein Kriterium, anhand dessen du diese Mail von anderen unterscheiden und von der Verarbeitung ausschließen kannst.
Alternativ könntest du den Fehler mit einer Error-Routine abfangen und mit der nächsten Mail weitermachen.
danke euch beiden, auch wenn ich Maggies Logik zustimme, ist beides für ein weiteres Verständnis hilfreich.
Die Behandlung mit einerError-Routine kann helfen, löst natürlich nicht das Grundproblem.
ich habe jetzt festgestellt, dass der Fehler nicht kommt, wenn ich mir nur ein debug.print ausgebe (was aber auch schon aufgetreten ist, nun aber nicht mehr).
der fehler kommt nur noch, wenn ich den sql-befehl ausführen lasse. jetzt aber Laufzeitfehler 3075, Syntaxfehler, fehlernder operator in Abfrageausdruck. siehe Bild.
ist da nun ein fehler im sql-Statement? eher nicht, da es ja bis zum fehler funktioniert und die tabelle gefüllt wird und im fehler ja eine explizite Mail zu sehen ist.
Ich versuche das jetzt mal mit einer error-routine abzufangen, es wäre aber trotzdem nett von euch, wenn ihr zu den Fehlern noch etwas sagen könntet.
@Maggie: Folte deiner Intuition :) der ausdruck im lokalen fenster ist so umfangreich, dass das wohl eher ein stochern als ein suchen ist und ich kann ja nichts mit dem anfangen was da steht, nicht interpretieren. Mir ist ja nicht klar, ob die inhalte da so stehen sollen oder eben nicht. :/
Hi,
Zitatlöst natürlich nicht das Grundproblem
das "Grundproblem" könnte auch sein, dass wir überhaupt nicht wissen, was du vorhast.
Zitatdass der Fehler nicht kommt, wenn ich mir nur ein debug.print ausgebe
Etwas anderes hast du uns aber auch bislang noch gar nicht gezeigt.
Erkläre das bitte genauer und zeige den Code dazu.
Zitatist da nun ein fehler im sql-Statement?
Was für ein SQL-Statement?
Ganz gewiss liegt die Ursache des Fehlers in den Daten - bzw. im Umgang damit.
Zitatund ich kann ja nichts mit dem anfangen was da steht, nicht interpretieren
Benutze die OL-Hilfe, um die Bedeutung und Verwendbarkeit der angezeigten Eigenschaften zu verstehen.
Das hat auch mir in meiner "Learning by Doing"-Phase mit Office/Access immer wieder sehr geholfen.
Also, natürlich ist der Grundgedanke nicht der gewesen, sich ein debug.print ausgeben zu lassen. Ich will die Daten aus Outlook in eine Tabelle bekommen. Es stimmt, dies habe ich letztlich noch nicht mitgeteilt. Ich habe den Code wie folgt erweitert:
Option Compare Database
Option Explicit
Private Sub Befehl17_Click()
' ##################### OutlookImport ##################################
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim outObject, Mapi, Inbox, Inbox1, Mail
Dim strSQL As String
Set rs = CurrentDb.OpenRecordset("OutlookImport")
Set outObject = CreateObject("Outlook.Application")
Set Mapi = outObject.GetNamespace("MAPI")
Set Inbox = Mapi.GetDefaultFolder(olFolderInbox).Folders("import")
For Each Mail In Inbox.Items
strSQL = "INSERT INTO OutlookImport (Nachricht, AbsenderMail) VALUES ('" & Mail.Body & "', '" & Mail.SenderEmailAddress & "');"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
Next
Forms![OutlookImport].Requery 'Datenquelle aktualisieren
End Sub
Grundsätzlich funktioniert das ganze, nur scheinbar stoppt es bei einigen Mails, wie im letzten Screenshot zu sehen. Warum das der Fall ist, ist genau die Frage. Du sagst, ich solle die Hilfe zurate ziehen, um mich mit den Problemen, welche sich irgendwo im lokalen Fenster befinden auseinanderzusetzen.
Meinst du nicht, dass ein paar Infos darüber mir etwas besser auf die Sprünge helfen? Klar wird es Helfen, die OL-Hilfe zurate zu ziehen, aber wäre doch sehr langwierig, da ich eben nicht mal ansatzweise weiß, wo ich beginnen soll.
Ich will doch gar nicht von euch, dass ihr mir alles auf dem teblett serviert, ich möchte lediglich Anhaltspunkte, an denen ich mich entlang hangeln kann und lernen kann. Wenn du von deiner Learning by doing Phase sprichst, wist du dich doch auch sicher an eine gewisse Orientierungslosigkeit erinnern und du für Rat Dankbar warst und Hinweise, wie: Lies die Anleitung! erstmal für noch mehr Verwirrung als Aufklärung gesorgt hat.
Wie gesagt, ich bitte um Hinweise, nicht um eine Komplettlösung.
Neue Erkenntnis: mittels
On Error Resume Next
habe ich heursugefunden, dass das Auftreten der Fehler nicht gleich ist. In einem Durchlauf wurden ca. 13.000 einträge in die Datenbank vorgenommen, bei einem zweiten Durchlauf (nachdem ich die Datenbank geleert habe!!!) wurde nur etwa 2.500 Einträge vorgenommen.
Noch eine neue Erkenntnis:
Es wird immer verrückter. Das ganze scheint kein Statischer Fehler zu sein. Wenn ich den Code mittels Button nur oft genug ausführe (zw. 3 und 5mal) werden letzten dann doch alle Mails verarbeitet, pö a pö.
Die Analyse ergab bisher, dass es hauptsächlich in Mails mit einer Fremdsprache auftritt, in der im Betreff oder im Text ein oder mehrere " ' " vorkommen. Könnte dies den Fehler verursachen und wie kann man das abfedern? Scheinbar werden die ausgelesenen Inhalte ja teilweise wie Code behandelt. Könnte man das in einen String umwandeln oder nützt das nix?
Der Inhalt der Err.Description war folgender:
"Syntaxfehler (fehlender Operator) in Abfrageausdruck..." und dann folge eine Menge Text der Mail mit, wie gesagt häufigen Sonderzeichen und auch URL´s sind dabei.
Problem waren, wie oben schon vermutet diverse Sonderzeichen.
Lösung ist eine Replace Function, wie hier zu sehen:
Replace(Replace(Mail.Body, """", "'"), "'", "''")
Danke an alle Helfer!
Hi,
eine näher an die Realität angelegte Schilderung hätte das Problem sicher schneller lösen können.
Von der Verwendung des Mail.Body war bislang nicht die Rede!