MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Outlook (Express), sonst. Mailprogramme
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 14.02.2018, 10:57   #1
H_E_K
MOF User
MOF User
Standard VBA - Kalender-Items verschieben

Hallo!
Da Outlook die unangenehme Eigenschaft hat, neue Termine und importierte Kalender ausschließlich im lokalen Kalender zu speichern, und nicht im zweiten, mit der Cloud synchronen, habe ich mir schon vor einiger Zeit eine Verschieberoutine gebastelt, die per Item.Move alle Kalender-Einträge in den Cloudkalender verschiebt. Allerdings ist mir nun aufgefallen, dass dabei die Erinnerungszeit-Einstellungen verloren gehen. Nun gut, jetzt mache ich es so, dass ich im Cloud-Kalender einen neuen Eintrag anlege, diesen mit den Eigenschaften des lokalen Eintrags 'fülle', und dann den lokalen Eintrag lösche.
Soweit, so gut, klappt auch prima.

Jetzt kommt das kleine Problem:
Bei jedem Aufruf der Routine wird nur ein Teil der Termine abgearbeitet, die anderen übersprungen, dies ohne erkennbares System. Ich muss dann bei vielen Einträgen (ca. 40 übers Jahr verteilt) die Routine 4 oder 5 mal aufrufen, bis endlich alle Termine abgearbeitet sind. Scheint ein Timing-Problem zu sein, mein PC ist auch sehr schnell. Kann ich das durch einen veränderten Code besser hinbekommen?

Code:

 Sub MoveCalendarItems()
    Dim AnzCal          As Integer
    Dim objApp          As Application
    Dim objNS           As NameSpace
    Dim objCalendar     As MAPIFolder
    Dim objCloudCalendar     As MAPIFolder
    Dim objAccount      As MAPIFolder
    Dim objItem         As AppointmentItem
    Dim objNewItem      As AppointmentItem
    Dim strSubject      As String
    Dim ObjRecipient    As Recipient
    Dim ErinnerZeit     As Date
    Dim apptOutApp      As Object
    
    Set objApp = CreateObject("Outlook.Application")
    Set objNS = objApp.GetNamespace("MAPI")
    Set objAccount = objNS.Folders("meine emailadresse@irgendwo.de")
    Set objCalendar = objNS.GetDefaultFolder(olFolderCalendar)          'Lokaler Standard-Kalender
    Set objCloudCalendar = objAccount.Folders("Hauptkalender")          'Cloud-Kalender
    For Each objItem In objCalendar.Items
       'Sicherstellen, dass abgelaufene Termine ignoriert werden
       ErinnerZeit = objItem.Start - objItem.ReminderMinutesBeforeStart / 60 / 24
       If ErinnerZeit < Date Then GoTo Nexxt
       'Nun diesen Termin im den Cloud-Kalender neu erzeugen
        Set apptOutApp = objCloudCalendar.Items.Add
        With apptOutApp
            .Start = objItem.Start
            .Subject = objItem.Subject
            .Body = objItem.Body
            .Location = objItem.Location
            .Duration = objItem.Duration
            .ReminderMinutesBeforeStart = objItem.ReminderMinutesBeforeStart
            .ReminderPlaySound = objItem.ReminderPlaySound
            .ReminderSet = objItem.ReminderSet
            .Save
        End With

       objItem.Delete   'Eintrag aus lokelem Kalender löschen
       AnzCal = AnzCal + 1
Nexxt:
    Next
MsgBox (AnzCal & " Termine in den Cloud-Kalender verschoben!")
End Sub

__________________

Gruß
Hans


Mit VBA löst du jedes Problem - und schaffst mindestens zwei neue ...
Windows 7 Pro, Windows 10 Home, Office 2013 H&S
H_E_K ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.02.2018, 11:29   #2
markusxy
MOF Meister
MOF Meister
Standard

Und warum machst du den Termin nicht gleich im richtigen Kalender?
markusxy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.02.2018, 11:32   #3
EarlFred
MOF Guru
MOF Guru
Standard

Hallo Hans,

ein Klassiker: Innerhalb einer For-Each-Schleife Elemente löschen geht eigentlich immer schief. Geh den Code mal im Einzelschritt durch.

Nimm einen Zähler und lass den von letzterIndex bis ersterIndex Step - 1 laufen.

Läuft der Code eigentlich in Outlook selbst oder in einer anderen Anwendung mit Early-Binding?

Grüße
EarlFred

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 5 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,037% per 04.04.2018) - eine tolle Geste!

Geändert von EarlFred (14.02.2018 um 11:37 Uhr).
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.02.2018, 12:03   #4
H_E_K
Threadstarter Threadstarter
MOF User
MOF User
Standard

Zitat: von markusxy Beitrag anzeigen

Und warum machst du den Termin nicht gleich im richtigen Kalender?

Die Termine kommen per Import eines ics-Kalenders zustande. Da hast du keinen Einfluss auf die Kalenderauswahl, das ist ja das Problem.

__________________

Gruß
Hans


Mit VBA löst du jedes Problem - und schaffst mindestens zwei neue ...
Windows 7 Pro, Windows 10 Home, Office 2013 H&S
H_E_K ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.02.2018, 12:12   #5
H_E_K
Threadstarter Threadstarter
MOF User
MOF User
Standard

Zitat: von EarlFred Beitrag anzeigen

Hallo Hans,

ein Klassiker: Innerhalb einer For-Each-Schleife Elemente löschen geht eigentlich immer schief. Geh den Code mal im Einzelschritt durch.

Am Löschen liegt es nicht. Bei den nicht neu erzeugten Items werden auch die Herkunft-Items nicht gelöscht. Diese Items werden einfach 'übersehen' und Zug um Zug in den nächsten Durchläufen erfasst.

Zitat:

Nimm einen Zähler und lass den von letzterIndex bis ersterIndex Step - 1 laufen.

Warum meinst du bringt das Rückwärtslaufen Abhilfe?

Zitat:

Läuft der Code eigentlich in Outlook selbst oder in einer anderen Anwendung mit Early-Binding?

Läuft in Outlook selbst, wird manuell aufgerufen.

Zum Timing: Ich müsste jetzt alles wieder rückgängig machen, um die Einzelschritte zu testen. Das wäre eigentlich auch leicht machbar, wenn ich einfach bei dem Next einen Stoppunkt setze. Ich bin aber fast sicher, dass dann das Problem nicht auftaucht, weil es keine Timingprobleme gibt.
Zudem: Was soll an der Schleife 'For each ...' sonst schiefgehen?

__________________

Gruß
Hans


Mit VBA löst du jedes Problem - und schaffst mindestens zwei neue ...
Windows 7 Pro, Windows 10 Home, Office 2013 H&S
H_E_K ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.02.2018, 12:43   #6
EarlFred
MOF Guru
MOF Guru
Standard

Zitat:

Am Löschen liegt es nicht.

Aha. Was macht Dich da so sicher? Hast Du meinen Tipp denn überhaupt mal ausprobiert?

Zitat:

Warum meinst du bringt das Rückwärtslaufen Abhilfe?

Was passiert denn mit der Items-Auflistung, wenn Du die Elemente von vorne nach hinten bzw. mit Each durchläufst? Beim Löschen rückt das nächste Element sozusagen nach und dann springst du mit Next zum nächsten. Das ist also das übernächste, wenn Du die ursprüngliche Liste hernimmst.
Beim Rückwärtslaufen kickst Du das letzte Element aus der Auflistung, was aber nichts daran ändert, dass das vorletzte, zu dem Du dann gehst, noch existiert. Es werden also keine Elemente übersprungen.

Zitat:

Läuft in Outlook selbst, wird manuell aufgerufen.

und wozu dann die Zeile Set objApp = CreateObject("Outlook.Application")? Es muss dann doch schon ein solches Objekt existieren.

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 5 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,037% per 04.04.2018) - eine tolle Geste!

Geändert von EarlFred (14.02.2018 um 12:45 Uhr).
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.02.2018, 14:06   #7
H_E_K
Threadstarter Threadstarter
MOF User
MOF User
Standard

Zitat: von EarlFred Beitrag anzeigen

Aha. Was macht Dich da so sicher? Hast Du meinen Tipp denn überhaupt mal ausprobiert?

Nein, ich sagte ja, wo kein Item neu angelegt wird, wird das Ursprungs-Item auch nicht gelöscht. Das Item wird also in der Abarbeitung übersehen.

Zitat:

Was passiert denn mit der Items-Auflistung, wenn Du die Elemente von vorne nach hinten bzw. mit Each durchläufst? Beim Löschen rückt das nächste Element sozusagen nach und dann springst du mit Next zum nächsten. Das ist also das übernächste, wenn Du die ursprüngliche Liste hernimmst.
Beim Rückwärtslaufen kickst Du das letzte Element aus der Auflistung, was aber nichts daran ändert, dass das vorletzte, zu dem Du dann gehst, noch existiert. Es werden also keine Elemente übersprungen.

Da ist was dran. Wäre ich mit Items(n) durch die Items gegangen, wäre das sofort mein Hauptverdächtiger gewesen. Aber bei For Each ... gibt es ja keinen Index, weswegen ich davon ausging, dass der Code nach jedem Element nach allen restlichen Elementen sucht und die abarbeitet. Möglicherweise ist das nicht so, das teste ich mal.

Zitat:

und wozu dann die Zeile Set objApp = CreateObject("Outlook.Application")? Es muss dann doch schon ein solches Objekt existieren.

Gute Frage, nächste Frage. Stammt noch aus einem Codefragment, dass ich irgendwo gefunden habe. Aber wie würdest du dann die 5 nachfolgenden Zuweisungen vornehmen?

__________________

Gruß
Hans


Mit VBA löst du jedes Problem - und schaffst mindestens zwei neue ...
Windows 7 Pro, Windows 10 Home, Office 2013 H&S
H_E_K ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.02.2018, 14:09   #8
EarlFred
MOF Guru
MOF Guru
Standard

Set objApp = CreateObject("Outlook.Application")
Set objNS = objApp.GetNamespace("MAPI")
Set objCalendar = objNS.GetDefaultFolder(olFolderCalendar)


Set objCalendar = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar)
oder
Set objCalendar = Application.Session.GetDefaultFolder(olFolderCalendar)

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 5 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,037% per 04.04.2018) - eine tolle Geste!

Geändert von EarlFred (14.02.2018 um 14:11 Uhr).
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.02.2018, 14:12   #9
H_E_K
Threadstarter Threadstarter
MOF User
MOF User
Standard

Wieder was gelernt, danke. Mit VBA beschäftige ich mich zwar schon seit rund 20 Jahren, mit dem schlecht dokumentierten VBA in OL aber erst seit letztem Jahr.

__________________

Gruß
Hans


Mit VBA löst du jedes Problem - und schaffst mindestens zwei neue ...
Windows 7 Pro, Windows 10 Home, Office 2013 H&S
H_E_K ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.02.2018, 09:14   #10
halweg
MOF Koryphäe
MOF Koryphäe
Standard

Ich sehe es wie EarlFred: Rückwärtsschleife mit
Code:

i=Session.GetDefaultFolder(olFolderCalendar).Items.Count To 1 Step -1
und gut ist.

__________________

Windows 7, Windows 10, Office 2002, Office 2010
halweg ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.02.2018, 09:55   #11
H_E_K
Threadstarter Threadstarter
MOF User
MOF User
Standard

Zitat: von halweg Beitrag anzeigen

Ich sehe es wie EarlFred: Rückwärtsschleife mit

Code:

i=Session.GetDefaultFolder(olFolderCalendar).Items.Count To 1 Step -1
und gut ist.

Genauso habe ich es gemacht und es funktioniert. Danke euch allen!

__________________

Gruß
Hans


Mit VBA löst du jedes Problem - und schaffst mindestens zwei neue ...
Windows 7 Pro, Windows 10 Home, Office 2013 H&S
H_E_K ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.