Nachdem ich nun gezeigt habe, wie man einfach Termine in Outlook auslesen kann, ist der nächste Schritt, das Löschen eines bestehenden Termins.

Der eindeutige Identifier in Outlook ist immer die EntryID. leider ist es nicht möglich einen Termin direkt anzusprechen – wie zum Beispiel bei einer WHERE-Bedingung. Daher muss man genau wie beim Auslesen der Termine, den kompletten Kalender durchlaufen und prüfen, ob eine EntryID mit der des gewünschten Termins übereinstimmt.

Private Sub Outlook_Kalender_Löschen(EntryID as string)

‘Da diese Funktion je nach Anzahl der Termine in Outlook etwas dauern kann, wird die Maus aktiv auf Sanduhr umgeschaltet.

DoCmd.Hourglass False

‘Definition der benötigten Variablen

Dim Folder As String
Dim Foldername As String

‘Definition des Outlookkalenders der ausgelesen werden soll.Siehe auch “Outlook Termine auslesen”

Folder = “iCloud”
Foldername = “Kalender”

‘Objektdefinition Outlook

Dim f As Object ‘MAPIFolder
Dim olAppt As Object ‘AppointmentItem
Dim OutApp As Object
Set OutApp = CreateObject(“Outlook.Application”)
Set f = OutApp.GetNamespace(“MAPI”).Session.Folders(Folder).Folders(Foldername)
Set olAppt = f.Items.Add() ‘olAppointmentItem

‘Durchlaufen aller Outlooktermine im Kalender

For Each olAppt In f.Items

‘Wenn beim Durchlaufen der Schleife der gewünschte Termin gefunden wurde, dann kann der Eintrag gelöscht werden

If EntryID = olAppt.EntryID Then

olAppt.Delete
MsgBox (“Termin in Ourlook gelöscht.”)
End If

Next olAppt

Der normale Mauszeiger wird bei Beendigung wieder angezeigt

DoCmd.Hourglass False

End Sub

Viel Spaß beim Ausprobieren.

Euer Christian

3 Kommentare

  1. Frank Schumacher

    Hallo Christian,

    Endlich mal einer der das auch vernünftig erklärt, was er macht. Aber wie mache ich das, wenn ich in einer ACCESS Tabelle alle Termine habe, und alle Outlooktermine löschen möchte, die keine passende EntryID aufweist. Das heißt, ich habe eine Tabelle in Access, mit dem Namen tblTermine. Aus dieser werden die Termine nach Outlook exportiert. Das importieren aus Outlook funktioniert auch. Das Feld TerminID ist also nach dem Im- bzw. Exportieren identisch. Wenn ich jetzt einen Termin in der Access Tabelle lösche, soll auf Knopfdruck auch der verwaiste Termin im Outlookkalender gelöscht werden. Hast du da eventuell eine Lösung für mich?

    Viele Grüße
    Frank

    Antworten

    • Hallo Frank,

      Dafür genau habe ich ja die Routine Outlook_Kalender_Löschen(EntryID as string) beschrieben. Du muss einfach bevor Du Deinen Datensatz in Deiner Tabelle löschst, diese Routine aufrufen mit Deiner TerminID als Parameter. Dann wird erst der Termin Outlook gelöscht und dann erst dein Datensatz in der Accesstabelle.

      Es ist das ideale Vorgehensmodell, wenn Du beim Schreiben des Termins in Outlook, die entsprechende EntryID in Deine Tabelle zurückschreibst, zum Beispiel in das Feld TerminID. Dann kann man meine Routine unter Verwendung der EntryID direkt benutzen. Also ungefähr so:

      ___________________________________________________
      ‘Definition eines recordsets

      Dim rs As DAO.Recordset
      Set rs = CurrentDb.OpenRecordset(“Select * from tblTermine where xxx ist yyy”, dbOpenDynaset, dbSeeChanges)

      ‘Unter der Annahme, dass das Ergebnis ein eindeutiger Datensatz ist.
      If rs.RecordCount > 0 Then
      ‘Aufrufen der Routine, um den Termin in Outlook zuerst zu löschen
      Call Outlook_Kalender_Löschen(rs!TerminID) ‘Annahme, dass im Feld TerminID die EntryID aus Outlook gespeichert wurde
      ‘Danach erst den Datensatz in Deiner Tabelle löschen
      rs.Delete
      End If

      Set rs = Nothing
      ‘___________________________________________________

      Ein anderes Vorgehensmodell wäre, wenn Du anstelle des Zurückschreibens der EntryID in Deine Datebank ein nicht genutztes Feld in Outlook (z.B. “.User1″) benutzt und dort ehine vor Dir vergebene ID hinterlegts – Annahme: Deine TerminID ist ein Autowert aus Deiner Datenbank. Dann könnte das Löschen in Outlook wie folgt funktionieren (Die geänderten Zeilen sind hervorgehoben – der Rest bleibt unverändert.):

      ‘___________________________________________________
      Private Function Outlook_Kalender_Löschen(ID As Integer)
      DoCmd.Hourglass False
      Dim Folder As String
      Dim Foldername As String
      Folder = “iCloud”
      Foldername = “Kalender”
      Dim f As Object ‘MAPIFolder
      Dim olAppt As Object ‘AppointmentItem
      Dim OutApp As Object
      Set OutApp = CreateObject(“Outlook.Application”)
      Set f = OutApp.GetNamespace(“MAPI”).Session.Folders(Folder).Folders(Foldername)
      Set olAppt = f.Items.Add() ‘olAppointmentItem
      For Each olAppt In f.Items
      If ID = olAppt.User1 Then
      olAppt.Delete
      MsgBox (“Termin in Ourlook gelöscht.”)
      End If
      Next olAppt
      DoCmd.Hourglass False
      End Function
      ‘___________________________________________________

      Ich hoffe, das hat Dir ein wenig weitergeholfen?

      Christian

      Antworten

  2. Frank Schumacher

    Hallo Christian,

    Genau so wie im2. Fall beschrieben, ist es bei mir. Bei mir wird im Outlook eine Benutzereigenschaft “TerminID” angelegt. Diese entspricht dem Autowert “TerminID” in der Access- Tabelle “tblTermine”. Die Termine werden in einen Kalender “Geschäftlich” exportiert und können aus diesem auch wieder importiert werden. Den Importteil nutze ich aber im Moment noch nicht. Den Kalender habe ich dafür extra angelegt. Die Routine soll jetzt alle Termine in dem Kalender “Geschäftlich” löschen, wo die Benutzereigenschaft “TerminID” keinen passenden Wert in der ACCESS- Tabelle “tblTermine” im Feld “TerminID” findet. Kannst du deine Routine so anpassen? Wenn du den bisherigen Code benötigst, kann ich dir diesen auch per PN schicken.

    Ich danke dir auf jeden Fall schon mal für deine Hilfe.
    Frank

    Übrigens würde ich es gut finden, wenn man hier nach und nach eine Gesamtlösung entwickeln würde, die es auch VBA- Neulingen (so wie ich) ermöglicht solche Funktionen in Access einzubinden.

    Antworten

Hinterlasse einen Kommentar zu Hoepker Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>