Hallo dark41836!
Ich hatte jetzt endlich mal Zeit mich darum zu kümmern. Hab erst manuell alles so gemacht wie du vorgeschlagen hast:
- Kalender2 öffnen
- Auf Ansicht Liste gehen
- Alles markieren
- Alles der Kategorie "Synchronisierung" zuweisen
- Alles nach Kalender kopieren
- Manuell mit Nokia synchronisieren
- Im Hauptkalender alle Termine mit der Kategorie "Synchronisierung" löschen
Das hat wunderbar geklappt, also vielen Dank soweit! Es ist natürlich etwas umständlicher als bisher, also hab ich mich mal an VBA in Outlook rangewagt. Im Gegensatz zu Word, Excel oder Access hab ich noch nie in Outlook mit VBA gearbeitet, insofern wäre es nicht schlecht gewesen, wenn du schon mal was dazu gepostet hättest. Du schreibst, dass du das auch so machst? Aber nicht manuell, oder?
Nach ein paar Stunden suchen hab ich dann endlich einen Quelltext gefunden, der mir gezeigt hat, wie man auf einen Termin aus einem Kalender zugreift. Der Rest ging dann mit bekanntem VBA schneller voran. Hier mein vorläufiges Ergebnis. Es funktioniert, aber daran muss noch gearbeitet werden.
Code:
[COLOR="Navy"]Private Sub[/COLOR] SynchronisierungStudium()
[COLOR="Navy"]Dim[/COLOR] objApp [COLOR="Navy"]As[/COLOR] Application
[COLOR="Navy"]Dim[/COLOR] objNS [COLOR="Navy"]As[/COLOR] NameSpace
[COLOR="Navy"]Dim[/COLOR] objCalendarKalender [COLOR="Navy"]As[/COLOR] MAPIFolder
[COLOR="Navy"]Dim[/COLOR] objCalendarStudium [COLOR="Navy"]As[/COLOR] MAPIFolder
[COLOR="Navy"]Dim[/COLOR] objItem [COLOR="Navy"]As[/COLOR] AppointmentItem
[COLOR="Navy"]Dim[/COLOR] objItem2 [COLOR="Navy"]As[/COLOR] AppointmentItem
[COLOR="Navy"]Dim[/COLOR] objItemCopied [COLOR="Navy"]As[/COLOR] AppointmentItem
[COLOR="Navy"]Dim[/COLOR] strSubject [COLOR="Navy"]As[/COLOR] String
[COLOR="Navy"]Set[/COLOR] objApp = CreateObject("Outlook.Application")
[COLOR="Navy"]Set[/COLOR] objNS = objApp.GetNamespace("MAPI")
[COLOR="Navy"]Set[/COLOR] objCalendarKalender = objNS.GetDefaultFolder(olFolderCalendar) [COLOR="Green"]' Hauptkalender[/COLOR]
[COLOR="Navy"]Set[/COLOR] objCalendarStudium = objNS.GetDefaultFolder(olFolderCalendar).Folders("Studium") [COLOR="Green"]' Kalender Studium[/COLOR]
[COLOR="Navy"]Dim[/COLOR] syncKat [COLOR="Navy"]As Boolean[/COLOR]
[COLOR="Navy"]Dim[/COLOR] i [COLOR="Navy"]As Integer[/COLOR]
i = 0
[COLOR="Navy"]On Error Resume Next[/COLOR]
[COLOR="Green"]'On Error GoTo ErrHandle[/COLOR]
[COLOR="Navy"][COLOR="Navy"]For Each[/COLOR][/COLOR] objItem [COLOR="Navy"]In[/COLOR] objCalendarStudium.Items
[COLOR="Navy"]With[/COLOR] objItem
[COLOR="Green"]' Wurde einem Termin schon die Sonder-Kategorie zugewiesen,
' dann überspringen, um doppelte Kopien zu vermeiden[/COLOR]
syncKat = InStr(1, .Categories, "Synchronisierung", vbTextCompare)
[COLOR="Navy"]If[/COLOR] syncKat = [COLOR="Navy"]False Then[/COLOR]
[COLOR="Green"]' Jeden passenden Termin kopieren[/COLOR]
[COLOR="Navy"]Set[/COLOR] objItemCopied = .Copy
[COLOR="Green"]' Dem kopierten Termin eine Kategorie hinzufügen und speichern[/COLOR]
objItemCopied.Categories = objItemCopied.Categories & "; Synchronisierung"
objItemCopied.Save
[COLOR="Green"]' Den kopierten Termin in den Hauptkalender verschieben[/COLOR]
objItemCopied.Move objCalendarKalender
i = i + 1
[COLOR="Navy"]Debug.Print[/COLOR] i & " " & .Categories
[COLOR="Navy"]End If[/COLOR]
[COLOR="Navy"]End With[/COLOR]
[COLOR="Navy"]Next[/COLOR]
[COLOR="Green"]' Warten bis manuelle Synchronisierung abgeschlossen ist[/COLOR]
VBA.Shell "C:\Program Files\Nokia\Nokia PC Suite 7\PcSync2.exe", vbNormalFocus
MsgBox "Jetzt " & i & " Elemente synchronisieren, dann auf OK klicken.", vbInformation
[COLOR="Navy"]Debug.Print[/COLOR] "--- OK klicken ---"
[COLOR="Green"]'Führe aus, bis kein Element mehr vorkommt[/COLOR]
[COLOR="Navy"]Do[/COLOR]
[COLOR="Green"]' Alle Termine im Kalender Kalender mit der Kategorie "Synchronisierung" löschen[/COLOR]
i = 0
[COLOR="Navy"]For Each[/COLOR] objItem2 [COLOR="Navy"]In[/COLOR] objCalendarKalender.Items
[COLOR="Navy"]With[/COLOR] objItem2
syncKat = InStr(1, .Categories, "Synchronisierung", vbTextCompare)
[COLOR="Navy"]If[/COLOR] syncKat = [COLOR="Navy"]True Then[/COLOR]
.Delete
i = i + 1
[COLOR="Navy"]Debug.Print[/COLOR] "i " & i & " " & .Categories
[COLOR="Navy"]End If[/COLOR]
[COLOR="Navy"]End With[/COLOR]
[COLOR="Navy"]Next[/COLOR]
[COLOR="Navy"]Debug.Print[/COLOR] i & " Elemente gelöscht"
[COLOR="Navy"]Loop While[/COLOR] syncKat = [COLOR="Navy"]True[/COLOR]
MsgBox "Synchronisierung abgeschlossen", vbInformation
[COLOR="Navy"]Set[/COLOR] objItem = [COLOR="Navy"]Nothing[/COLOR]
[COLOR="Navy"]Set[/COLOR] objItemCopied = [COLOR="Navy"]Nothing[/COLOR]
[COLOR="Navy"]Set[/COLOR] objCalendarKalender = [COLOR="Navy"]Nothing[/COLOR]
[COLOR="Navy"]Set[/COLOR] objCalendarStudium = [COLOR="Navy"]Nothing[/COLOR]
[COLOR="Navy"]Set[/COLOR] objNS = [COLOR="Navy"]Nothing[/COLOR]
[COLOR="Navy"]Set[/COLOR] objApp = [COLOR="Navy"]Nothing[/COLOR]
[COLOR="Navy"]Exit Sub[/COLOR]
ErrHandle:
[COLOR="Navy"]Debug.Print[/COLOR] "Error: " & Err.Number & " " & Err.Description & vbCrLf
[COLOR="Navy"]End Sub[/COLOR]
Wie du siehst läuft der Algorithmus etwas anders, als bei der manuellen Methode:
- Kalender2 öffnen
- Für jeden Termin:
--- Wenn der Termin nicht die Sonderkategorie hat
----- Kopiere den Termin in den selben Kalender
----- Der Kopie die Sonderkategorie hinzufügen
----- Die Kopie in den Hauptkalender verschieben
- Manuell synchronisieren
- Hauptkalender öffnen
- Für jeden Termin:
--- Wenn der Termin die Sonderkategorie hat
----- Termin löschen
Jetzt habe ich an einer Stelle ein Problem, bei dem ich nicht weiter weiß. Wenn ich die Termine löschen möchte, die zur Kategorie gehören, werden immer nur die Hälfte der Termine gelöscht, also z.B. erst 25, dann 13, 7, 3 und dann die letzten 2 Termine. Das Problem habe ich mit
Do...Loop umgangen, indem ich das Löschen solange wiederhole, bis die Kategorie nicht mehr gefunden wird. Aber wie geht es richtig?
Vor allem kriege ich noch einen Fehler, dass ein Objekt nicht gefunden wurde, wenn ich es löschen will. Dazu einfach mal On Error Resume Next auskommentieren.
Und noch einen wirklich seltsamen Fehler habe ich bekommen: Schau dir mal oben das
If syncKat =
False Then an. Wenn ich in jede zweite Zeile ein Debug.Print setze, kann ich sehen, dass der Code mehrmahls zwischen
If und
End If durchläuft, ohne den If-Block zu verlassen!

Ich weiß das klingt komisch, und bestimmt hab ich was übersehen, aber so sieht es wirklich aus.
Der Code muss noch optimiert werden, aber erst mal die Fehler ausbügeln. Kannst du mir weiterhelfen?
Gruß
FeliX_22