Hallo zusammen,
ich habe eine recht aufwendige Datenbank mit einigem VBA code. Die Umstellung von Office 2007 auf Office 2013 steht bevor.
Der Code sollte aus Access heraus in regelmässigen Abständen die inbxo eines zweiten email-accounts überprüft, und bei bestimmten kriterien den Text einliest und verarbeitet.
In Betrieb auf Access 2013 habe ich das problem, das folgender code immer Fehler Nr "-2147221233"
"Der versuchte Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden." schmeisst - obwohl er in 2007 einwandfrei lief. Gab es diesbezüglich Änderungen???
Public Sub email_Abfrage()
Dim oOutlook As Outlook.Application
Dim oNamespace As Outlook.NameSpace
Dim oMail As Outlook.MailItem
Dim folder As Outlook.MAPIFolder
Dim vbody As Variant
Dim const_email As String
Dim Adresse As String
Dim Zeile As Single
Dim Sachbearbeiter As String
Dim dblZeit As Double
Dim dDatum As Date
Dim DS_exist As Boolean
Dim j As Single
Dim k As Single
'===== Email Adresse welche ausgelesen werden soll ==============
Adresse = "meine_adresse@provider.de"
'================================================================
' Outlook-Konstante
Const olFolderInbox = 6
' Outlook-Objekt erstellen
Set oOutlook = New Outlook.Application
Set oMail = oOutlook.CreateItem(olMailItem)
' Namespace: MAPI
Set oNamespace = oOutlook.GetNamespace("MAPI")
' Outlook-Ordner: "Neue Nachrichten"
Rem Set folder = oNamespace.GetDefaultFolder(olFolderInbox)
'Set folder = oOutlook.Session.Folders("meine_adresse@provider.de")
' On Error GoTo LM_importer_error
On Error Resume Next
Set folder = oNamespace.Folders("Postfach - meine_adresse@provider").Folders("Inbox")
If Err.Number = -2147221233 Then
MsgBox "Ihr Postfach ist nicht korrekt eingerichtet. Wenden sie sich an den Systemadministrator.", vbCritical
Exit Sub
End If
On Error GoTo 0
' alle Mails durchlaufen
j = folder.Items.Count
Do While j > 0
' Abfrage auf mail.item
On Error Resume Next
Set oMail = folder.Items(j)
If Err.Number <> 0 Then
Rem Debug.Print Err.Number
On Error GoTo 0
GoTo weiter
End If
'If oMail.UnRead = True Then
If oMail.SenderEmailAddress = Adresse Then
Rem debug.print "Import: JA"
'===== Absicherung vor doppelten Einträgen =====
' Überprüfung ob Daten bereits importiert wurden mit Kriterien empfangszeit und Absender
' Inhalt der Mail Zeilenweise auslesen
Zeile = 1
For Each vbody In Split(oMail.Body, vbCrLf)
' vbody ist der Inhalt der jeweiligen Zeile in der Mail
' k deklariert die Länge der Beschriftung welche vor dem Variableninhalt steht
Select Case Zeile
Case 30 ' Konakt
k = 9
If Len(vbody) > k Then Sachbearbeiter = Right(vbody, Len(vbody) - k)
Exit For
End Select
Zeile = Zeile + 1
Next vbody
dblZeit = CDbl(CDate(oMail.ReceivedTime)) 'Uhrzeit in der die email gesendet wurde als lng
' rem debug.print dblZeit
dDatum = CDate(Left(oMail.ReceivedTime, 10)) 'Datum des Mailversands
' rem debug.print dDatum
DS_exist = False
DS_exist = qdfTest(Sachbearbeiter, dblZeit) ' Gibt true zurück wenn der Eintrag bereits besteht
If DS_exist = False Then
Call LM_Importer
Exit Sub
ElseIf DS_exist = True Then
oMail.UnRead = False
End If
'End If
End If
weiter:
j = j - 1 ' Zählt die Menge aller emails runter bis alle durchsucht wurden
Loop
' Objekte zerstören
Set oMail = Nothing
Set folder = Nothing
Set oNamespace = Nothing
Set oOutlook = Nothing
Exit Sub
email_abfrage_error:
MsgBox "Es ist ein Fehler aufgetreten." & vbCrLf & vbCrLf & "Bitte kontaktieren Sie den Administrator.", vbCritical
End Sub
Danke im Vorraus für eure Hilfe.
gruß
Danijel
Hi,
wird denn oNamespace noch korrekt initialisiert?
wie kann ich das rausfinden?
in den access-Sachen kenne ich mich recht ordentlich aus, aber die email-Prozedur habe ich leider nur abgewandelt von dem was ich im Netz gefunden habe. Habe mich mit outlook vba bisher seeehr wenig befasst.
Du kannst den Code im Unterbrechungsmodus testen und nach jedem Befehl den Zustand der Variablen und Objekte kontrollieren.
soweit klar - aber ich weiss nicht was ich da erwarte.
Der wert von oNamespace ist "Mapi"
Das hab ich der Variablen zugewiesen. Ich weiss nur nicht wofür es steht und was es tut.
der Fehler entsteht auf jeden fall in folgendem Codeteil
Set folder = oNamespace.Folders("Postfach - rolle.aschheim").Folders("Inbox")
Könnte es sein, dass das Postfach in Outlook 2013 anders anzusprechen bzw. anders benannt ist?
Schau dir doch im Unterbrechungsmodus das oNamespace-Objekt im Lokalfenster mal genauer an.
ich habe mal folgenden Code laufen lassen, der listet einfach alle vorhandenen Ordner auf. Dieser läuft. Also muss mein Fehler irgendwo in meinem Syntax stecken. Nur sehen tu ich ihn nicht. :-\
Public Sub test()
Dim oOutlook As Outlook.Application
Dim oNamespace As Outlook.NameSpace
Dim Folder As Outlook.MAPIFolder
Dim strFolderlist As String
Dim TargetFolder As Outlook.MAPIFolder
strFolderlist = "Your Outlook NameSpace contains these folders:"
Set oOutlook = New Outlook.Application
Set oMail = oOutlook.CreateItem(olMailItem)
' Namespace: MAPI
Set oNamespace = oOutlook.GetNamespace("MAPI")
With oNamespace
For Each Folder In oNamespace.Folders
strFolderlist = strFolderlist & Folder.Name & vbCr
For Each TargetFolder In Folder.Folders
Debug.Print TargetFolder.Name
Next TargetFolder
Next Folder
End With
End Sub
Zitatder listet einfach alle vorhandenen Ordner auf
Und war der Ordner "Postfach - rolle.aschheim" dabei??
Du hättest wohl auch die Variable "strFolderlist" noch mit ausgeben sollen...
nö - ich habe nur zwei mal Inbox
einer gehört zu meinem eigenen Account und die zweite zum account Rolle.Aschheim
Bei 2007 hat genau das "Postfach - Rolle.aschheim" bewirkt das ich aus dem 2. Account auslese.
ich brauche auch NUR die mails aus dem zweiten postfach welches unter rolle.aschheim läuft.
Dann solltest du dir halt alle Foldernamen ausgeben lassen, um zu kontrollieren, ob das Postfach nicht vielleicht doch anders heißt.
auch wenn ich mir alle Ordner anzeigen lasse, so bekomme ich folgendes raus für meinen gewünschten ordner.
\\rolle.aschheim\Inbox
welche Syntax kann ich noch verwenden um in diesem Ordner z.B. items.count zu machen oder entsprechend Items zu verschieben???
Tut mir leid das ich da ein wenig nerve - aber ich steh echt auf dem Schlauch.
Also heißt der Ordner nicht "Postfach - rolle.aschheim" sondern "rolle.aschheim"?!
Oder wie bist du jetzt an die zuletzt gezeigte Ausgabe gekommen?
Wozu willst du "items verschieben"?
Hallo,
neuer Tag - neues Glück. Vielleicht bekommen wir es ja heute zum laufen.
also ich habe mit folgendem code
Sub EnumerateFoldersInStores()
Dim colStores As Outlook.Stores
Dim oStore As Outlook.Store
Dim oRoot As Outlook.Folder
On Error Resume Next
Set colStores = Application.Session.Stores
For Each oStore In colStores
Set oRoot = oStore.GetRootFolder
Debug.Print (oRoot.FolderPath)
EnumerateFolders oRoot
Next
End Sub
Private Sub EnumerateFolders(ByVal oFolder As Outlook.Folder)
Dim folders As Outlook.folders
Dim Folder As Outlook.Folder
Dim foldercount As Integer
On Error Resume Next
Set folders = oFolder.folders
foldercount = folders.Count
'Check if there are any folders below oFolder
If foldercount Then
For Each Folder In folders
Debug.Print (Folder.FolderPath)
EnumerateFolders Folder
Next
End If
End Sub
mir in outlook alle ordner auflisten lassen. Dadurch habe ich diesen Pfad rausbekommen
Ich erinnere mich noch das beim erstellen des Codes für das 2007 diese Bezeichnung "Postfach - rolle.aschheim" notwendig war damit das Postfach als ganzes erkannt wird.
Nun, das sieht jetzt offensichtlich anders aus. Du kannst das Postfach nur unter dem in Outlook bekannten Namen ansprechen. Damit wäre das jetzt wohl geklärt.
In O2010 gibt es bei mir aber auch schon den Vorsatz "Postfach - " nicht.
Also ich bekomme es irgendwie nicht hin.
könntest du mir mal sagen wie das in deinem Office 2010 aussehen würde, wenn ich einen unterordner eines bestimmten accounts auswähle, und darin items.count mache??
den Folder brauche ich als variable um später damit zu arbeiten. - Ich stehe leider voll auf dem schlauch.
Danke nochmal für eure tatkräftige hilfe hierbei.
Was passiert denn, wenn du den Folder "rolle.aschheim" zu öffnen versuchst?
Es kann doch nicht sein, dass der auch nicht gefunden wird.
Das ist lustig, denn ich habe das schon probiert und es ging nicht.
jetzt habe ich es im PRODUKTIVEN Frontend geändert um sicher zu gehen das ich keine fehlerhaften Änderungen im code habe, und da funktioniert es. Eine kleinigkeit die sehr viel Ärger gemacht hat.
Ich danke noch mal ganz herzlich für eure Hilfe.
Gruß
Danijel