armin-k
Goto Top

Mit Excel einen Termin in Outlook erzeugen

Liebes Forum,

leider finde ich trotz zahlreicher vielversprechender Ansätze hier im Forum keine funktionierende Lösung. Folgende Aufgabenstellung:

Ich möchte mit einem Makro aus Excel in einen zu bestimmenden Kalender (es sind zwei Exchange-Konten verfügbar) Termine exportieren. Die Excel Tabelle hätte folgenden Aufbau (siehe Bild). Ich hatte ursprünglich die Idee des Export in eine *.csv-Datei, scheitere aber auch dort mit den unterschiedlichen Formaten. Die Makrolösung wäre sicher am elegantesten...

Könnte mir jemand weiterhelfen bitte....


Windows 8.1
Office 2013


[[i
7a208a44b217dedf685e06d9d65a4094



9d39a106211dfd31a12dd2df5b531d62

Content-Key: 230045

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

Printed on: April 16, 2024 at 08:04 o'clock

Member: colinardo
colinardo Feb 15, 2014, updated at Sep 08, 2015 at 21:05:56 (UTC)
Goto Top
Hallo Armin-K,
das ist kein Problem. Der folgende Code ist an deine abgebildete Tabelle angepasst. Er erstellt für alle Zeilen der Tabelle die entsprechenden Termine. Was angepasst werden muss ist zum einen in Zeile 6 das Worksheet auf dem sich deine Tabelle befindet und zum anderen der Verweis zum entsprechendem Kalender in Zeile 5. In der jetztigen Ausführung werden die Termine im Standardkalender abgelegt. Hierzu ist folgendes zu Erläutern:
Wenn dein Kalender z.B. im Exchange-Store mit dem Namen armin@domain.de vom Root ausgesehen in einem Unterordner namens Dienstkalender liegt muss die Zeile 5 des Scriptes so lauten:
Set objCal = objOL.Session.Stores.Item("armin@domain.de").GetRootFolder.Folders.Item("Dienstkalender")
liegt dein Kalender als Unterordner im Standardkalenderordner dann lautet diese Zeile so:
Set objCal = objOL.Session.Stores.Item("armin@domain.de").GetDefaultFolder(9).Folders.Item("Dienstkalender")
Für die Kategorien sollte in deiner Tabelle nicht die Farbe, sondern der richtige Name der Kategorie verwendet werden.
Sub createAppointments()
    On Error Resume Next
    Dim sheet As Worksheet, rngStart As Range, rngEnd As Range, cell As Range
    Set objOL = CreateObject("Outlook.Application")  
    Set objCal = objOL.Session.GetDefaultFolder(9)
    Set sheet = Worksheets(1)
    Set rngStart = sheet.Range("A2")  
    Set rngEnd = rngStart.End(xlDown)
    counter = 0
    For Each cell In sheet.Range(rngStart, rngEnd)
        Set olApp = objCal.Items.Add(1)
        With olApp
            strSubject = cell.Text
            strStartDate = cell.Offset(0, 1).Text
            strStartTime = cell.Offset(0, 2).Text
            strEndDate = cell.Offset(0, 3).Text
            strEndTime = cell.Offset(0, 4).Text
            boolAllDay = cell.Offset(0, 5).Value
            strCategory = cell.Offset(0, 6).Text
            .Subject = strSubject
            .ReminderSet = False
            If strCategory <> "" Then  
                .Categories = strCategory
            End If
            If boolAllDay = True Then
                .AllDayEvent = True
                If IsDate(strStartDate) Then
                    .Start = DateValue(strStartDate)
                    .End = DateAdd("d", 1, DateValue(strStartDate))  
                    .Save
                    counter = counter + 1
                Else
                    MsgBox "Termin mit dem Betreff: '" & strSubject & "' in Zeile " & cell.Row & " hat ungültige oder fehlende Zeitangaben", vbExclamation  
                End If
            Else
                .AllDayEvent = False
                If IsDate(strStartDate) And IsDate(strEndDate) And IsDate(strStartTime) And IsDate(strEndTime) Then
                    .Start = DateValue(strStartDate) & " " & TimeValue(strStartTime)  
                    .End = DateValue(strEndDate) & " " & TimeValue(strEndTime)  
                    .Save
                    counter = counter + 1
                Else
                    MsgBox "Termin mit dem Betreff: '" & strSubject & "' in Zeile " & cell.Row & " hat ungültige oder fehlende Zeitangaben", vbExclamation  
                End If
            End If
        End With
    Next
    Set objOL = Nothing
    MsgBox counter & " Termin(e) wurden erstellt!", vbInformation  
End Sub
Hierzu auch noch das Demo-Sheet dazu.
Denke das sollte dich deinem Ziel näher bringen...

Grüße Uwe
Member: Armin-K
Armin-K Feb 15, 2014 updated at 16:24:39 (UTC)
Goto Top
Hallo Uwe,

vielen Dank für Deine Mühe, es ist fast alles genauso passiert - wie ich es mir gewünscht hätte. Getestet habe ich das mit den Standardpostfach - PERFEKT ! Allerdings habe ich noch eine klitzekleine "Anpassungsbaustelle" bemerkt - Vielleicht hast Du da auch noch eine tolle Idee?

- Die zeitgebunden Termine (1:00 - 2:00 Uhr)werden perfekt verarbeitet.
- Die ganztägigen Termin werden mit den Zeiten (0:00-0:00) verarbeitet, ist grundsätzlich nicht so schlimm, hätte aber in der Outlook-Ansicht eine Wirkung.
Da wird das Objekt nämlich über der Uhrzeitliste eingeblendet. Genau das wäre wichtig. Gibt es dafür eine Lösung - oder könnte man das mit einem
zweiten oder geänderten Makro übernehmen? Vielleicht liegt ja der Mangel auch in der Excel-Tabelle, vielleicht wird das Tagesattribut nicht verarbeitet ??

Ich versuch's auch noch mal mit einem Screenshot - und ganz lieben Dank noch mal für Ergebnis bis hierher !!!!!

SORRY - eine Sache könnte man vielleicht auch noch abstellen (?) Beim Erzeugen der Outlook Objekte wird wohl auch ein Attribut "Erinnern" mitgegeben, kann man das ausstellen??

Ich habe schon wirklich ein ziemlich schlechtes Gewissen....
Member: colinardo
Solution colinardo Feb 15, 2014 updated at 17:26:27 (UTC)
Goto Top
Zitat von @Armin-K:
Ich habe schon wirklich ein ziemlich schlechtes Gewissen....
kein Problem ist nur eine Fingerübung face-smile, alle Wünsche sind oben im Code korrigiert und umgesetzt. Das mit dem "AllDayEvent" hatte ich nicht nachgeprüft, sorry - dazu musste man das Enddatum auf den Folgetag 12:00 AM setzen, dann kommt der Termin richtiger weise in den oberen Bereich.

Viel Erfolg
Grüße Uwe
Member: Armin-K
Armin-K Feb 15, 2014 at 17:31:40 (UTC)
Goto Top
Hallo Uwe,

das Ergebnis ist einfach nur P E R F E K T !

Ich habe das zwar noch nicht mit den Exchange-Postfächern testen können - aber ganz sicher ist das auch funktional. Nochmals vielen Dank für die Mühe und so schnelle Umsetzung, wenn Du wüsstest was das bisher schon an Zeit und Probieren gekostet hat. Allerdings bringt mich Dein Hinweis auf "Fingerübung" schon nahe an eine depressive Phase - ich werde denn mal weiter "trainieren!

Viele liebe Grüße auch noch aus der Lüneburger Heide.

LG Armin
Member: Ralfrun
Ralfrun Aug 30, 2015 at 13:12:45 (UTC)
Goto Top
Hallo Uwe

Vielen Dank für das super Makro. Ich brauche nur noch zwei Kleinigkeiten. Wie stelle ich es ein, dass doppelte Einträge ersetzt werden und kann ich noch eine Bemerkung zu dem jeweiligen Termin erstellen.

Vielen Dank und Gruß nach Roetgen.
Ralf
Member: colinardo
colinardo Aug 31, 2015, updated at Apr 10, 2019 at 14:46:25 (UTC)
Goto Top
Hallo Ralf, Willkommen auf Administrator.de!
Danke für deine Anfrage. Normalerweise sollten alte Threads im Interesse des TOs nicht aufgewärmt, sondern eine neue Frage erstellt oder via PM angefragt werden. Das nur nebenbei, aber ich mach da mal eine Ausnahme weil du hier neu bist face-wink
Zitat von @Ralfrun:
Vielen Dank für das super Makro. Ich brauche nur noch zwei Kleinigkeiten. Wie stelle ich es ein, dass doppelte Einträge ersetzt werden und kann ich noch eine Bemerkung zu dem jeweiligen Termin erstellen.

Kein Problem, wenn du eine weitere Spalte für den Kommentar in dem Dokument hinten dran setzt dann kannst du das mit folgendem Code realisieren. Bevor der Termin neu erstellt wird überprüft das Skript ob in dem angegebenen Zeitraum ein Termin mit gleicher Start und Endzeit, und gleichem Subject existiert. Passt ein Termin auf diese Kriterien werden seine Eigenschaften nur angepasst anstatt ein neuer Termin erstellt.
-edit- Für diejenigen die alle Eigenschaften ändern möchten ohne das ein Duplikat erstellt wird sollten sich das Demo-Sheet

back-to-topim letzten meiner Kommentar dieses Threads herunterladen

Sub createAppointments()
    On Error Resume Next
    Dim sheet As Worksheet, rngStart As Range, rngEnd As Range, cell As Range
    Set objOL = CreateObject("Outlook.Application")  
    Set objCal = objOL.Session.GetDefaultFolder(9)
    Set sheet = Worksheets(1)
    Set rngStart = sheet.Range("A2")  
    Set rngEnd = rngStart.End(xlDown)
    counter = 0
    For Each cell In sheet.Range(rngStart, rngEnd)
        strSubject = cell.Text
        strStartDate = cell.Offset(0, 1).Text
        strStartTime = cell.Offset(0, 2).Text
        strEndDate = cell.Offset(0, 3).Text
        strEndTime = cell.Offset(0, 4).Text
        boolAllDay = cell.Offset(0, 5).Value
        strCategory = cell.Offset(0, 6).Text
        strComment = cell.Offset(0, 7).Text
        
        'Eventuelles Duplikat des Termins finden ---------  
        Set allItems = objCal.items
        allItems.Sort "[Start]"  
        ' Ganztagestermin oder normaler Termin unterscheiden  
        If boolAllDay = True Then
            ' Filtere Termine nach Ganztagesevents zu dieser Zeit und dem Betreff  
            Set dupe_item = allItems.Restrict("[Start]=""" & Format(strStartDate, "ddddd hh:nn") & """ AND [END]= """ & Format(DateAdd("d", 1, DateValue(strEndDate)), "ddddd hh:nn") & """ AND [Subject] = '" & strSubject & "' AND [AllDayEvent] = True")  
        Else
            ' Filtere normale Termine zu dieser Zeit und dem Betreff  
            Set dupe_item = allItems.Restrict("[Start]=""" & Format(strStartDate & " " & strStartTime, "ddddd hh:nn") & """ AND [END]= """ & Format(strEndDate & " " & strEndTime, "ddddd hh:nn") & """ AND [Subject] = '" & strSubject & "' AND [AllDayEvent] = False")  
        End If
        ' hole den ersten passenden Termin wenn er exisitiert  
        Set itm = dupe_item.GetFirst

        If itm Is Nothing Then
            ' erstelle neuen Termin wenn kein Duplikat exisitert  
            Set olApp = objCal.items.Add(1)
        Else
            ' verwende den gefundenen Termin  
            Set olApp = itm
        End If
        '--------------------------  
        
        With olApp   
            .Subject = strSubject
            .ReminderSet = False
            If strCategory <> "" Then  
                .Categories = strCategory
            End If
            .Body = strComment
            If boolAllDay = True Then
                .AllDayEvent = True
                If IsDate(strStartDate) Then
                    .Start = DateValue(strStartDate)
                    .End = DateAdd("d", 1, DateValue(strStartDate))  
                    .Save
                    counter = counter + 1
                Else
                    MsgBox "Termin mit dem Betreff: '" & strSubject & "' in Zeile " & cell.Row & " hat ungültige oder fehlende Zeitangaben", vbExclamation  
                End If
            Else
                .AllDayEvent = False
                If IsDate(strStartDate) And IsDate(strEndDate) And IsDate(strStartTime) And IsDate(strEndTime) Then
                    .Start = DateValue(strStartDate) & " " & TimeValue(strStartTime)  
                    .End = DateValue(strEndDate) & " " & TimeValue(strEndTime)  
                    .Save
                    counter = counter + 1
                Else
                    MsgBox "Termin mit dem Betreff: '" & strSubject & "' in Zeile " & cell.Row & " hat ungültige oder fehlende Zeitangaben", vbExclamation  
                End If
            End If
        End With
        set olApp = Nothing
    Next
    Set objOL = Nothing
    MsgBox counter & " Termin(e) wurden erstellt!", vbInformation  
End Sub
Grüße Uwe
Member: Ralfrun
Ralfrun Aug 31, 2015 at 13:33:16 (UTC)
Goto Top
Hallo Uwe

Entschuldige das Aufwärmen. Vielen Dank für die schnelle Antwort.
Leider schreibt er auch weiterhin neu Termine in den Kalender und die Bemerkung wird auch nicht übertragen.
Zeile 05 gibt einen SyntaxFehler!
Ich habe
Set objCal = Set objCal = objOL.Session.GetDefaultFolder(9) ersetzt durch
Set objCal = objOL.Session.GetDefaultFolder(9)

Kannst du es mal testen?
Gruss
Ralf
Member: colinardo
colinardo Aug 31, 2015 updated at 16:43:15 (UTC)
Goto Top
Zitat von @Ralfrun:
Leider schreibt er auch weiterhin neu Termine in den Kalender und die Bemerkung wird auch nicht übertragen.
Zeile 05 gibt einen SyntaxFehler!
Ich habe
Set objCal = Set objCal = objOL.Session.GetDefaultFolder(9) ersetzt durch
Set objCal = objOL.Session.GetDefaultFolder(9)
Das war ein Copy n' paste Fehler in den Beitrag, habe ich oben korrigiert
Kannst du es mal testen?
Habe ich natürlich beides vor dem Posten ohne Probleme auf einem System mit deutschen Datumsangaben getestet!
Du hast sicher die zusätzliche Spalte für das Kommentar hinter der Kategoriespalte vergessen.

Weitere Postings dann bitte via PM, Merci.
Member: Neuwieder
Neuwieder Sep 08, 2015 at 18:05:38 (UTC)
Goto Top
Hallo,
KLASSE makro. Funktioniert einwandfrei.
Im ersten Beitrag steht was über den zu nutzenden Kalender. Nach meiner Standardinstallation habe ich einen persönlichen Kalender sowie einen mit meiner Mailadresse. Das Makro legt den Eintrag in den persönlichen Kalender. Wie stelle ich es um das in den Kalender mit der Mailadresse der Eintrag erfolgt ??

Gruß Marcus
Member: colinardo
colinardo Sep 08, 2015 updated at 21:18:45 (UTC)
Goto Top
Das Makro legt den Eintrag in den persönlichen Kalender. Wie stelle ich es um das in den Kalender mit der Mailadresse der Eintrag erfolgt ??
Hallo Marcus,
wenn du damit meinst das dein Kalender als Default-Kalender in einem anderen Outlook Store liegt macht man das folgendermaßen
set objCal = objOL.Session.Stores.Item("user@domain.de").getDefaultFolder(9)  
Wenn es nur ein extra Kalender im "selben Store" ist der auf der obersten Ebene im Store liegt so:
set objCal = objOL.Session.Stores.Item("Name des Stores").GetRootFolder.Folders.Item("user@domain.de")  

steht aber auch schon in meinem ersten Kommentar ...

Aber deine Aussage ist leider zu unpräzise um dir genau das passende zu liefern.

Ein kurzer Screenshot der Ordneransicht(wichtig, nicht die Kalenderansicht!) vereinfacht das ganze erheblich.

Grüße Uwe
Member: Neuwieder
Neuwieder Sep 09, 2015 at 16:23:12 (UTC)
Goto Top
Hallo,
die erste Codezeile hat direkt den richtigen Effekt erzielt. Danke dafür.......
Beim ganzen rumprobieren ist mir aufgefallen das die Einträge ohne Ort erfolgen.
In anderen Threads zum Thema bin ich dann auf das Stichwort "Location" gestossen welches in den Codes eingebaut war. Leider jedoch immer in Einzelzeilen und dann für mich nicht mehr umsetzbar in diesen Code.
Kannst du evtl. eine Ortsangabe implementieren ??

Danke schonmal für deine Mühen vorab.
Gruß Marcus
Member: colinardo
colinardo Sep 09, 2015 updated at 16:33:53 (UTC)
Goto Top
Ganz einfach eine neue Spalte am Ende für den Ort hinzufügen und dann nach Zeile 20 des ersten Skriptes noch folgendes hinzufügen:
.Location = cell.Offset(0,7).Value
fertig.

p.s. bitte keine weiteren Posts in diesem Thread damit der TO hier nicht weiter belästigt wird. Entweder eine neue Frage erstellen oder mich via PM kontaktieren. Danke.

Grüße Uwe
Member: QMB-JMD
QMB-JMD Nov 10, 2016 at 06:06:38 (UTC)
Goto Top
Hallo colinardo,
ich habe diesen älteren Beitrag gelesen und den Code mit Erfolg in eine Excel-Datei womit Urlaubsscheine erstellt werden einbauen können. Habe einen separaten Urlaubsplanung Kalender in Outlook 2007 angelegt, hier werden auch dann alle Termine eingetragen. Diesen Kalender habe ich nun für andere Mitarbeiter freigegeben, so dass diese die den auch mitbenutzen können bzw. sollen.
Nun zu meinem Problem, die Excel-Datei liegt in einem Freigegebenen Laufwerk auf unseren Server.
Also jeder berechtigte Benutzer kann, soll diese Datei zum erstellen von Urlausscheinen nutzen. Nun benötige ich eine Änderung des Codes, sodass die anderen Mitarbeiter die Termine auch in den bei mir befindlichen Urlaubsplanung – Kalender einfügen können.

Hoffe ich habe mich verständlich genug ausgedrückt, und du hast mich verstanden.
VG
QMB-JMD

Hier mal mein verwendeter Code

Sub Outlook()
On Error Resume Next
Dim sheet As Worksheet, rngStart As Range, rngEnd As Range, cell As Range
Set objOL = CreateObject("Outlook.Application")
Set objCal = objOL.Session.GetDefaultFolder(9).Folders("Urlaubsplanung")
Set sheet = Worksheets(4)
Set rngStart = sheet.Range("A1")
Set rngEnd = rngStart.End(xlDown)
counter = 0
For Each cell In sheet.Range(rngStart, rngEnd)
strSubject = cell.Text
strStartDate = cell.Offset(0, 1).Text
strStartTime = cell.Offset(0, 2).Text
strEndDate = cell.Offset(0, 3).Text
strEndTime = cell.Offset(0, 4).Text
strCategory = cell.Offset(0, 7).Text
strComment = cell.Offset(0, 6).Text

'Eventuelles Duplikat des Termins finden ---------
Dim dupe_item As Object, itm As Object
If boolAllDay Then
Set dupe_item = objCal.items.Restrict("[Start] = """ & Format(strStartDate, "ddddd") & " 12:00 AM"" AND [END] = """ & Format(DateAdd("d", 1, DateValue(strEndDate)), "ddddd") & " 12:00 AM"" AND [Subject] = '" & strSubject & "'")
Else
Set dupe_item = objCal.items.Restrict("[Start] = """ & Format(strStartDate & " " & strStartTime, "ddddd h:nn AMPM") & """ AND [END] = """ & Format(strEndDate & " " & strEndTime, "ddddd h:nn AMPM") & """ AND [Subject] = '" & strSubject & "'")
End If
Set itm = dupe_item.GetFirst
Set olApp = IIf(itm Is Nothing, objCal.items.Add(1), itm)
'--------------------------

With olApp

.Subject = strSubject
.ReminderSet = False
If strCategory <> "" Then
.Categories = strCategory
End If
.Body = strComment
If boolAllDay = True Then
.AllDayEvent = True
If IsDate(strStartDate) Then
.Start = DateValue(strStartDate)
.End = DateAdd("d", 1, DateValue(strStartDate))
.Save
counter = counter + 1
Else
MsgBox "Termin mit dem Betreff: '" & strSubject & "' in Zeile " & cell.Row & " hat ungültige oder fehlende Zeitangaben", vbExclamation
End If
Else
.AllDayEvent = False
If IsDate(strStartDate) And IsDate(strEndDate) And IsDate(strStartTime) And IsDate(strEndTime) Then
.Start = DateValue(strStartDate) & " " & TimeValue(strStartTime)
.End = DateValue(strEndDate) & " " & TimeValue(strEndTime)
.Save
counter = counter + 1
Else
'MsgBox "Termin mit dem Betreff: '" & strSubject & "' in Zeile " & cell.Row & " hat ungültige oder fehlende Zeitangaben", vbExclamation
End If
End If
End With
Next
Set objOL = Nothing
MsgBox counter & " Termin(e) wurden erstellt!", vbInformation
Dim ZeilenLoeschen()
sheet.Rows("2:20").Delete
End Sub
Member: colinardo
colinardo Jul 12, 2018, updated at Sep 17, 2020 at 11:49:58 (UTC)
Goto Top
Da hier immer öfter mal persönliche Anfragen bezüglich dieses Threads kamen habe ich ein zusätzliches Demo-Sheet erstellt das Duplikate auch verhindert wenn man, egal welches Detail des Termins im Excel Sheet ändert (Zeit, Betreff, etc.), weiterhin eine korrekte Zuordnung gegeben ist indem zu jedem Termin die EntryID in Outlook im Excel-Sheet gespeichert wird. Zudem lassen sich in der Spalte "Termin löschen" vorhandene Termine auch wieder aus dem Kalender löschen.
Damit auch keine Fragen mehr zum Thema "Wie kann ich den und den Kalender verwenden ..." kommen ist dort zudem eine Funktion zum Auswählen des Kalenders per Dialog-Picker integriert.

Download gibt's hier:

back-to-topCreateAppointments_230045_3.xlsm


screenshot

Grüße Uwe
Member: BobbyBlitz
BobbyBlitz Oct 10, 2018 at 09:46:57 (UTC)
Goto Top
Hi colinardo,

dein Demo Sheet ist wirklich großartig.
Vielen Dank!