Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1896to1900
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
EMail Anhänge letzte Email speichern
08.09.2022 18:56:40
Andy
Hallo alle zusammen,
ich habe eine Frage hinsichtlich dem Speichern von Email Anhängen. Ich verwende Outlook und habe derzeit einen Code am laufen, der mir Emails der letzten 30 min nach einem Betreff durchsucht und Anlagen daraus abspeichert. Leider macht er nur pdfs.
Ich würde den Code gerne umschreiben und zwar dahingehend, dass nur die letzte Email nach Anhängen durchsucht wird. Hierbei soll auch die Dateiendung keine rolle spielen. Der Code soll anschließend die Datei umbenennen und in einem Ordner abspeichern. Könnte mir vl. jemand beim Modifizieren ein bisschen unter die Arme greifen? lieben dank

Private Sub CommandButton12_Click()
'Button zum Import Email-Anhängen aus letzter Email
Dim olApp As Object
Dim objFolder As Object
Dim objItem As Object
Dim zeit As String
Dim counter As Long
dim spfadscan as string
If MsgBox("Möchten Sie aus Ihrem persönlichen Email-Posteingang den Anhangsimport starten?" , vbQuestion + vbYesNo, "Anhang import") = vbYes Then
Set olApp = CreateObject("outlook.application")
Set objFolder = olApp.GetNamespace("MAPI").GetDefaultFolder(6)
zeit = DateAdd("n", -30, Now())   ' 30 Minuten
counter = 1
spfadscan ="X:\Scan"
For Each objItem In objFolder.Items
If CDate(objItem.receivedtime()) >= zeit Then
If objItem.Subject Like "*" & "Scan" & "*" Then
If objItem.attachments.Count > 0 Then
With objItem.attachments.Item(1)
If .Filename Like "*.pdf" Then
.SaveAsFile sPfadScan & Format(Now(), "yyyy-mm-dd") & "_" & Format(Now(), "hh-mm-ss") & "_" & "Import" & ".pdf"
End If
End With
Else
End If
objItem.Delete
counter = counter + 1
Else
End If
End If
Next
Set objFolder = Nothing
Set olApp = Nothing
End If
End Sub

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: EMail Anhänge letzte Email speichern
08.09.2022 20:18:04
Luschi
Hallo Andy,
dann rate/google doch mal, was dieser Vba-Block bedeutet:

If .Filename Like "*.pdf" Then
.SaveAsFile sPfadScan & Format(Now(), "yyyy-mm-dd") & "_" & Format(Now(), "hh-mm-ss") & "_" & "Import" & ".pdf"
End If
Gruß von Luschi
aus klein-Paris
PS: Diesen Definitionsfehler hast Du immer noch nicht beseitigt: Dim zeit As String, denn Zeit soll ein Datum mit Zeit aufnehmen und keinen Text.
AW: EMail Anhänge letzte Email speichern
08.09.2022 20:42:12
Andy
Hallo Luschi,
Du hast recht ! Den Fehler habe ich jetzt beseitigt!
Aber: dass der Passus *.Pdf speichert ist mir klar, denke auch mal, dass *.* dann alle Arten der Files nimmt: aber ich will ja die letzte email, egal wie lange die her ist …
Anzeige
AW: EMail Anhänge letzte Email speichern
08.09.2022 21:06:00
JoWE
Hallo Andy,
Du könntest doch Dein Makro die Zeiten der Maileingänge welche mit einem Attachement versehen sind, in eine temporäre Hilstabelle schreiben lassen, mit der Worksheetfunktion MAX die neueste Mail identifizieren und die so ermittelte neueste Email/die Anlage nutzen.
Gruß
Jochen
AW: EMail Anhänge letzte Email speichern
08.09.2022 22:14:44
JoWE
z.B. so:

   Sub findNewestMail()
Dim olApp As Object
Dim objFolder As Object
Dim objItem As Object
Dim ze As Long
Dim vNewest As Date
Set olApp = CreateObject("outlook.application")
Set objFolder = olApp.GetNamespace("MAPI").GetDefaultFolder(6)
With Sheets("HT")
For Each objItem In objFolder.Items
If objItem.attachments.Count > 0 Then
ze = ze + 1
.Cells(ze, 1) = objItem
.Cells(ze, 2) = objItem.ReceivedTime
.Cells(ze, 3) = ze
End If
Next
Set objFolder = Nothing
Set olApp = Nothing
'die Variable vNewest ist dann die neueste
'(jüngste) Email mit Attachemant
vNewest = CDate(WorksheetFunction.Max(.Range("B1:B" _
& .Cells(Rows.Count).End(xlUp).Row)))
MsgBox vNewest
End With
End Sub

Anzeige
AW: EMail Anhänge letzte Email speichern
09.09.2022 03:56:03
Andy
Hallo Jowe,
Vielen lieben Dank. Der Ansatz ist super und nachvollziehbar. Aber ich hätte gerne eine Lösung ohne eine Auflistung im Worksheet, da manche 300 emails und mehr in ihrem Postkorb haben und ich zusätzlich nicht ein weiteres Worksheet nur für diesen Zweck anlegen will. Gibts das ganze vielleicht auch mit einer anderen Lösung, zb einer Array Lösung (leider kenne ich mich damit nicht so aus)?
Lg Andy
AW: EMail Anhänge letzte Email speichern
09.09.2022 10:45:03
JoWE
Hallo Andy,
ich nahm an, dass Du Deiner (erwarteten) Frage via Google (Array und sortieren) selbst nachgehen würdest.
Aber suchen ist nicht so Deins, oder ? (nix für ungut).
Hier eine mögliche Idee:

   Sub findNewestMail()
Dim olApp As Object
Dim objFolder As Object
Dim objItem As Object
Set olApp = CreateObject("outlook.application")
Set objFolder = olApp.GetNamespace("MAPI").GetDefaultFolder(6)
Dim objSortedList As Object, objArrayList As Object
Set objSortedList = CreateObject("System.Collections.SortedList")
Set objArrayList = CreateObject("System.Collections.ArrayList")
Dim vNewest As Date
For Each objItem In objFolder.Items
If objItem.attachments.Count > 0 Then
If objItem.attachments.Count > 0 Then
objArrayList.Add objItem.ReceivedTime
End If
End If
Next
vNewest = objArrayList(0)
MsgBox "Zeit des jüngsten Mail-Eingangs: " & vbCr & vbCr & vbTab & vNewest
Set objSortedList = Nothing
Set objArrayList = Nothing
End Sub
Gruß
Jochen
Anzeige
AW: EMail Anhänge letzte Email speichern
09.09.2022 10:48:31
JoWE
ups, da ist was gedoppelt;
nicht schlimm aber überflüssig.
Korrektur:

   Sub findNewestMail()
Dim olApp As Object
Dim objFolder As Object
Dim objItem As Object
Set olApp = CreateObject("outlook.application")
Set objFolder = olApp.GetNamespace("MAPI").GetDefaultFolder(6)
Dim objSortedList As Object, objArrayList As Object
Set objSortedList = CreateObject("System.Collections.SortedList")
Set objArrayList = CreateObject("System.Collections.ArrayList")
Dim vNewest As Date
For Each objItem In objFolder.Items
If objItem.attachments.Count > 0 Then
objArrayList.Add objItem.ReceivedTime
End If
Next
vNewest = objArrayList(0)
MsgBox "Zeit des jüngsten Mail-Eingangs: " & vbCr & vbCr & vbTab & vNewest
Set objSortedList = Nothing
Set objArrayList = Nothing
End Sub

Anzeige
AW: EMail Anhänge letzte Email speichern
09.09.2022 11:45:57
Andy
Vielen lieben Dank für deine Hilfe,
mit der Suche habe ich es schon, habe auch schon einiges über Arrays gelesen, nur blick ich es einfach nicht im Detail.
Dein Code hat mir jetzt eine Email angezeigt, die allerdings eine der ältesten ist. Komischerweise ist sie auch nicht die älteste.
Muss das Array noch sortiert werden ?
Danke nochmal, Andy
AW: EMail Anhänge letzte Email speichern
09.09.2022 12:01:17
JoWE
hmm und so:

   Sub findNewestMail()
Dim olApp As Object
Dim objFolder As Object
Dim objItem As Object
Set olApp = CreateObject("outlook.application")
Set objFolder = olApp.GetNamespace("MAPI").GetDefaultFolder(6)
Dim objSortedList As Object, objArrayList As Object
Set objSortedList = CreateObject("System.Collections.SortedList")
Set objArrayList = CreateObject("System.Collections.ArrayList")
Dim vNewest As Date
For Each objItem In objFolder.Items
If objItem.attachments.Count > 0 Then
objArrayList.Add objItem.ReceivedTime
End If
Next
Call objArrayList.AddRange(c:=objSortedList.GetKeyList())
' nur zum Testen in eine vorhandene Tabelle "HT" ausgeben
'For ze = 0 To objArrayList.Count - 1
'  Sheets("HT").Range("A" & ze + 1) = objArrayList(ze)
'Next
'zu verwenden für die neueste Mail:
vNewest = objArrayList(0)
MsgBox "Zeit des jüngsten Mail-Eingangs: " & vbCr & vbCr & vbTab & vNewest
Set objSortedList = Nothing
Set objArrayList = Nothing
End Sub

Anzeige
AW: EMail Anhänge letzte Email speichern
09.09.2022 12:24:36
JoWE
ansonsten probiers mal so:

Sub TestSort()
Dim coll As New Collection
Dim olApp As Object
Dim objFolder As Object
Dim objItem As Object
Set olApp = CreateObject("outlook.application")
Set objFolder = olApp.GetNamespace("MAPI").GetDefaultFolder(6)
Dim objSortedList As Object, objArrayList As Object
Set objSortedList = CreateObject("System.Collections.SortedList")
Set objArrayList = CreateObject("System.Collections.ArrayList")
Dim vNewest As Date
For Each objItem In objFolder.Items
If objItem.attachments.Count > 0 Then
coll.Add objItem.ReceivedTime
End If
Next
QuickSort coll, 1, coll.Count
vNewest = coll(1)
'zur Überprüfung im Direktbereich ausgeben
'Dim v As Variant
'For Each v In coll
'    Debug.Print v
'Next
End Sub
Sub QuickSort(coll As Collection, first As Long, last As Long)
Dim vCentreVal As Variant, vTemp As Variant
Dim lTempLow As Long
Dim lTempHi As Long
lTempLow = first
lTempHi = last
vCentreVal = coll((first + last) \ 2)
Do While lTempLow  first
lTempHi = lTempHi - 1
Loop
If lTempLow 

Anzeige
AW: EMail Anhänge letzte Email speichern
09.09.2022 13:48:40
JoWE
und wenn's auch so nicht klappt, noch eine Idee:

Option Explicit
Sub Newest_and_oldest_Mail_with_Attachement()
Dim olApp As Object, objArrayList As Object, objFolder As Object, objItem As Object
Dim vNewest As Date, vOldest As Date
Dim temp As Date, i As Long, j As Long, ze As Long
Set olApp = CreateObject("outlook.application")
Set objFolder = olApp.GetNamespace("MAPI").GetDefaultFolder(6)
Set objArrayList = CreateObject("System.Collections.ArrayList")
'Emaileingänge mit Anhang in Array schreiben
For Each objItem In objFolder.Items
If objItem.attachments.Count > 0 Then
objArrayList.Add objItem.ReceivedTime
End If
Next
'Array sortieren
For i = objArrayList.Count To 0 Step -1
For j = i - 1 To 0 Step -1
If objArrayList(i - 1) > objArrayList(j) Then
temp = objArrayList(j)
objArrayList(j) = objArrayList(i - 1)
objArrayList(i - 1) = temp
End If
Next
Next
'Älteste und neueste Mail Eingangszeit ausgeben
vNewest = objArrayList(0)
vOldest = objArrayList(objArrayList.Count - 1)
MsgBox "Älteste Mail mit Anhang vom: " & vbTab & vOldest & vbCr & _
"Neueste Mail mit Anhang vom: " & vbTab & vNewest, vbInformation, "Älteste und Neueste Mail"
' nur zum Testen in eine vorhandene Tabelle "HT" ausgeben
'For ze = 0 To objArrayList.Count - 1
'  Sheets("HT").Range("A" & ze + 1) = objArrayList(ze)
'Next
Set objArrayList = Nothing
Set objFolder = Nothing
Set olApp = Nothing
End Sub

Anzeige
AW: EMail Anhänge letzte Email speichern
09.09.2022 20:04:45
Andy
Hey super, der letzte Vorschlag funktioniert bestens. Vielen lieben Dank, das hat mir schon sehr viel geholfen.
Ich habe jetzt die Anlagen aus dieser Email auslesen und abspeichern wollen und wollte dazu mit
"If CDate(objItem.ReceivedTime()) = vNewest Then"
die Email aufrufen. Leider verlässt er die IF-Schleife und kommt zu keiner Übereinstimmung zwischen obj. ReceivedTime und vnewest.
Woran könnte das liegen ? Beide Werte sind offensichtlich auch identisch.
AW: EMail Anhänge letzte Email speichern
09.09.2022 23:24:33
JoWE
hmm, bei mir klappt das so:

  For Each objItem In objFolder.Items
If objItem.ReceivedTime = vNewest Then
With objItem.attachments.Item(1)
If .Filename Like "*.txt" Then
.SaveAsFile "C:\Users\joche\Downloads\" & _
objItem.attachments.Item(1).Filename
End If
End With
End If
Next

Anzeige
AW: EMail Anhänge letzte Email speichern
10.09.2022 10:54:21
Andy
Ich habe jetzt beide Zeiten über in eine neue String variable am Ende umgeswitched. Dann geht es. Bei einer Date- variable streikt der if-Vergleich . Ob das der Weisheits letzter Schluss ist …
Vielleicht kann luschi dazu noch mal was sagen. Der hat mal bemängelt, dass ein cdate davor gehört und die variable vNewest als eine Date Variable deklariert werden muss.
Ich lass das Thema noch mal offen…
Danke trotzdem, so funktioniert es wenigstens mal vorerst.
AW: EMail Anhänge letzte Email speichern
10.09.2022 14:40:37
JoWE
ich hatte die Variablen vNewest und vOldest in meinem Code so dimensioniert:

 Sub Newest_and_oldest_Mail_with_Attachement()
Dim olApp As Object, objArrayList As Object, objFolder As Object, objItem As Object
Dim vNewest As Date, vOldest As Date
und in meinen Tests funktioniert dass einwandfrei.
Gruß
Jochen
Anzeige

156 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige