habe die funktion angepasst und sie läuft einwandfrei. nur noch eine kurze frage: besteht die möglichkeit, dass outlook statt für jedes projekt eine einzelne email zu öffnen, die jeweiligen projektnamen entsprechend der zuständigen sales mitarbeiter in eine einzige email verpackt.
in Outlook nicht. Excel liefert ja die Daten und löst den email-Versand aus. Im Moment wird dazu jede einzelne Zeile geprüft und ggf. Outlook gestartet und die email erzeugt. Man müsste also erst mal alle Daten sammeln und dann die "Sammlung" versenden.
Du möchtest da pro Mitarbeiter (= sales member ?) eine email, wenn ich es richtig verstanden habe?
In Deinem Beispiel gab es den member 1 und 3 je 2x, allerdings war bei beiden nur je 1x submitted. Es würde also bei je einer email mit dem Inhalt für das jeweilige "submitted" - Projekt bleiben.
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
gibt es denn die möglichkeit, dass outlook die email sofort automatisch versendet, ohne dass immer ein "neue email" fenster geöffnet wird und jede einzelne email manuell abgesendet werden muss?
das mit dem Absenden geht eigentlich nicht. Ich glaube, spätestens seit Office 2007, eventuell aber schon eher, hat Microsoft das unterbunden, damit das nicht zum "programmierten" Spamversand mißbraucht werden kann. Um den "Rest" kümmer ich mich später, bin jetzt erst mal etwas offline
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
30.10.2014, 21:08 (Dieser Beitrag wurde zuletzt bearbeitet: 30.10.2014, 21:09 von schauan.)
Hallo,
der code ist jetzt um einiges komplizierter geworden. Für die Zusammenfassung der Meldungen nutze ich jetzt zwei Collections. In die Collection der members werden Collections mit den jeweiligen Einträgen eingefügt. Die emails werden dann mit den Daten der Collections gefüllt. Würde man nur die Zeilennummern übernehmen, müsste man die Daten aus der Tabelle holen. Würde aber auch gehen. In meinem Test hatte ich nur einen passenden Member mit 2 Einträgen Für das email. Ich hoffe, es klappt auch mit mehreren
Code:
Option Explicit
' Verweis auf "Microsoft Outlook xxx Object Library" ' schauan ' Programmiert fuer Clever-Excel-Forum 2014 Sub SendInfoMail() 'Variablendekalrationen Dim olApp As Outlook.Application Dim objMail As Outlook.MailItem Dim colMembers As Collection Dim colSubmit As Collection Dim iCnt1%, iCnt2% Dim strSubject As String, strBody As String 'Daten sammeln 'Colection mit Members Set colMembers = New Collection 'Bei Fehler mit naechster Anweisung weiter On Error Resume Next 'Schleife ueber alle Eintragungen For iCnt1 = 2 To Sheets("Tabelle1").Cells(Rows.Count, 2).End(xlUp).Row 'Wenn Datum aelter als 183 Tage und Status submitted, dann If Sheets("Tabelle1").Cells(iCnt1, 2).Value < Date - 183 And _ Sheets("Tabelle1").Cells(iCnt1, 4).Value = "submitted" Then Set colSubmit = New Collection 'Erzeugen einer Collection mit Projekt;Datum;Member;Zeilennummer 'Innere Schleife ueber alle Eintraege For iCnt2 = 2 To Sheets("Tabelle1").Cells(Rows.Count, 2).End(xlUp).Row 'Wenn der Member der inneren Schleife dem der aeusseren entspricht, dann If Cells(iCnt2, 3) = Cells(iCnt1, 3) Then 'Wenn Datum aelter als 183 Tage und Status submitted, dann If Sheets("Tabelle1").Cells(iCnt2, 2).Value < Date - 183 And _ Sheets("Tabelle1").Cells(iCnt2, 4).Value = "submitted" Then 'submit-colection fuellen colSubmit.Add Cells(iCnt2, 1).Value & ";" & Cells(iCnt2, 2).Value & ";" & Cells(iCnt2, 3).Value & ";" & iCnt2, Cells(iCnt2, 1) & "sm" 'Ende Wenn Datum aelter als 183 Tage und Status submitted, dann End If 'Ende Wenn der Member der inneren Schleife dem der aeusseren entspricht, dann End If 'Ende Innere Schleife ueber alle Eintraege Next 'member-colection colMembers.Add colSubmit, Cells(iCnt1, 3) & "sm" 'Ende Wenn Datum aelter als 183 Tage und Status submitted, dann End If 'Ende Schleife ueber alle Eintragungen Next 'Fehlerbehandlung zuruecksetzen On Error GoTo 0 'Outlook-Anwendungsobjekt setzen Set olApp = Outlook.Application
'Schleife bis zur letzten gefuellten Zelle der Spalte B For iCnt1 = 1 To colMembers.Count 'Subjektstring und Bodystring zuruecksetzen strSubject = "": strBody = "" 'email-Objekt setzen Set objMail = olApp.CreateItem(olMailItem) 'mit dem email With objMail 'an, gesucht auf Tabelle contacts aus dem 1. Eintrag der Subject-Collection des Members .To = Sheets("contacts").Cells(Sheets("contacts").Columns(1).Find(Split(colMembers(iCnt1)(1), ";")(2)).Row, 2).Value 'variablen Teil von Betreff und Body String zusammensetzen 'Schleife ueber alle gesammelten Eintraege eines Members For iCnt2 = 1 To colMembers(iCnt1).Count 'Betreffstring zusammensetzen aus Projektnamen strSubject = strSubject & Split(colMembers(iCnt1)(iCnt2), ";")(0) & ", " 'Bodystring aus Projekt und Datum zusammensetzen, mit Zeilenwechsel strBody = strBody & "Projekt: " & Split(colMembers(iCnt1)(iCnt2), ";")(0) & _ " Termin: " & Split(colMembers(iCnt1)(iCnt2), ";")(1) & vbLf 'Ende Schleife ueber alle gesammelten Eintraege eines Members Next .Subject = "Es wird Zeit ... Projekt: " & strSubject 'Textkoerper .Body = "Der Termin ist schon über 6 Monate ueberschritten. " & vbLf & strBody & "Mit freundlichen Grüßen" 'email anzeigen .Display 'Ende mit dem email End With 'email-Objekt zuruecksetzen Set objMail = Nothing 'Ende Schleife bis zur letzten gefuellten Zelle der Spalte B Next 'Outlook-Objekt zuruecksetzen Set olApp = Nothing End Sub
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
das makro läuft soweit super.. habe allerdings noch zwei fragen. habe die mappe mit einer neuen spalte (sales assistant) aktualisiert. können wir die noch als email empfänger in das makro integrieren und ist es möglich statt den tagen ( date - 180 days ) ein genaues datum anzugeben bsp. vor dem 01.04.2014?
Cc wir analog dem To programmiert, nur dann eben eine andere Spalte genommen. Ich hab hier mal eine 3, 6 und 4 geschrieben - Deine Excel-Mappe hier ist wahrscheinlich nicht wie die "richtige" aufgebaut. Die Blattnamen gibt es schon mal nicht Du musst also mal durchzählen, ob die Spalten stimmen.