Ü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);