Microsoft Outlook bietet nützliche Funktionen um eine Vertretung oder ein Sekretariat zu unterstützen.
Eine wichtige Funktion gibt es allerdings nicht, nämlich eine Information, wenn der Eigentümer eines Kalenders selber Einträge hinzufügt, ändert oder löscht.
Diese Informationen gehen komplett am Sekretariat vorbei und müssten manuell kommuniziert werden, da wir aber die Welt kennen, geht sowas natürlich häufig unter und das Terminchaos ist vorprogrammiert...
Damit das nicht passiert, habe ich eine Outlook VBA Erweiterung geschrieben, welche diese Funktionen nachrüstet.
Achtung, da ich eig. kein VBA-Entwickler bin, kann der Code wahrscheinlich noch besser sein, aber für den Anwendungsfall reicht es wohl..
Unterstützte Funktionen:
E-Mail Subject: Hinzugefügt: Kalendereintrag "Ein neuer Termin" von Skibbe, Oliver
E-Mail Inhalt:
Hinzugefügt: Kalendereintrag "Ein neuer Termin" von Skibbe, Oliver
Start: 10:30 am Mittwoch, 10. Juli 2013
Ende: 13:00 am Mittwoch, 10. Juli 2013
Status: Beschäftigt
Ort: Hannover
Inhalt: Besprechung mit XY zum Thema Z
Eine wichtige Funktion gibt es allerdings nicht, nämlich eine Information, wenn der Eigentümer eines Kalenders selber Einträge hinzufügt, ändert oder löscht.
Diese Informationen gehen komplett am Sekretariat vorbei und müssten manuell kommuniziert werden, da wir aber die Welt kennen, geht sowas natürlich häufig unter und das Terminchaos ist vorprogrammiert...
Damit das nicht passiert, habe ich eine Outlook VBA Erweiterung geschrieben, welche diese Funktionen nachrüstet.
Achtung, da ich eig. kein VBA-Entwickler bin, kann der Code wahrscheinlich noch besser sein, aber für den Anwendungsfall reicht es wohl..
Unterstützte Funktionen:
- Hinzufügen eines Eintrags
- Ändern eines Eintrags
- Löschen eines Eintrags
- Separate Anzeige für Ganztägige Termine
- Übersetzbar
- Automatisches Ausblenden des Betreff,Inhalt und Ort bei "Privat" Markierung
E-Mail Subject: Hinzugefügt: Kalendereintrag "Ein neuer Termin" von Skibbe, Oliver
E-Mail Inhalt:
Hinzugefügt: Kalendereintrag "Ein neuer Termin" von Skibbe, Oliver
Start: 10:30 am Mittwoch, 10. Juli 2013
Ende: 13:00 am Mittwoch, 10. Juli 2013
Status: Beschäftigt
Ort: Hannover
Inhalt: Besprechung mit XY zum Thema Z
Und hier der Code:
Der Code muss in den Visual-Basic Editor (Alt+F11) unter: Projekt1 -> Microsoft Office Outlook -> ThisOutlookSession beim Kalendereigentümer eingebunden werden.
Ich hoffe es hilft einigen Leuten, gerade der Part mit gelöschten Mails war etwas knifflig.
Bei Fragen zu dem Code kontaktiert mich bitte
Option Explicit ' This program is free software: you can redistribute it and/or modify ' it under the terms of the GNU General Public License as published by ' the Free Software Foundation, either version 3 of the License, or ' (at your option) any later version. ' ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY; without even the implied warranty of ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' GNU General Public License for more details. ' ' You should have received a copy of the GNU General Public License ' along with this program. If not, see <http://www.gnu.org/licenses/. ' ' Dieses Programm ist Freie Software: Sie können es unter den Bedingungen ' der GNU General Public License, wie von der Free Software Foundation, ' Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren ' veröffentlichten Version, weiterverbreiten und/oder modifizieren. ' ' Dieses Programm wird in der Hoffnung, dass es nützlich sein wird, aber ' OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite ' Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. ' Siehe die GNU General Public License für weitere Details. ' ' Sie sollten eine Kopie der GNU General Public License zusammen mit diesem ' Programm erhalten haben. Wenn nicht, siehe <http://www.gnu.org/licenses/ ' ' Author: Oliver Skibbe ( oliskibbe at gmail.com ) ' Date: 2013-07-09 ' Purpose: Send mail to a configurable person if an calendar event is created, modified or deleted ' Tested with: Outlook 2007 ' Hints: ' http://www.vbarchiv.net/commands/details.php?id=formatdatetime ' http://msdn.microsoft.com/en-us/library/office/bb208262%28v=office.12%29.aspx ' Changelog: ' 2013-07-01 Oliver Skibbe: first release ' 2013-07-02 Oliver Skibbe: added check if private item (clear text if it is), added busy state to Output ' 2013-07-02 Oliver Skibbe: added allday check Private WithEvents Items As Outlook.Items Private WithEvents Reminders As Outlook.Reminders Private WithEvents objCalFolder As Outlook.folder Dim objDelFolder As Outlook.folder ' Helper variables Public isDeletedBool As Boolean Public reminderOccuredBool As Boolean ' Mail stuff Public receiverStrg As String Public subjectStrg As String Public subjectPartStrg As String Public bodyStrg As String ' Appointment helper strings Public apptOrganizerStrg As String Public apptLocationStrg As String Public apptStartDateStrg As String Public apptEndDateStrg As String Public apptSubjectStrg As String Public apptBodyStrg As String Public apptBusyStateStrg As String Public apptSensitivityStrg As String ' Translation Public transAllDayEventStrg As String Public transPrivateItemStrg As String Public transAtStrg As String Public transOfStrg As String Public transAddedStrg As String Public transChangedStrg As String Public transDeletedStrg As String Public transAvailStateStrg As String Public transTentStateStrg As String Public transBusyStateStrg As String Public transOOOStateStrg As String Public transCalendarStrg As String Public transBodyStrg As String Public transStateStrg As String Public transLocationStrg As String Public transStartStrg As String Public transEndStrg As String ' subs Private Sub Application_Startup() ' Receiver receiverStrg = "change.me@example.org" ' translation...modify if needed transAllDayEventStrg = "Ganztägig" transPrivateItemStrg = "Privater Termin" transAtStrg = "am" transOfStrg = "von" transAddedStrg = "Hinzugefügt" transChangedStrg = "Geändert" transDeletedStrg = "Gelöscht" transAvailStateStrg = "Verfügbar" transTentStateStrg = "Mit Vorbehalt" transBusyStateStrg = "Beschäftigt" transOOOStateStrg = "Abwesend" transCalendarStrg = "Kalendereintrag" transBodyStrg = "Inhalt" transStateStrg = "Status" transLocationStrg = "Ort" transStartStrg = "Start" transEndStrg = "Ende" Dim Ns As Outlook.NameSpace Dim CalFolder As Outlook.MAPIFolder Set Reminders = Outlook.Application.Reminders ' default values .. isDeletedBool = False reminderOccuredBool = False Set Ns = Application.GetNamespace("MAPI") Set CalFolder = Ns.GetDefaultFolder(olFolderCalendar) ' Set Folder = CalFolder.Folders("Subfolder") Set Items = CalFolder.Items Set objCalFolder = Application.Session.GetDefaultFolder(olFolderCalendar) Set objDelFolder = Application.Session.GetDefaultFolder(olFolderDeletedItems) End Sub ' item add event Private Sub Items_ItemAdd(ByVal Item As Object) ' Objects Dim Appt As Outlook.AppointmentItem ' if meeting or appointment.. If TypeOf Item Is Outlook.AppointmentItem Or TypeOf Item Is Outlook.MeetingItem Then ' Appointment properties Set Appt = Item ' mail strings apptOrganizerStrg = Appt.Organizer ' AllDayEvent If Appt.AllDayEvent = True Then apptStartDateStrg = transAllDayEventStrg + ", " + FormatDateTime(Appt.Start, 1) ' we have to subtract one day to get a nice looking result apptEndDateStrg = transAllDayEventStrg + ", " + FormatDateTime(DateAdd("d", -1, Appt.End), 1) Else apptStartDateStrg = FormatDateTime(Appt.Start, 4) + " " + transAtStrg + " " + FormatDateTime(Appt.Start, 1) apptEndDateStrg = FormatDateTime(Appt.End, 4) + " " + transAtStrg + " " + FormatDateTime(Appt.End, 1) End If apptLocationStrg = Appt.Location apptBusyStateStrg = format(Appt.BusyStatus) apptSensitivityStrg = format(Appt.Sensitivity) apptBodyStrg = Appt.Body apptSubjectStrg = Appt.Subject subjectPartStrg = transAddedStrg ' send mail Call sendMail End If End Sub ' busy state mapping ' olBusy 2 The user is busy. ' olFree 0 The user is available. ' olOutOfOffice 3 The user is out of office. ' olTentative 1 The user has a tentative appointment scheduled. Private Sub busyState() Select Case apptBusyStateStrg Case Is = 0 apptBusyStateStrg = transAvailStateStrg Case Is = 1 apptBusyStateStrg = transTentStateStrg Case Is = 2 apptBusyStateStrg = transBusyStateStrg Case Is = 3 apptBusyStateStrg = transOOOStateStrg End Select End Sub ' check if an calendar item is about to be deleted Private Sub objCalFolder_BeforeItemMove(ByVal Item As Object, ByVal MoveTo As MAPIFolder, Cancel As Boolean) ' Objects Dim Appt As Outlook.AppointmentItem ' if meeting or appointment.. If TypeOf Item Is Outlook.AppointmentItem Or TypeOf Item Is Outlook.MeetingItem Then ' Appointment properties Set Appt = Item ' saving calendar values for later purposes apptOrganizerStrg = Appt.Organizer ' AllDayEvent If Appt.AllDayEvent = True Then apptStartDateStrg = transAllDayEventStrg + ", " + FormatDateTime(Appt.Start, 1) ' we have to subtract one day to get a nice looking result apptEndDateStrg = transAllDayEventStrg + ", " + FormatDateTime(DateAdd("d", -1, Appt.End), 1) Else apptStartDateStrg = FormatDateTime(Appt.Start, 4) + " " + transAtStrg + " " + FormatDateTime(Appt.Start, 1) apptEndDateStrg = FormatDateTime(Appt.End, 4) + " " + transAtStrg + " " + FormatDateTime(Appt.End, 1) End If apptLocationStrg = Appt.Location apptBusyStateStrg = format(Appt.BusyStatus) apptSensitivityStrg = format(Appt.Sensitivity) apptBodyStrg = Appt.Body apptSubjectStrg = Appt.Subject End If ' check if item is deleted If MoveTo Is Nothing Then isDeletedBool = True Call Items_ItemChange(Item) ElseIf MoveTo = objDelFolder Then isDeletedBool = True Call Items_ItemChange(Item) End If End Sub Private Sub Items_ItemChange(ByVal Item As Object) ' Objects Dim Appt As Outlook.AppointmentItem ' if meeting or appointment.. If TypeOf Item Is Outlook.AppointmentItem Or TypeOf Item Is Outlook.MeetingItem Then ' leave sub if just a reminder occured ( is set by: Sub Reminders_BeforeReminderShow ) If reminderOccuredBool = True Then Exit Sub End If Set Appt = Item ' is set by Sub objCalFolder_BeforeItemMove If isDeletedBool = False Then apptOrganizerStrg = Appt.Organizer ' AllDayEvent If Appt.AllDayEvent = True Then apptStartDateStrg = transAllDayEventStrg + ", " + FormatDateTime(Appt.Start, 1) ' we have to subtract one day to get a nice looking result apptEndDateStrg = transAllDayEventStrg + ", " + FormatDateTime(DateAdd("d", -1, Appt.End), 1) Else apptStartDateStrg = FormatDateTime(Appt.Start, 4) + " " + transAtStrg + " " + FormatDateTime(Appt.Start, 1) apptEndDateStrg = FormatDateTime(Appt.End, 4) + " " + transAtStrg + " " + FormatDateTime(Appt.End, 1) End If apptLocationStrg = Appt.Location apptSensitivityStrg = format(Appt.Sensitivity) apptBusyStateStrg = format(Appt.BusyStatus) apptBodyStrg = Appt.Body apptSubjectStrg = Appt.Subject subjectPartStrg = transChangedStrg Else ' part of subject subjectPartStrg = transDeletedStrg End If ' send mail Call sendMail End If End Sub ' Before reminder is shown, set variable to surpress ItemChange Private Sub Reminders_BeforeReminderShow(Cancel As Boolean) reminderOccuredBool = True End Sub ' finally prepare and send mail ' olConfidential 3 Confidential ' olNormal 0 Normal sensitivity ' olPersonal 1 Personal ' olPrivate 2 Private Private Sub sendMail() Dim OutApp As Object Dim OutMail As Object Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) ' default values for body and location string If LenB(apptBodyStrg) = 0 Or apptSensitivityStrg > 0 Then apptBodyStrg = "-" End If If LenB(apptLocationStrg) = 0 Or apptSensitivityStrg > 0 Then apptLocationStrg = "-" End If If LenB(apptSubjectStrg) = 0 Or apptSensitivityStrg > 0 Then apptSubjectStrg = "-" End If If apptSensitivityStrg > 0 Then subjectPartStrg = transPrivateItemStrg + ": " + subjectPartStrg End If ' busy State string mapping Call busyState ' Subject subjectStrg = subjectPartStrg + ": " + transCalendarStrg + " " + Chr(34) + apptSubjectStrg + Chr(34) + " " + transOfStrg + " " + apptOrganizerStrg ' Body bodyStrg = subjectPartStrg + ": " + transCalendarStrg + " " + Chr(34) + apptSubjectStrg + Chr(34) + " " + transOfStrg + " " + apptOrganizerStrg + vbCrLf _ + vbCrLf _ + transStartStrg + ": " + apptStartDateStrg + vbCrLf _ + transEndStrg + ": " + apptEndDateStrg + vbCrLf _ + transStateStrg + ": " + apptBusyStateStrg + vbCrLf _ + transLocationStrg + ": " + apptLocationStrg + vbCrLf _ + vbCrLf _ + transBodyStrg + ": " + apptBodyStrg With OutMail .To = receiverStrg .Subject = subjectStrg .Body = bodyStrg .Display .Send End With End Sub
Der Code muss in den Visual-Basic Editor (Alt+F11) unter: Projekt1 -> Microsoft Office Outlook -> ThisOutlookSession beim Kalendereigentümer eingebunden werden.
Ich hoffe es hilft einigen Leuten, gerade der Part mit gelöschten Mails war etwas knifflig.
Bei Fragen zu dem Code kontaktiert mich bitte
Keine Kommentare:
Kommentar veröffentlichen