Search code examples
vb.netvisual-studiooffice-interopwinforms-interop

MS Word runs on background and requests documents to be saved even though it is already saved


I have a procedure that creates a PDF file according to an ms word template and its data is retrieved from a database.

It works fine, creates a PDF file perfectly , no run time errors. The problem is that whenever I shut off the computer, ms word prevents the shutdown and if I press cancel ms word shows a message;

enter image description here

The code goes like this;

   Dim wordApp As Word.Application
   Dim templateBookmarks As Word.Bookmarks
   Dim templateName As String
   Dim template As Word.Document
   'Some other variables for computations

   wordApp = CreateObject("Word.Application")
   sourceTable = New DataTable
   'Some other procs to fill the data table

   templateName = "Foo Template.docx" 
   template = wordApp.Documents.Add(templatePath & templateName)
   templateBookmarks = template.Bookmarks
   templateBookmarks.Item("sample bookmark").Range.Text = "foo"

   'Then fills the table in the template like...
   template.Tables(1).Cell(1, 1).Range.Text = dataSource.Rows(0).Item(0)

  'Then saves the document as a pdf
  Dim saveName As String = "sample file"
  template.SaveAs2(savePath & saveName, Word.WdSaveFormat.wdFormatPDF)

I have tried to force garbage collection for the word COM resources, as well as changing the template from an actual document i.e. docx to a word template .dotx. I also tried the method Quit() but it only shows the ms word message much earlier. This is the first time I needed to use interop so pardon if I don't have much idea about it.

The files I needed are saved, the only problem is the ms word message and unsaved and unnecessary files e.g. Document1,Document2,Document3 that seems to be created aside from the required PDF


Solution

  • Use the Document.Close method which closes the specified document after saving files using the PDF file format. It allows specifying the SaveChanges parameter which specifies the save action for the document. Can be one of the following WdSaveOptions constants: wdDoNotSaveChanges, wdPromptToSaveChanges, or wdSaveChanges.

    On Error GoTo errorHandler 
    
    ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
    
    errorHandler: 
    If Err = 4198 Then MsgBox "Document was not closed"