mephisti
Goto Top

Nur bestimmte Anhänge speichern

Hallo Allerseites,

ich bastel gerade an einem Script herum, um nur bestimmte Mailanhänge im Dateisystem abzuspeichern.
Lasse ich die Einschränkung weg funktioniert alles tadellos. Versuche ich allerdings den Dateityp der Anlage auf pdf zu reduzieren (and LCase(Right(Item.FileName, 4)) = ".pdf") komme ich über einen Laufzeitfehler 91 nicht hinaus ... Objekt oder Withblockvariable nicht definiert.

Danke für Eure Hilfe.

Gruß Mephisti

Private Sub myOlItems_ItemAdd(ByVal Item As Object)
  Const sPfad  As String = "C:\Daten\Outlook-Anhang"  
    
    Dim iAttachCnt As Integer
    Dim i As Integer
    Dim myItem As Outlook.MailItem
    Dim DateFolderPath As String
    Dim fso As Object
       
    DateFolderPath = sPfad & "\" & Format(Date, "dd-mm-yyyy")  
    Set fso = CreateObject("Scripting.FileSystemObject")  
    
    If Not fso.FolderExists(sPfad) Then
        fso.CreateFolder sPfad
    End If

    If Not fso.FolderExists(DateFolderPath) Then
        fso.CreateFolder DateFolderPath
    End If
    
    If TypeName(Item) = "MailItem" Then  
    With Item.Attachments
      iAttachCnt = .Count
      If iAttachCnt > 0 Then
       'For i = 1 To iAttachCnt then <--- Mit dieser Variante werden alle Anlagen abgespeichert, ist aber nicht Ziel  
        For i = 1 To iAttachCnt and LCase(Right(Item.FileName, 4)) = ".pdf" Then <--- Hier kommt der Laufzeitfehler 91  
          .Item(i).SaveAsFile DateFolderPath & "\" & .Item(i).FileName  
        Next i
      End If
    End With
  End If
  End Sub

[Edit Biber] Codeformatierung [/Edit]

Content-Key: 161679

Url: https://administrator.de/contentid/161679

Printed on: April 18, 2024 at 14:04 o'clock

Member: StefanKittel
StefanKittel Feb 28, 2011 at 08:14:42 (UTC)
Goto Top
Moin,

wo wird denn Item.FileName dem Index zugeordnet?

müßte das nicht so sein:

For i = 1 To iAttachCnt then
  if (LCase(Right(.Item(i).FileName, 4)) = ".pdf") then  
    .Item(i).SaveAsFile DateFolderPath & "\" & .Item(i).FileName  
  end if
Next i

Stefan

PS: nicht getestet!
Member: bastla
bastla Feb 28, 2011 at 08:27:02 (UTC)
Goto Top
Hallo Mephisti!

Das ließe sich etwas kompakter formulieren (und schöner posten face-wink):
...
If TypeName(Item) = "MailItem" Then  
    With Item.Attachments
        For i = 1 To .Count 'wenn .Count < 1 wird die Schleife ohnehin übersprungen  
            If LCase(Right(.Item(i).FileName, 4)) = ".pdf" Then .Item(i).SaveAsFile DateFolderPath & "\" & .Item(i).FileName  
        Next
    End With
End If
Alternativ sollte auch
...
If TypeName(Item) = "MailItem" Then  
    For Each Attach In Item.Attachments
        File = Attach.FileName
        If LCase(Right(File, 4)) = ".pdf" Then Attach.SaveAsFile DateFolderPath & "\" & File  
    Next
End If
funktionieren - das Testen muss ich allerdings Dir überlassen ... face-wink

Grüße
bastla
Member: Mephisti
Mephisti Feb 28, 2011 at 08:33:53 (UTC)
Goto Top
Hallo Bastla,
hallo Stephan,

werd eure beiden Vorschläge testen, Ergebnis folgt.
Danke schon mal im voraus.

Gruß
Mephisti
Member: Biber
Biber Feb 28, 2011 at 08:35:47 (UTC)
Goto Top
Moin Mephisti,

wenn es etwas gibt, was ich noch mehr hasse als Montage...
-> Dann sind es Montags-Beiträge mit Programmschnipseln ohne Codeformatierung.

Dein Fauxpas in diesem Codefragment:

  • Du hast doch schon in Zeile 22 gesagt "With Item.Attachment"
  • In der FOR i=1 TO... -Konstruktion sprichst du aber nicht ".(i).FileName" (==Item.Attachment(i).Filename) an, sondern ein "Item.Filename". Das gibt es aber nicht.
  • Also ersetze "LCase(Right(Item.(i).FileName, 4))" durch "LCase(Right(.(i).FileName, 4))".

[Ebenfalls ungetestet]
Grüße
Biber

[Edit] Montags bin ich immer vieeeel zu langsam....[/Edit]
Member: Mephisti
Mephisti Feb 28, 2011 at 16:44:53 (UTC)
Goto Top
Hallo Bastla,

dein erster Tipp hatte schon das gewünschte erreicht.
Besten Dank auch an alle anderen für eure Hilfe!

Gruß
Mephisti