Cannot change bookmarks in MS Word 2013 document

Symptom

A PowerBuilder application uses OLE automation to resolve bookmarks in a DOC or DOCX document or template. This has worked well under MS Word 2007. 

Using PowerBuilder and MS Word 2013, there are errors and no data resolves to the bookmark.

Error occurs at line with this code:

lole_word.activedocument.bookmarks.item (ls_tag_name).range.text = ls_tag_value

Environment

  • PowerBuilder

  • Microsoft Word 2007

  • Microsoft Word 2013

Reproducing the Issue

1. If you don't have MS Word2013, download a trial version.

2. Install MS Word 2013.

3. Unzip bookmark.zip.

4. Open testole.pbw and testole.pbt.

5. Open w_main/bookmark change cb.

6. Verify the location path for the ls_template_file_name

7. Run the app and click on the Bookmark Change cb.

8. Close the app and open the mytts.docx and notice PB did not change/save the bookmark name from case_short_option to MyTest.

The PowerScript code in step 5 is:

oleobjectlole_word
string ls_template_file_name,ls_ext,ls_doc_save_name,ls_columnname,ls_tag_name,ls_tag_value
integer i
long li_step_count,ll_row,li_return,ll_pos

ls_template_file_name = "C:\112957\Test-ASC-Opinion-Template.docx"
ls_doc_save_name = "C:\112957\mytts.docx"

        lole_word = CREATE oleobject
TRY
lole_word.ConnectToNewObject('word.application')
CATCH (oleruntimeerror a)
MessageBox('External Editor - Word Connect Error', 'Error connecting to Microsoft Word. Terminating function.',StopSign!)
DESTROY lole_word
Return -1
END TRY

        // Open the Word Template file

        TRY
lole_word.Documents.open(ls_template_file_name, FALSE, TRUE,FALSE)
CATCH (oleruntimeerror b)
MessageBox('External Editor - Word Template Open Error', 'Error opening Template file with Microsoft Word. Terminating function.',StopSign!)
DESTROY lole_word
Return -1
END TRY

        If ls_ColumnName = ls_columnname Then
        
TRY
ls_tag_name ="case_short_caption"
If lole_word.activedocument.bookmarks.exists(ls_tag_name) Then
//Determine if a Bookmark exists with the column/computed field name, and if so, then replace bookmark with datasource column value
ls_tag_value = "MyTest"
lole_word.activedocument.bookmarks.item(ls_tag_name).range.text = ls_tag_value
lole_word.activedocument.saveas(ls_doc_save_name, 16)
End If

        CATCH (oleruntimeerror d)
MessageBox('External Editor - Word Bookmark Error', "Error locating or replacing Bookmark '" + ls_tag_name + "'.~r~n" + "Error Details: " + "Class: " + d.Class + "~r~n" + "Routine Name: " + d.RoutineName + "~r~n" + "Message: " + d.GetMessage() + "~r~n" + "Line Number: " + string(d.Line) + "~r~n" + "PB Error Num: " + string(d.Number) + "~r~n" + "Text: " + d.Text + "~r~n" + "Description: " + d.Description + "~r~n" + "ObjectName: " + d.ObjectName + "~r~n" + "Source: " + d.Source + "~r~n", StopSign!)

        li_return = -2
END TRY
End IF

Cause

Syntax changes from MS Word 2007 and MS Word 2013

Solution

When using MS Word 2013, change the PowerScript code from:

TRY
lole_word.Documents.open(ls_template_file_name, FALSE, TRUE,FALSE)
CATCH (oleruntimeerror b)
MessageBox('External Editor - Word Template Open Error', 'Error opening Template file with Microsoft Word. Terminating function.',StopSign!)
DESTROY lole_word
Return -1
END TRY

Use the modified PowerScript code with MS Word 2013:

TRY
lole_word.Documents.open(ls_template_file_name, FALSE, TRUE,FALSE) 
lole_word.ActiveWindow.View.ReadingLayout = False 
CATCH (oleruntimeerror b)
MessageBox('External Editor - Word Template Open Error', 'Error opening Template file with Microsoft Word. Terminating function.',StopSign!)
DESTROY lole_word
Return -1
END TRY