Speicherdialoge in Word abfangen/Problem mit Office 2016

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Speicherdialoge in Word abfangen/Problem mit Office 2016

    Hallo zusammen,

    ich habe eine Wordvorlage programmiert. Im ActionsPane gibt es Pflichtfelder, wenn sie nicht alle ausgefüllt sind, kommt vor dem Speichern eine Meldung und der SaveFileDialog kommt gar nicht erst. Das funktioniert mit unten stehendem Code in Word 2016 super.
    Allerdings tritt dies in Word 2016 auch auf, wenn man beim Schließen des Dokumentes "Nicht speichern" auswählt, was dann ja Schwachsinn ist, da ja eh nicht gespeichert wird. Zudem wird beim automatischen Speichern jedes Mal die Meldung ausgegeben, wenn der Anwender das Dokument im Hintergrund hat. Das soll natürlich auch nicht passieren.

    VB.NET-Quellcode

    1. Private Sub ThisDocument_BeforeSave(sender As Object, e As SaveEventArgs) Handles Me.BeforeSave
    2. If DV_Titel = "" OrElse DV_Dokumentationstyp = "" OrElse DV_System = "" OrElse DV_Prozess1 = "" OrElse DV_Bereich1 = "" OrElse DV_Standort1 = "" OrElse DV_VName = "" OrElse DV_Bearbeitungsdatum = "" OrElse DV_Gueltigkeitsdatum = "" Then
    3. MessageBox.Show("Alle Pflichtfelder müssen ausgefüllt werden!")
    4. e.Cancel = True
    5. End If
    6. End Sub


    Kann man das irgendwie so lösen, dass genannte Fehler in Word 2016 nicht auftreten, der Code aber auch noch unter Word 2010 funktioniert?

    Liebe Grüße
    rory :)
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren
    Ich habe gerade mal den Objektkatalog aufgerufen und das gefunden:

    Sub BeforeAutoSave(ByRef Cancel As Boolean)
    Element von Microsoft.Office.Interop.Outlook.ItemEvents_10

    Zusammenfassung:
    This is a member in an event interface in a COM coclass. It is not intended to be used in your code.


    Kann man das überhaupt verwenden, wenn es nicht dafür vorgesehen ist?

    EDIT: Mir ist gerade noch aufgefallen, dass das aus dem Outlook-Namespace stammt, alos wäre das eh hinfällig.
    Allerdings fand ich noch das:
    ​ReadOnly Property IsInAutosave As Boolean
    Element von Microsoft.Office.Interop.Word._Document


    Bin ich damit auf dem Holzweg?
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rory“ ()

    rory schrieb:

    IsInAutosave
    könntest du natürlich auch abfragen in deiner Event-Routine.
    Aber wie gesagt, diese Informationen werden vermutlich auch aus Sender und EventArgs ersichtlich.

    Warum setzt du nicht einfach einen Breakpoint in die Eventroutine und schaust dir die übergebenen Parameter an?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    schaust dir die übergebenen Parameter an


    Bei Sender gibt es nichts aufschlussreiches, könnte denn etwas hiervon, was aus e hervorgeht von Nutzen sein?
    Da hätte ich dann Folgendes:
    1. Cancel = False
    2. ShowSaveFileDialog = True
    3. Nicht öffentliche Member
      1. cancel = False
      2. saveAsUI = True
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren
    Das, was mir jetzt aufgefallen ist, ist, bei Autosave sind die Werte von e unterschiedlich, ShowSaveDialog ist logischerweise False, SaveAsUI ist ebenfalls False. Wenn ich irgendwie an eine dieser Properties ran käme, könnte es ja eigentlich funktionieren, ansonsten versuche ich halt über IsAutoSave ranzukommen.

    EDIT: Alles klar, über die Properties von e konnte ich jetzt beide Fälle lösen

    VB.NET-Quellcode

    1. Private Sub ThisDocument_BeforeSave(sender As Object, e As SaveEventArgs) Handles Me.BeforeSave
    2. If DV_Titel = "" OrElse DV_Dokumentationstyp = "" OrElse DV_System = "" OrElse DV_Prozess1 = "" OrElse DV_Bereich1 = "" OrElse DV_Standort1 = "" OrElse DV_VName = "" OrElse DV_Bearbeitungsdatum = "" OrElse DV_Gueltigkeitsdatum = "" Then
    3. If e.ShowSaveAsDialog = True Then
    4. MessageBox.Show("Alle Pflichtfelder müssen ausgefüllt werden!")
    5. e.Cancel = True
    6. End If
    7. End If
    8. End Sub


    Danke für die Hilfe :)
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „rory“ ()

    Ich hätte es umgedreht.
    Vor allem aus optischen Gründen.
    Abgesehen von einer minimalen Performanceverbesssrung.

    VB.NET-Quellcode

    1. Private Sub ThisDocument_BeforeSave(sender As Object, e As SaveEventArgs) Handles Me.BeforeSave
    2. If e.ShowSaveAsDialog Then
    3. ​If DV_Titel = "" OrElse DV_Dokumentationstyp = "" OrElse DV_System = "" OrElse DV_Prozess1 = "" OrElse DV_Bereich1 = "" OrElse DV_Standort1 = "" OrElse DV_VName = "" OrElse DV_Bearbeitungsdatum = "" OrElse DV_Gueltigkeitsdatum = "" Then
    4. MessageBox.Show("Alle Pflichtfelder müssen ausgefüllt werden!")
    5. e.Cancel = True
    6. End If
    7. End If
    8. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --