CLOSED: [2016-10-06 Thu 10:50] :PROPERTIES: :ID: 2016-10-06-outlook-preparation-appointment :CREATED: [2016-10-06 Thu 10:38] :END: :LOGBOOK: - State "DONE" from "NEXT" [2016-10-06 Thu 10:50] :END: When you're in a business environment, you most likely have to use Outlook for managing meetings. A common problem is that you've got a meeting scheduled with a couple of peers and you need some time extra. For example, you have to walk to a different building or you just want some preparation time, you need a time slot upfront and/or directly after the meeting. In order to avoid beeing booked for a different meeting which adjoins the other one, you need to manually create appointments before and/or after the meeting. The other option is that your calendar shows a free time where there isn't one. Unfortunately, people avoid this tedious task and therefore, this situation is common practice. I do have an elegant solution for this issue: an easy-to-reach button which adds appointment before and/or after a selected appointment. ------------------ To my great surprise, I found [[http://www.vboffice.net/en/developers/add-appointment-travel-times-to-calendar/][a ready-to use solution online]]. You just need to press ~Alt-F11~, paste the following script into your VBA-editor, and add a Quick Access Toolbar item to your Outlook. In case you need further help with the setup, please take a look at the screen-shots on my [[id:2016-01-21-keeping-unaccepted-outlook-appointments][blog entry where I describe how I keep appointments on my calendar without accepting or declining them]]. #+BEGIN_EXAMPLE Public Sub AddPreparationAndPostprocessingTime() Dim coll As VBA.Collection Dim obj As Object Dim Appt As Outlook.AppointmentItem Dim Travel As Outlook.AppointmentItem Dim Items As Outlook.Items Dim Before&, After& Dim Category$, Subject$ '1. Block minutes before and after the appointment Before = 15 After = 0 '2. Skip this if the default values never change Before = InputBox("Minutes before:", , Before) After = InputBox("Minutes after:", , After) If Before = 0 And After = 0 Then Exit Sub '3. Assign this category Category = "Gelbe Kategorie" Set coll = GetCurrentItems If coll.Count = 0 Then Exit Sub For Each obj In coll If TypeOf obj Is Outlook.AppointmentItem Then Set Appt = obj If TypeOf Appt.Parent Is Outlook.AppointmentItem Then Set Items = Appt.Parent.Parent.Items Else Set Items = Appt.Parent.Items End If '4. Use the main appointment's subject Subject = Appt.Subject If Before > 0 Then Set Travel = Items.Add Travel.Subject = "Preparation for: " + Subject Travel.Start = DateAdd("n", -Before, Appt.Start) Travel.Duration = Before Travel.Categories = Category Travel.Save End If If After > 0 Then Set Travel = Items.Add Travel.Subject = "Postprocessing: " + Subject Travel.Start = Appt.End Travel.Duration = After Travel.Categories = Category Travel.Save End If End If Next End Sub Private Function GetCurrentItems(Optional IsInspector As Boolean) As VBA.Collection Dim coll As VBA.Collection Dim Win As Object Dim Sel As Outlook.Selection Dim obj As Object Dim i& Set coll = New VBA.Collection Set Win = Application.ActiveWindow If TypeOf Win Is Outlook.Inspector Then IsInspector = True coll.Add Win.CurrentItem Else IsInspector = False Set Sel = Win.Selection If Not Sel Is Nothing Then For i = 1 To Sel.Count coll.Add Sel(i) Next End If End If Set GetCurrentItems = coll End Function #+END_EXAMPLE