Überprüfen, ob ein bestimmtes Bookmark in Word vorhanden ist



  • Ich möchte per OLE-Automation Worddokumente, die Bookmarks enthalten, füllen. Da ich vorher nicht weiß, welches Bookmark in dem Dokument vorhanden ist, muss ich vor der Zuweisung des Textes mittels

    WordSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark  << 0 << 0 << "Testbookmark");
       WordSelection.OleProcedure("TypeText", WideString("Test"));
    

    prüfen, ob das Bookmark "Testbookmark" überhaupt vorhanden ist.

    Ich habe es mit folgendem Code probiert:

    WordDocument = WordApplication.OlePropertyGet("Documents");
    WordDocument = WordApplication.Exec(PropertyGet("ActiveDocument"));
    WordSelection = WordApplication.Exec(PropertyGet("Selection"));
    WordRange = WordSelection.Exec(PropertyGet("Range"));
    WordBookmarks = WordRange.Exec(PropertyGet("Bookmarks"));
    
    if(WordBookmarks.Exec(Procedure("Exists") << "Testbookmark" ))
    {
       WordSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark  << 0 << 0 << "Testbookmark");
       WordSelection.OleProcedure("TypeText", WideString("Test"));
    }
    

    Leider ohne Erfolg 😞 Die Anweisungen in der if-Schleife werden immer ausgeführt. Egal ob das Bookmark vorhanden ist oder nicht.

    Kann mir jemand weiterhelfen?



  • also wenn ich versuche mittels

    WordSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << "Test");
    

    auf einen nicht existierenden Bookmark/Textmarke zuzugreifen, bekomme ich immer eine Fehlermeldung:

    Im Projekt WordControl.exe ist eine Exception der Klasse EOleException aufgetreten. Meldung: 'Sie haben für eine Seite, Zeile, Fußnote, Endnote oder Anmerkung mehrere Bestimmungsorte angegeben'.

    d.h. mit Hilfe von try-catch sollte man nicht vorhandene Bockmarks abfangen können



  • Danke für die schnelle Antwort. Ich habe auch schon try/catch für diese Problem benutzt. Wenn man allerdings viele Bookmarks überprüft und in einem Dokument nur wenige gebraucht werden, ist der Code nur sehr schwer zu debuggen 🙂
    In der VBA-OLE-Dokumentation von Microsoft habe ich folgendes gefunden:

    If ActiveDocument.Bookmarks.Exists("start") = True Then
        ActiveDocument.Bookmarks("start").Delete
    End If
    

    Es scheint also die Möglichkeit zu bestehen, zu überprüfen, ob ein Bookmark existiert oder nicht. Leider weiß ich nicht, wie ich den VBA-Code in C++ umsetzen soll 😞



  • naja, du könntest die Behandlung der Bookmarks in eine Funktion auslagern, z.B.

    void TForm1::ReplaceBookmark(Variant Selection, String Bookmark, String Text)
    {
    try
      {
      Selection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << Bookmark);
      Selection.OleProcedure("TypeText",(WideString)Text.c_str());
      }
    catch (Exception &E)
      {
      //Fehlermeldung ausgeben
      }
    }
    //Aufruf z.B.
    ReplaceBookmark(WordSelection,"Testbookmark",Edit1->Text);
    

Anmelden zum Antworten