Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1092to1096
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Doppelte Outlook-Termine vermeiden

Doppelte Outlook-Termine vermeiden
k
Hallo,
...kann mir kemand hier weiterhelfen ? Unter dem Beitrag :
https://www.herber.de/forum/archiv/1092to1096/t1093395.htm#1093582
hat mir TIno sehr geholfen, doppelte Eintrage von Kontakten zu vermeiden.
Aber wie kann ich dies auch für Putlook-Termin anwenden ?
Wie muss ich da die Zeilen umschreiben ?
Set objOutlook = CreateObject("Outlook.Application")
Set objNameSpace = objOutlook.GetNamespace("MAPI")
Set objMapiFolder = objNameSpace.GetDefaultFolder(10)
Set objItems = objMapiFolder.Items
Vielen Dank und Gruß
Kay
AW: Doppelte Outlook-Termine vermeiden
10.08.2009 13:31:14
Oberschlumpf
Hi Kay
Ich nutze dieses Konstrukt:
Zuerst die Terminbildung
Titel = der Termintext
Termin = Datum und Uhrzeit in dieser Form "dd.mm.yyyy hh:mm"
Sub sbTermin(ByVal titel As String, ByVal Termin As Date)
Dim objAppointment As AppointmentItem
Dim apptFolder As Object
Dim myOLApp As Object
Set myOLApp = CreateObject("Outlook.Application")
Set apptFolder = myOLApp.GetNamespace("MAPI").GetDefaultFolder(9)
If chkAppt(apptFolder, titel, Termin) = False Then
Set objAppointment = Outlook.CreateItem(olAppointmentItem)
With objAppointment
.Subject = titel
.Start = Termin
.End = Termin
'.AllDayEvent = AllDay
'.Body = txtKalenderText.Text
.ReminderMinutesBeforeStart = 30
.ReminderSet = True
.Save
End With
Set objAppointment = Nothing
End If
Set myOLApp = Nothing
Set apptFolder = Nothing
End Sub

Hier steht zwar jetzt für Start und End derselbe eintrag, aber End kannst du ja nach Belieben anpassen.
Die fettgedruckte Zeile ruft die Kontrolle auf doppelte Termineinträge auf, die dann so aussieht:
Auch hier wieder die Übergabeparameter kurz erklärt:
chkFolder = der zuvor in ApptFolder deklarierte Outlook-Ordner
newAppt = Termintext
newDate = Datum + Uhrzeit wie oben
Function chkAppt(chkFolder As Object, newAppt As String, newDate As Date) As Boolean
Dim appItem As Object
chkAppt = True
For Each appItem In chkFolder.Items
If appItem.Subject = newAppt Then
If appItem.Start = newDate Then
Beep
Exit Function
End If
End If
Next
chkAppt = False
End Function

Diese Funktion durchsucht alle Termineinträge in Outlook.
Und nur, wenn kein Eintrag mit gleichem Termintext + Termin gefunden wurde, wird der Termin in Outlook eingetragen.
Ist doch schon ein Eintrag vorhanden, ertönt ein Signalton.
Konnte ich helfen?
Ciao
Thorsten
Anzeige
AW: Doppelte Outlook-Termine vermeiden
10.08.2009 14:01:00
k
Hallo Thorsten,
vielen Dank für Deine sehr ausführliche Hilfestellung ! - Werde versuchen sie im Laufe des Tages/der Nacht bei mir einzubauen.
Gruß
Kay
PS: Wieder was gelernt - danke für die "ausführlichen" Beschreibungen!
AW: Doppelte Outlook-Termine vermeiden
10.08.2009 14:26:11
k
Hallo,
habe es so übernommen und "Titel" und "Start/Endzeit" angepasst. Aber irgendwie - erkennt es nicht, dass ein Eintrag schon vorhanden ist...er packt immer nur welche dazu ?
Wo liegt mein Gedanken-Code Fehler ?! Bitte um Hilfe ;o)
Hier mein Code:
(die DIM-Teile habe ich unter OptionExplicit & die Function unter Modul1 gepackt)
' Outlook-Termin anlegen
Private Sub Out_Click()
Application.ScreenUpdating = False
' Prüfung, ob Eintrag schon vorhanden
Set myOLApp = CreateObject("Outlook.Application")
Set apptFolder = myOLApp.GetNamespace("MAPI").GetDefaultFolder(9)
titel = "Projekt: " & TB84.Text & " Erinnerungstermin"
start = Format(TB95.Text, "dd.mm.yyyy") & " 08:00"
Termin = Format(TB96.Text, "dd.mm.yyyy") & " 08:00"
If chkAppt(apptFolder, titel, Termin) = False Then
Set objAppointment = Outlook.CreateItem(olAppointmentItem)
With objAppointment
.Subject = titel
.start = start
.End = Termin
.Body = "Projektdetails" & VBA.Chr(13) & VBA.Chr(13) & "Projektanschrift: " &  _
VBA.Chr(13) & TB85 & " - " & TB86 & ", " & TB87 & Chr(13) _
& TB88 & " " & TB89 & VBA.Chr(13) & VBA.Chr(13) & "Bemerkung zum  _
Projekt:" & Chr(13) & TB90 & Chr(13) & VBA.Chr(13) & "Daten zum Projekt:" & Chr(13) _
& "AV: " & TB91 & VBA.Chr(13) & "Erwartung: " & CB92.Text & " %" & VBA. _
Chr(13) & "Investionshöhe: " & Format(TB93.Value, "#,##0.00 €") & VBA.Chr(13) & "Status: " & CB94.Text
.Location = TB85 & " - " & TB86 & " " & TB87 & ",  " & TB88 & " " & TB89
.Duration = "120" ' für 120 Minuten belegen
.ReminderMinutesBeforeStart = 30
.ReminderPlaySound = True
.ReminderSet = True
.Save
End With
Set objAppointment = Nothing
End If
Set myOLApp = Nothing
Set apptFolder = Nothing
' Info an den User, dass Termin angelegt wurde
MsgBox "Termin " & TB95.Text & " an Outlook übertragen!"
' Datum des Outlook-Exports eintragen, zur späteren Prüfung, wann erstellt/geändert
Worksheets("ATE").Cells(CB0.ListIndex + 2, 6) = Date
Application.ScreenUpdating = True
End Sub

OK, Danke bereits an dieser Stelle für Eure Unterstützung !
Gruß
Kay
Anzeige
AW: Doppelte Outlook-Termine vermeiden
10.08.2009 15:04:35
Oberschlumpf
Hi Kay
Hab jetzt nicht genug Zeit, um deinen Code zu testen.
Mir fällt aber das hier auf:
start = Format(TB95.Text, "dd.mm.yyyy") & " 08:00"
ändern in
datumbeginn = Format(TB95.Text, "dd.mm.yyyy") & " 08:00"
weil....
... .start wird schon als Methode von objAppointment verwendet.
Vermeide IMMER Var-Namen, die genau so "heißen" wie Methoden,Eigenschaften,Befehle,etc.
ändere
If chkAppt(apptFolder, titel, Termin) = False Then
in
If chkAppt(apptFolder, titel, datumbeginn) = False Then
weil...
...die Funktion chkAppt überprüft den jeweiligen Anfangstermin.
Du übergibst aber an die Var Termin den Endetermin eines Eintrages - verstehst du?
Hilfts?
Wenn nicth, muss ich doch mal den Code testen...oder auch jemand anderes.
Nur ich kann das erst wieder heute abend machen.
Ciao
Thorsten
Anzeige
noch eine Version...
10.08.2009 15:15:04
Tino
Hallo,
vielleicht kommst Du hiermit besser zurecht, ist ähnlich dem anderen Code.
Zur Prüfung ob dieser schon vorhanden, ziehe ich den Starttermin und die Betreffzeile heran.
Option Explicit

Sub Beispiel()
Dim objOutlook As Object, objNameSpace As Object
Dim objMapiFolder As Object, objItems As Object
Dim zaehler As Integer
Dim vonDatum As Date, bisDatum, strBetreff As String, strBody As String
Dim booFind As Boolean

strBetreff = "Betreffzeile"             'Betreffzeile 
vonDatum = "10.08.2009 17:15"           'von 
bisDatum = CDate("10.08.2009 19:00")    'bis 
strBody = "Hallo, dies ist ein Test"    'Body 

'dauer in Minuten berechnen 
bisDatum = Application.WorksheetFunction.Round((CDate(bisDatum) - vonDatum) * 60 * 24, 0)

  Set objOutlook = CreateObject("Outlook.Application")
  Set objNameSpace = objOutlook.GetNamespace("MAPI")
  Set objMapiFolder = objNameSpace.GetDefaultFolder(9)
  Set objItems = objMapiFolder.Items

  'Schleife durch alle Termine bis Start und Betreff übereinstimmen 
  For zaehler = 1 To objItems.Count
   With objItems(zaehler)
    If .Start = vonDatum And .Subject = strBetreff Then
      booFind = True
      Exit For
    End If
   End With
  Next zaehler
  
  If booFind Then
        'hier berabeiten ************************* 
        With objItems(zaehler)
         .body = strBody
         .Duration = bisDatum 'tauer in Minuten 
         .Save
        End With
  Else
        'hier anlegen    ************************* 
         Set objItems = objMapiFolder.Items.Add
         With objItems
          .Subject = strBetreff
          .body = strBody
          .Start = Format(vonDatum, "dd.mm.yyyy hh:mm")
          .Duration = bisDatum 'tauer in Minuten 
          .Save
         End With
  End If
  

Set objNameSpace = Nothing
Set objNameSpace = Nothing
Set objMapiFolder = Nothing
Set objItems = Nothing
End Sub
Gruß Tino
Anzeige
Lasst mal die Schleifen über alle Termine weg...
10.08.2009 16:41:42
Ramses
Hallo
... das kostet doch nur unnötig Zeit.
Verwendet lieber die "Restrict"-Methode
Sub Get_scheduled_Appointments()
    ' Verweis auf MS Outlook Library der Version 10, 11 oder 12 setzen
    ' (C) Ramses
    Dim strBeginn As String, strEnde As String
    Dim myOutApp As Object
    Dim objKalender As Object, objTermine As Object
    Dim objTerminauswahl As Object, objTermin As AppointmentItem
    Dim strBetreff As String, strStart As String
    Dim strGanztag As String, tmpMessage As String
    On Error GoTo Terminliste_Error
    strBeginn = InputBox(Prompt:="Anfangsdatum:", Title:="Terminliste", Default:=VBA.Format(Now, "dd.mm.yyyy"))
    If IsDate(strBeginn) Then
        'Default = Heute + 7 Tage
        strEnde = InputBox(Prompt:="Enddatum:", Title:="Terminliste", Default:=VBA.Format(Now + 7, "dd.mm.yyyy"))
        If IsDate(strEnde) Then
            Set myOutApp = CreateObject("Outlook.Application")
            Set objKalender = myOutApp.GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar)
            Set objTermine = objKalender.Items
            objTermine.Sort "[Start]"
            objTermine.IncludeRecurrences = True
            Set objTerminauswahl = objTermine.Restrict("[Start] >= '" & strBeginn & " 00:00'" & "AND [Start] <= '" & strEnde & " 23:59'")
            If objTerminauswahl Is Nothing Then
                MsgBox "Kein Termin in diesem Zeitraum", vbOKOnly + vbInformation, "Alles Frei"
                Exit Sub
            End If
            tmpMessage = "Folgende Termine sind im Zeitraum von: " & strBeginn & " bis " & strEnde & " bereits eingetragen:" & vbCrLf
            For Each objTermin In objTerminauswahl
                With objTermin
                    strBetreff = .Subject
                    strStart = .start
                    strGanztag = .AllDayEvent
                    tmpMessage = tmpMessage & strBetreff & "," & strStart & ", Ganzer Tag:" & strGanztag & vbCrLf
                End With
            Next objTermin
            MsgBox tmpMessage
        End If
    End If
    Terminliste_End:
    Exit Sub
    
    Terminliste_Error:
    MsgBox Prompt:="Es ist ein Fehler aufgetreten..." & vbCrLf & "(" & Err.Number & "): " & Err.Description
    Resume Terminliste_End
End Sub


Das ganze könntest du jetzt in eine externe Boolean Funktion auslagern, die WAHR oder FALSCH für den Termin ausgibt, und innerhalb deines Makros verwendet werdenkann
Gruss Rainer
Anzeige
Gute Idee, habe ich gleich mal eingebaut.
10.08.2009 17:15:43
Tino
Hallo Rainer,
ist natürlich wieder mal viel besser, daher habe ich dies gleich mal in mein Beispiel mit eingebaut.
Sub Beispiel()
Dim objOutlook As Object, objNameSpace As Object
Dim objMapiFolder As Object, objItems As Object
Dim vonDatum As Date, bisDatum As Date, LMinuten As Long
Dim strBetreff As String, strBody As String
Dim booFind As Boolean

strBetreff = "Betreffzeile"             'Betreffzeile 
vonDatum = CDate("10.08.2009 17:15")    'von 
bisDatum = CDate("10.08.2009 19:00")    'bis 
strBody = "Hallo, dies ist ein Test"    'Body 

'dauer in Minuten berechnen 
LMinuten = Application.WorksheetFunction.Round((bisDatum - vonDatum) * 1440, 0)

  Set objOutlook = CreateObject("Outlook.Application")
  Set objNameSpace = objOutlook.GetNamespace("MAPI")
  Set objMapiFolder = objNameSpace.GetDefaultFolder(9)
  Set objItems = objMapiFolder.Items
  objItems.Sort "[Start]"
  objItems.IncludeRecurrences = True
  
  Set objItems = objItems.Restrict("[Start] >= '" & Format(vonDatum, "dd.mm.yyyy hh:mm") & "'" & _
                "AND [Start] <= '" & Format(vonDatum + 1, "dd.mm.yyyy hh:mm") & "'")
  
  'Schleife durch alle gefundenen Termine bis Start und Betreff übereinstimmen 
  For Each objItems In objItems
   With objItems
    If .Start = vonDatum And .Subject = strBetreff Then
      booFind = True
      Exit For
    End If
   End With
  Next objItems
  
  If booFind Then
        'hier berabeiten ************************* 
        With objItems
         .body = strBody
         .Duration = bisDatum 'tauer in Minuten 
         .Save
        End With
  Else
        'hier anlegen    ************************* 
         Set objItems = objMapiFolder.Items.Add
         With objItems
          .Subject = strBetreff
          .body = strBody
          .Start = Format(vonDatum, "dd.mm.yyyy hh:mm")
          .Duration = LMinuten 'dauer in Minuten 
          .Save
         End With
  End If
  

Set objNameSpace = Nothing
Set objNameSpace = Nothing
Set objMapiFolder = Nothing
Set objItems = Nothing
End Sub
Gruß Tino
Anzeige
AW: Gute Idee, habe ich gleich mal eingebaut.
11.08.2009 11:24:34
k
Hallo,
bin leider noch nicht dazu gekommen es zu testen - aber vielen Dank schon mal an dieser Stelle für Eure tollen Ideen und Lösungsvorschläge...
Hoffe zum Ende der Woche es probiert zu haben und wenn ich nichts mehr hier eintrage - hat es funktioniert ;o)
Gruß
Kay
AW: Gute Idee, habe ich gleich mal eingebaut.
11.08.2009 12:05:40
Oberschlumpf
Hi Kay
...und wenn ich nichts mehr hier eintrage...
ist die falsche Einstellung!
Gerade über positives Feedback freut sich der Ideengeber besonders.
Also lass es uns auch wissen, wenn nun alles funktioniert.
Ciao
Thorsten

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige