Excepetion?!?

Moderator: ModerationP

Excepetion?!?

Beitragvon lolnein » 05. Jan 2018, 14:03

Hallo, ich möchte alle Anlagen in dem Posteingang von einem eingebunden Postfach auf einen Bestimmten Pfad Speichern.
In dem Ordner liegen viele Verschiedene Mails. Mails ohne Anhang. Mails mit Anhang und Mails wo Termine abgesagt wurdnen oder auch bestätigigt.

Mein Code funktioniert super so lange er nicht auf eine Mail mit einem Termin stößt.
"
Sprich wenn ich (von oben) 3 Mails habe mit Anhängen dann eine mit einem Termin dann exportiert er die 3 und bricht dann beim 4. mit Laufzeitfehler 13 und "Typen unverträglich" ab.

Bin ein bisschen ratlos.

Code: Alles auswählen
Sub Anlage_verschieben()
Dim strPath As String
Dim objBackUp As MAPIFolder
Dim objMail As MailItem
Dim intAnlagen As Integer, i As Integer
Dim myNamespace As Outlook.NameSpace
Dim myRecipient As Outlook.Recipient
Dim CalendarFolder As Outlook.Folder

 Set myNamespace = Application.GetNamespace("MAPI")

 Set myRecipient = myNamespace.CreateRecipient("Bernd")



'Pfad zu Ziel Ordner
strPath = "J:\PMO\Zeitnachweise\Kalenderwoche\Outlook Export"

Set objBackUp = Application.GetNamespace("MAPI").GetSharedDefaultFolder(myRecipient, olFolderInbox)

'Schleife
For Each objMail In objBackUp.Items 'eMails im BackUp-Ordner
With objMail
'Mails auf vorh. Anlagen prüfen
intAnlagen = .Attachments.Count
If intAnlagen > 0 Then
For i = 1 To intAnlagen
'Anlagen im vordefinierten Verzeichnis sichern
.Attachments.Item(i).SaveAsFile strPath & "\" & .Attachments.Item(i).FileName
Next i
End If
End With
Next objMail

'Löschen?
'If MsgBox("Die eMail-Anlagen aus dem Ordner BackUp wurden im Verzeihnis" & Chr(13) & strPath & Chr(13) & "gespeichert." & Chr(13) & Chr(13) & "Sollen die eMails nun aus dem Ordner BackUp in den Papierkorb verschoben werden?", vbYesNo, "Hinweis:") = vbYes Then
'For i = 1 To objBackUp.Items.Count
'objBackUp.Items(1).Delete
'Next i
'MsgBox "eMails aus dem Ordner BackUp in den Papierkorb verschoben!", vbOKOnly, "Info"
'Else: GoTo Ende
'End If

Ende:
Set objBackUp = Nothing
End Sub
lolnein
 

Re: Excepetion?!?

Beitragvon 1Matthias » 05. Jan 2018, 21:37

Moin!
Kannst du mal sagen in welcher Zeile deines Codes er dann abbricht!?
Hatte erst gedacht, dass es an den Terminen liegt, aber die haben auch die attachment Eigenschaft. Falls du Termine umgehen willst, sollt es so gehen.
Code: Alles auswählen
'Schleife
For Each objMail In objBackUp.Items 'eMails im BackUp-Ordner
If TypeName(objMail) = "MailItem" Then
    With objMail
   
    'Mails auf vorh. Anlagen prüfen
    intAnlagen = .Attachments.Count
    If intAnlagen > 0 Then
    For i = 1 To intAnlagen
    'Anlagen im vordefinierten Verzeichnis sichern
    .Attachments.Item(i).SaveAsFile strPath & "\" & .Attachments.Item(i).Filename
    Next i
    End If
    End With
End If
Next objMail

Dabei wird dein objMail noch geprüft. Wenn es eine EMail ist, geht es weiter sonst wird der Eintrag übersprungen. Ist aber ungetestet - habe hier kein Outlook.
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 483
Registriert: 15. Aug 2017, 18:36

Re: Excepetion?!?

Beitragvon mmarkus » 06. Jan 2018, 20:44

Der Fehler entsteht in der For Schleife, da als Mail dimensionierte Variablen nur Mails verarbeiten können.

Du kannst entweder per LateBinding arbeiten oder die Daten filtern, so dass nur Mails vorhanden sind.
Per Filter könnte es so funktionieren (wobei objBackUp als Items dimensioniert werden muss) :

dim objBackUp as Items
Set objBackUp = Application.GetNamespace("MAPI").GetSharedDefaultFolder(myRecipient, olFolderInbox).Items.Restrict("[MessageClass]='IPM.Note'")

'Schleife
For Each objMail In objBackUp
....


next

Wobei ich ehrlich nicht verstehe warum man alle Anhänge einfach ohne Zusammenhang zur Mail und unabhängig des Inhalts speichert.
Sollte ein Dateiname doppelt vorkommen was dann?
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 994
Registriert: 16. Apr 2012, 16:07
Wohnort: Vienna

Re: Excepetion?!?

Beitragvon lolnein » 09. Jan 2018, 12:54

Danke erstmal so funktioniert es tatsächlich.

Das mit dem Überprüfen der Anhänge wäre das nächstes. Im Grunde will ich nur Anhänge herunterladen die das Wort BAB enthalten.

Wie würde ich das machen? Wahrscheinlich in der for schleife eine Abfrage nach dem Dateinamen und dann ob er den Ausdruck enthält? Kenne mich leider noch nicht so gut in VBA aus.

Danke schon mal.
lolnein
 

Re: Excepetion?!?

Beitragvon lolnein » 09. Jan 2018, 13:01

Also das es warscheinlich mit .Attachments.Item(i).FileName funktioniert is tmir klar.

Aber reicht

Code: Alles auswählen
If intAnlagen > 0 Then
For i = 1 To intAnlagen
'Anlagen im vordefinierten Verzeichnis sichern
if .Attachments.Item(i).FileName like "BaB"
.Attachments.Item(i).SaveAsFile strPath & "\" & .Attachments.Item(i).FileName
End If
Next i
End If


Oder wie genau muss ich die Zeile schreiben?
lolnein
 

Re: Excepetion?!?

Beitragvon 1Matthias » 09. Jan 2018, 13:15

Moin!
So sollte die Zeile gehen:
Code: Alles auswählen
If .Attachments.Item(i).Filename Like "*BaB*" Then

Da der Code ja irgendwo vorkommen kann, in * einbinden. Und das then am Ende nicht vergessen.
Optional würde es auch so gehen.
Code: Alles auswählen
If InStr(1, .Attachments.Item(i).Filename, "BAB", vbTextCompare) > 0 Then

Aber achte auf deine Schreibweise von BAB.
Und du solltest noch prüfen, ob die Datei nicht schon da ist. Da würde sich ggf. die Funktin DIR anbieten.
VG
1Matthias
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 483
Registriert: 15. Aug 2017, 18:36

Re: Excepetion?!?

Beitragvon Gast » 09. Jan 2018, 13:36

Cool funktioniert super. Ich habe die Alternative Version mit vbTextCompare genommen weil ich das schon kannte und es mir bei Like Sachen immer Graut.

Ich hab jetzt momentan das hier

Code: Alles auswählen
'Schleife
For Each objMail In objBackUp 'eMails im PMO-Emailfach
With objMail
'Mails auf vorh. Anlagen prüfen
intAnlagen = .Attachments.Count
If intAnlagen > 0 Then
For i = 1 To intAnlagen
'Anlagen im vordefinierten Verzeichnis sichern
If InStr(1, .Attachments.Item(i).FileName, "PMO-01_Programm_bonprix_AZN", vbTextCompare) > 0 Then
.Attachments.Item(i).SaveAsFile strPath & "\" & .Attachments.Item(i).FileName
End If
Next i
End If
End With
Next objMail


Jetzt noch eine letzte Sache. Wenn ich E-Mails die einen solchen Anhang haben in einen Unterordner Verschieben möchte. Wie würde ich das am besten machen?

Code: Alles auswählen
'Schleife
For Each objMail In objBackUp 'eMails im PMO-Emailfach
With objMail
'Mails auf vorh. Anlagen prüfen
intAnlagen = .Attachments.Count
If intAnlagen > 0 Then
For i = 1 To intAnlagen
'Anlagen im vordefinierten Verzeichnis sichern
If InStr(1, .Attachments.Item(i).FileName, "BAB", vbTextCompare) > 0 Then
.Attachments.Item(i).SaveAsFile strPath & "\" & .Attachments.Item(i).FileName
End If
Next i
objMail. Move(Archive)
End If
End With
Next objMail


Würde das so gehen mit: objMail. Move(Archive)

Dabei ist zu beachten das Archive ein Ordner ist der in einem Eingebundenen Postfach liegt. Das Postfach liegt in der Variable myRecipient As Outlook.Recipient

Dankööö
Gast
 

Re: Excepetion?!?

Beitragvon Gast » 11. Jan 2018, 10:25

Also leider komm ich noch nicht so richtig mit dem verschieben weiter.

Code: Alles auswählen
'Schleife
For Each objMail In objBackUp 'eMails im PMO-Posteinang
With objMail
'Mails auf vorh. Anlagen prüfen
intAnlagen = .Attachments.Count
If intAnlagen > 0 Then
For i = 1 To intAnlagen
'Anlagen im vordefinierten Verzeichnis sichern
If InStr(1, .Attachments.Item(i).FileName, "BAB", vbTextCompare) > 0 Then 'Nimmt nur Anhänge die das geforderte KeyWord enthalten
.Attachments.Item(i).SaveAsFile strPath & "\" & .Attachments.Item(i).FileName
.Move (myDestFolder)
End If
Next i
End If
End With
Next objMail


Ich bekomme einen Laufzeitfehler 424 "Objekt erforderlich" in der Zeile wo .Move(MydestFolder) ist.

Auch objMail.Move funktioniert nicht. Was mir anscheinend Fehlt ist das Mail Item. Aber wie kann ich das in der For Each Schleife angeben?
Gast
 

Re: Excepetion?!?

Beitragvon mmarkus » 11. Jan 2018, 12:16

Gast hat geschrieben:Ich bekomme einen Laufzeitfehler 424 "Objekt erforderlich" in der Zeile wo .Move(MydestFolder) ist.

Auch objMail.Move funktioniert nicht. Was mir anscheinend Fehlt ist das Mail Item. Aber wie kann ich das in der For Each Schleife angeben?



Hier das Beispiel bezüglich Move aus der VBA Hilfe:

Code: Alles auswählen
   Set myDestFolder = myInbox.Folders("Personal Mail")
   Set myItem = myItems.Find("[SenderName] = 'Dan Wilson'")
   While TypeName(myItem) <> "Nothing"
      myItem.Move myDestFolder
      Set myItem = myItems.FindNext
   Wend


Das sollte dir weiterhelfen.
Schaust du auch in die VBA Hilfe, wenn du nicht weiter kommst, oder vergeudest du deine Zeit mit probieren?

objMail ist ein MailItem.
Das sollte schon aufgrund der Deklaration von objMail klar sein.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 994
Registriert: 16. Apr 2012, 16:07
Wohnort: Vienna

Re: Excepetion?!?

Beitragvon lolnein » 11. Jan 2018, 13:33

Danke.
Tatsächlich habe ich da schon geschaut und schreibe hier erst rein wenn ich nicht mehr weiter weiß nach extensiven googeln.

Ich hab das Problem jetzt aber gelöst.

Code: Alles auswählen
objMail.Move (myDestFolder)


So funktioniert es nicht.

Code: Alles auswählen
objMail.Move myDestFolder


So funktioniert es jetzt auch. Ein einfacher Syntax Fehler also.
lolnein
 

Re: Excepetion?!?

Beitragvon mmarkus » 11. Jan 2018, 15:39

lolnein hat geschrieben:Danke.
Tatsächlich habe ich da schon geschaut und schreibe hier erst rein wenn ich nicht mehr weiter weiß nach extensiven googeln.


so soll es sein!

So viel ich weiß, wird bei einer normalen skalaren Variable wenn man sie klammert der Wert byVal übergeben.
Nicht so bei einem Objekt.

Sollte jemand den Grund kennen würde ich mich über einen Erkenntnisgewinn freuen.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 994
Registriert: 16. Apr 2012, 16:07
Wohnort: Vienna

Re: Excepetion?!?

Beitragvon Michael Bauer » 11. Jan 2018, 19:25

Ob ein Wert ByVal oder ByRef übergeben wird, bestimmt die Deklaration der aufzurufenden Funktion, nicht die aufrufende Funktion.

Die Klammer darf nur verwendet werden, wenn es eine Funktion ist und man die Rückgabe einer Variable zuweist. Speichert man die Rückgabe nicht, oder ist es keine Function, sondern eine Sub, dann darf die Klammer nicht verwendet werden. Ausnahme ist, wenn man das Schlüsselwort Call benutzt.

Da Move eine Function ist, gibt es diese Möglichkeiten:
1. set var = objMail.Move (myDestFolder)
2. call objMail.Move (myDestFolder)
3. objMail.Move myDestFolder

Warum das so ist, habe ich vergessen. Ich vermute, der Compiler wertet bei
objMail.Move (myDestFolder)
"Move" als Array, wobei "myDestFolder" dann der Index wäre.
Michael Bauer
Add-Ins für Microsoft Outlook
Benutzeravatar
Michael Bauer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 6326
Registriert: 03. Feb 2005, 15:07
Wohnort: Vollersode

Re: Excepetion?!?

Beitragvon mmarkus » 11. Jan 2018, 19:54

Michael Bauer hat geschrieben:Ob ein Wert ByVal oder ByRef übergeben wird, bestimmt die Deklaration der aufzurufenden Funktion, nicht die aufrufende Funktion.

Die Klammer darf nur verwendet werden, wenn es eine Funktion ist und man die Rückgabe einer Variable zuweist. Speichert man die Rückgabe nicht, oder ist es keine Function, sondern eine Sub, dann darf die Klammer nicht verwendet werden. Ausnahme ist, wenn man das Schlüsselwort Call benutzt.


Sorry, dass habe ich nicht präzise ausgedrückt. Übergabe ByVal geht nur bei API Funktionen.
Wenn man um eine Varialbe (bei einem skalaren Typ) eine Klammer setzt, dann wird von der Variable eine Kopie erstellt und übergeben.


Code: Alles auswählen
Sub Test()
    Dim s$
   
    s = "Test"
    Debug.Print VarPtr(s),  StrPtr(s)
    Empfänger s
    Empfänger (s)
End Sub
Sub Empfänger(s$)
    Debug.Print VarPtr(s), StrPtr(s)
   
End Sub


Aber natürlich kann von einem Objekt nicht so einfach eine Kopie erstellt werden. Wäre ja supper wenn es so leicht möglich wäre.
Die Frage erübrigt sich also. :D

Danke.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 994
Registriert: 16. Apr 2012, 16:07
Wohnort: Vienna

Re: Excepetion?!?

Beitragvon Michael Bauer » 12. Jan 2018, 08:04

Danke, dann hat die Möglichkeit der Klammersetzung also mit der Kopierfähigkeit des Typs zu tun.
Michael Bauer
Add-Ins für Microsoft Outlook
Benutzeravatar
Michael Bauer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 6326
Registriert: 03. Feb 2005, 15:07
Wohnort: Vollersode

Re: Excepetion?!?

Beitragvon lolnein » 18. Jan 2018, 10:59

Es ist noch ein weiteres Problem aufgetaucht. Das Makro läuft nur für eine unbestimmte Anzahl an Mails ab und hört dann auf. Das Makro ist aber nicht fertig weil ich eine End Meldung eingebaut habe und die nicht angezeigt wird. Wenn ich das Makro dann nochmal ausführe macht er wieder ein paar.

Wenn ich das Makro aus dem VBA Editor abspiele bekomme ich laufzeitfehler -2147219840 (80040680) "Die Items wurden Kopiert und nicht verschoben weil die ürsprünglichen Items nicht Gelöscht werden können" oder so ähnlich.

Woran kann das liegen? Ich vermute irgendwo wird ein Fehler produziert und den zeigt er mir nicht an sondern beendet das Makro dann einfach?
lolnein
 

Nächste

Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste