none
Outlook 2013 - VBA-Makro Geburtstag errechnen | Bildschirmflackern RRS feed

  • Frage

  • Ich habe bereits hier eine Frage gestellt:
    https://answers.microsoft.com/de-de/msoffice/forum/msoffice_outlook-msoffice_custom-mso_2013_release/outlook-makro-geburtstagealter-errechnen/a39d5f01-b057-4b8c-b803-8d2dacc55b80?tm=1519294734258
    und mir ist nun diese Forumseite empfohlen worden.

    Ich verwende ein voll funktionsfähiges VBA-Makro, welches mir in Outlook 2013 das Alter
    aufgrund des im Feld "Details" eingetragenen Geburtstagsdatums errechnet.

    Das Hauptproblem ist, dass wenn das Makro läuft es zu einem ständigen Flackern auf dem Bildschirm kommt
    und der PC solange nicht benutzt werden kann(!), bis das Makro mit seinen Berechnungen fertig ist.

    Hier das Makro:

    Sub AlterAnzeigen()

    Dim myNameSpace As NameSpace

    Dim Alter As String
    Dim Zaehler
    Dim GebJahr
    Set myolApp = CreateObject("Outlook.Application")
    Set myNameSpace = myolApp.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(olFolderCalendar)
    Set myitems = myFolder.Items

    Zaehler = 0
    'http://www.pctipp.ch/tipps-tricks/kummerkasten/office/artikel/outlook-kontakte-geburtstag-und-aktuelles-alter-anzeigen-81701/
    'Suche nach dem Begriff "Geburtstag von" in allen Kalendereinträgen
    'http://www.fjsoft.at/forum/viewtopic.php?p=130210#130210 ... das Flackern muß ertragen werden!
    For i = myitems.Count To 1 Step -1
        'Prüfung der Kalendereinträge auf den Text "Geburtstag von"
        'und Überprüfung ob es sich um ein ganztägiges Ereignis handelt
        If InStr(myitems(i).Subject, "Geburtstag von") And myitems(i).AllDayEvent = True Then
          myitems(i).Display
          GebJahr = myitems(i).GetRecurrencePattern.PatternStartDate
          Alter = DateDiff("yyyy", GebJahr, Now())                    'Hier wird das Alter errechnet
          'myitems(i).Location = "[Alter: " + Alter + "]"             'Originalcode     [(Alter: 31)] eckige + runde Klammern
          'myitems(i).Location = "(Alter: " + Alter + ")"             'Originalcode     ((Alter: 31)) zwei runde Klammern
          myitems(i).Location = "Alter: " + Alter + ""   'geänderter Code:  (Alter: 31)  nur runde Klammern in Outlook, Handysynchro: OK
          myitems(i).Save
          myitems(i).Close 0
          Zaehler = Zaehler + 1                                       'Zähler für die Anzahl der geänderten Einträge
        End If
    Next
    MsgBox "Fertig!" & vbCrLf & Zaehler & " Geburtstagseinträge geändert.", vbInformation, "Geburtstage angepasst "
    End Sub

    Da ich KEIN Programmierer bin, bitte ich um folgendes, und zwar

    1. Auskunft, ob das Bildschirmflackern abstellbar ist - und falls ja, dann
    2. Um einen vollständigen geänderten Code, welcher das bewerkstelligen können soll

    3. Aufgrund von einigen gut gemeinten Ratschlägen in einem anderen Forum, die zu nichts geführt haben
        bin ich schon leicht sensibilisiert, d.h. ich habe kein Problem damit, wenn mir jemand mitteilt, dass das Gewünschte
        nicht möglich ist. Was ich jedoch nicht möchte, ist als Nicht-Programmierer weiteren Ratschlägen zu folgen, die im
        Endergebnis von mir eine Codeänderung erfordern bzw. Ratschlägen zu folgen, nach denen sich herausstellt, dass der
        Ratgeber den Code überhaupt nicht selbst ausprobiert haben kann.

    Bin schon gespannt, ob es eine Lösung gibt und bedanke mich schon im voraus bei denjenigen, die sich mit dem Thema befassen.

    Gruß
    Karl

    Freitag, 16. März 2018 17:52

Alle Antworten

  • Warum must du das Item anzeigen?

    " myitems(i).Display"

    Lass die Zeile einfach mal weg. Kein Wunder, dass der Bildschirm flackert.

    Freitag, 16. März 2018 18:31
  • Warum must du das Item anzeigen?

    " myitems(i).Display"

    Lass die Zeile einfach mal weg. Kein Wunder, dass der Bildschirm flackert.

    Genau auf solche Antworten kann ich gerne verzichten!
    Hast Dich mit dem Thema wohl sehr eingehend auseinandergesetzt...??

    Vielleicht liest Du mal das Thema von Beginn (siehe oben: Link in das andere Forum)
    oder vielleicht nochmals den Punkt 3. oberhalb - sofern Dich das jetzt noch interessiert.


    Sonntag, 18. März 2018 11:31
  • Genau auf solche Antworten kann ich gerne verzichten!

    Dann gib die Code-Anpassung bei einem Programmierer gegen Bezahlung in Auftrag. Da kannst Du dir dann wünschen, welche Antworten Du bekommst und welche nicht.

    Du hingegen hast die Frage in einem öffentlichen Forum gestellt, wo Leute in ihrer Freizeit versuchen, anderen zu helfen. In dieser Situation ist jede Antwort dankend zu akzeptieren, die nicht beleidigend und nicht komplett off-Topic ist. Dein letzter Einwurf grenzt übrigens an beides.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Sonntag, 18. März 2018 12:22
  • Im Wesentlichichen ist dies deine Frage:

    "Das Hauptproblem ist, dass wenn das Makro läuft es zu einem ständigen Flackern auf dem Bildschirm kommt
    und der PC solange nicht benutzt werden kann(!), bis das Makro mit seinen Berechnungen fertig ist."

    Durch die .Display-Ausgabe wird nun mal eine Ausgabe erzwungen, die zum Flackern führt. Außerdem verlangsamt es insgesamt die Berechung.
    Um also schneller zu rechnen und kein Flackern zu erzeugen, spare dir die Anzeige.

    In Excel gibt es die Möglichkeit, die Anzeige real zu unterdrücken sowie eine Anzeige in der unteren Statusleiste, was erhebliche Performance bringt. Leider bietet das Outlook-Modell diesbezüglich keine Möglichketen.

    Also warum die Anzeige?

    Sonntag, 18. März 2018 12:51
  • 2Evgenij Smirnov
    > ... In dieser Situation ist jede Antwort dankend zu akzeptieren, ...

    Leider tue ich mir da sehr schwer damit wenn ich feststelle, dass auf meine Fragen und speziell auf die Hinweise überhaupt nicht eingegangen wird. Da ich in einigen Foren zu unterschiedlichen Themen unterwegs bin, weiß ich, dass das auch anders geht.

    2bfuerchau
    > ... Um also schneller zu rechnen und kein Flackern zu erzeugen, spare dir die Anzeige. ...
    > ... Also warum die Anzeige? ...

    Diese Aussagen bezeugen, dass Du
    a) Dir das hier eingemeldete Thema noch nicht angesehen hast, zB 23.02.2018 10:11:45 Erstellt
    https://answers.microsoft.com/de-de/msoffice/forum/msoffice_outlook-msoffice_custom-mso_2013_release/outlook-makro-geburtstagealter-errechnen/a39d5f01-b057-4b8c-b803-8d2dacc55b80?tm=1519294734258
    b) den Code - so wie Du ihn Dir vorstellst - in Outlook 2013 noch nicht getestet haben kannst.
    c) Dir meine oben angeführten Punkte 2. und 3. offensichtlich gänzlich egal sind

    Damit bin ich wohl in einem angeblichen Profi-Forum recht schnell - zumindest bei diesem Thema -
    ans Ende meines Geduldsfadens gelangt (soll bitte nicht überheblich klingen(!) - drückt nur meinen Gefühlszustand aus).

    Hier nochmals die Kurzfassung meiner Fragen:
    1. Läßt sich das Flackern beim VBA-Code abstellen, zB mit Änderung des Codes?
    2. Falls ja, ist jemand gewillt, den Code zu veröffentlichen, falls nein, ist jemand gewillt, kundzutun, dass es keine VBA-Lösung gibt? 

    Meine künftige Vorgangsweise bei diesem Thema ist:
    1. Falls jemand einen voll funktionsfähigen VBA-Code für Outlook 2013 veröffentlichen sollte,
    1- dann bedanke ich mich schon im voraus für die Bemühungen
    2. Ich werde das Thema weiterhin beobachten, ob vielleicht noch ein korrigierter Code kommt.
    3. Von allen anderen gutgemeinten Tipps bitte ich abzusehen, da ich darauf nicht mehr reagieren werde -
    3- für mich ist derzeit leider nicht mehr vorstellbar, dass in diesem Forum noch jemand eine Lösung bringt.

    Danke an bfuerchau, der zumindest versucht hat hier etwas beizutragen.

    Gruß
    Karl





    • Bearbeitet tuskaben Sonntag, 18. März 2018 14:55
    Sonntag, 18. März 2018 14:46
  • Da du nun mal an der Ursache des Flackerns nichts ändern willst (denn ich glaube, dass du das weglassen von "myitems(i).Display" noch nicht ausprobiert hast) sondern nach einer Symptom-Lösung suchst, wird dir hier niemand helfen können.

    https://msdn.microsoft.com/de-de/vba/outlook-vba/articles/mailitem-display-method-outlook

    Wie der Artikel zeigt, wird mit der Display-Methode ein Eintrag angezeigt.
    Dies führt ebenso u.U. dazu, dass die Anwendung in den Vordergrund geschoben wird, was das Arbeiten mit anderen Anwendungen dann halt verhindert, denn dein Makro blockiert ja jedwede Reaktion.

    Und was deinen Link angeht, so kann ich nur bestätigen, was dort geschrieben steht.
    Auch wenn du den Antwortern dort nicht glaubst.

    a) ein Display ist nicht erforderlich
    b) nach dem Save ist ein Close nicht erforderlich.

    Dann beschreibe doch mal einfach, was an Stelle des Flackerns passiert, wenn du Display und Close weglässt.

    Sonntag, 18. März 2018 16:55
  • Das ist jetzt - entgegen zu meiner oben angeführten Aussage -
    wirklich MEIN ALLERLETZTES STATEMENT zu diesem Thema (damit mir nicht jemand
    noch nachsagt, ich hätte als Nicht-Programmierer Tipps nicht befolgt):

    > ... (denn ich glaube, dass du das weglassen von "myitems(i).Display" noch nicht ausprobiert hast) ...
    Leider hast Du hier meinen Beitrag im anderen Forum falsch interpretiert, denn bereits dort habe ich mitgeteilt,
    dass wenn man im VBA-Code die folgende Zeile auskommentiert, und zwar 'myitems(i).Display
    DAS ALTER NICHT ERRECHNET WIRD BZW. DAS ERRECHNETE ALTER IN DER TERMINSERIE IM FELD "ORT" NICHT ANGEZEIGT WIRD!

    > ... b) nach dem Save ist ein Close nicht erforderlich. ...

    Das mag sein bzw. habe ich das ebenfalls ausprobiert aber das Ergebnis ist ebenfalls das zuvor genannte und somit unbrauchbar.

    > Dann beschreibe doch mal einfach, was an Stelle des Flackerns passiert, wenn du Display und Close weglässt.

    Das Makro ist sehr schnell fertig und zeigt ein Fenster mit Titel "Geburtstage angepasst" I=Info Fertig! ## Geburtstagseinträge geändert. In diesem Fall gibt es KEIN FLACKERN!
    NUR LEIDER IST ES HALT UNBRAUCHBAR WEGEN DES WEGLASSENS VON "myitems(i).Display", d.h. das errechnete Alter wird nirgends angezeigt(!) - zB in Outlook Heute
    Genau das ist aber der Punkt, auf den es ankommt und auf den ich schon im anderen Forum hingewiesen habe.
    Für mich beweist das einmal mehr, dass Du den Code nicht selbst getestet haben kannst
    (s.a.o. Pkt. 3.).

    AN DIESER STELLE STEIGE ICH JETZT ENDGÜLTIG AUS -
    ich erwarte mir auch in diesem Forum keine wie immer geartete Lösung mehr.
    Bitte daher von weiteren Beiträgen abzusehen (na ja, außer es hat vielleicht noch jemand einen funktionierenden Code ;-) )

    Von mir wird es in jedem Fall hier keine weiteren Beiträge mehr zu diesem Thema geben.

    Gruß
    Karl




    • Bearbeitet tuskaben Montag, 19. März 2018 20:08
    Montag, 19. März 2018 19:57
  • Warum startest du eine 2. Outlook-Instanz zur Bearbeitung der Einträge?

    Set myolApp = CreateObject("Outlook.Application")

    Damit änderst du die Inhalte dort und nicht lokal. Erst nach einem Restart von Outlook werden die Änderungen dann auch lokal sichtbar.
    Wenn du die Werte in deiner aktuellen Instanz ändern willst solltest du

    Set myolApp = Application ' => Unnötig: CreateObject("Outlook.Application")

    verwenden. Dann funktioniert auch das Weglassen von Display/Close.
    Dienstag, 20. März 2018 10:54

  • Wenn du die Werte in deiner aktuellen Instanz ändern willst solltest du

    Set myolApp = Application ' => Unnötig: CreateObject("Outlook.Application")

    verwenden. Dann funktioniert auch das Weglassen von Display/Close.

    Mich interessiert das Thema auch; und ich habe es mit "Set myolApp = Application" probiert.

    Damit werden in die "Locations" keine Eintragungen vorgenommen. Darf der Lokale Kalender vielleicht nicht durch Makros verändert werden, sodass ein Zugriff auf eine "weitere Instanz" erforderlich ist?

    Donnerstag, 6. Dezember 2018 14:19
  • Nun ist halt die Frage womit du arbeitest:

    Innerhalb eines VBA-Projektes von Office (egal ob Word, Excel, ...) hast du direkten Zugriff auf das Application-Object.

    Außerhalb (Powershell, C#, usw.) gibts nun 2 COM-Methoden:

    GetObjekt => Verbinden mit der aktuellen Instanz
    CreateObject => Erstellen einer neuen Instanz

    Per API kann man auf die ROT (Running Objekt Table) zugreifen um sich mit verschiedenen Instanzen verbinden zu können.

    Ansonsten debugge mal dein Macro und prüfe die Inhalte ob du auch im richtigen Objekt/Kalender bist.

    Donnerstag, 6. Dezember 2018 17:11