I have 41 large Word documents (Titles) that I am trying to create using InterOp.
There are about 700 chapters in total. Each of the 41 gets some of the chapters.
There are a total of about 31,000 paragraphs that are spread out among the chapters.
In Visual Basic .Net I:
The application runs as expected, except... After about Title 21 the documents do not appear in the folder where I am saving them.
Today I watched this process run. When I noticed that I was on title 23 but the folder only had Title 21 I put a break point on the line that saved the title to check if the path or file name were corrupted. They weren't. I executed the line with the save and went to the folder and refreshed it. Not there.
Next run I started with the first title missing and once again it ran for a while with no problems, but then later did the same thing.
I have no clue of what to do next.
edit:
Cindy - Some things I can answer right now. VS2012, Office 2010. The target folder is on a network drive. The code is in a Try-Catch, but as I pointed out in the post the Save executes. I do suspect that it is some cleanup issue. I modified the code to quit word after each title to see if that helps. The big problem is that this is hours of processing before the failure occurs. I started the new version before I left work and won't know if the changes helped until Monday. If I am still having the issue on Monday I will post the bare bones code then.
edit: I am making progress, but still have errors sometimes. The code that is called over 30,000 times looks like this
Private Sub CreateWordDoc(fileToOpen As String, savePath As String)
' Exit Sub 'test '
If MSWord Is Nothing Then
MSWord = New Word.Application
MSWord.Visible = False
End If
'
Dim doc As Word.Document = MSWord.Documents.Open(FileName:=fileToOpen.ToString, Visible:=False, Format:=Word.WdOpenFormat.wdOpenFormatWebPages, AddToRecentFiles:=False)
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
'speed up word
With doc.Application
.Options.Pagination = False
.ScreenUpdating = False
End With
'set up find
Dim fnd As Word.Find = doc.Content.Find
fnd.Format = True
fnd.Forward = True
fnd.Wrap = Word.WdFindWrap.wdFindContinue
showStatus("Formatting tabs")
fnd.Text = XStructFormatFor.tabCHinDoc
fnd.Replacement.Text = ControlChars.Tab
Dim found As Boolean = fnd.Execute(Replace:=Word.WdReplace.wdReplaceAll)
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
showStatus("Formatting spaces")
fnd.Text = XStructFormatFor.wordNBSPch
fnd.Replacement.Text = " "
found = fnd.Execute(Replace:=Word.WdReplace.wdReplaceAll)
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
fnd = Nothing
doc.SelectAllEditableRanges()
doc.Range.Copy()
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
doc.Close(SaveChanges:=Word.WdSaveOptions.wdDoNotSaveChanges)
'
doc = Nothing
'template with macros
Dim ofile As String = IO.Path.Combine(IO.Path.GetDirectoryName(pthExec), "DocTempl.dotm")
docTmpl = MSWord.Documents.Open(ofile.ToString, AddToRecentFiles:=False)
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
'speed up word
With docTmpl.Application
.Options.Pagination = False
.ScreenUpdating = False
End With
docTmpl.SelectAllEditableRanges()
showStatus("Macros")
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
docTmpl.Range.PasteAndFormat(Word.WdRecoveryType.wdFormatOriginalFormatting)
MSWord.Visible = True
'macros run when visible
Try
docTmpl.Windows(1).WindowState = Word.WdWindowState.wdWindowStateNormal
'this code and the associaed macro are
'to make lines in table be 1/4 pt.
showStatus("Formatting Table - check Word status bar")
docTmpl.Application.Run("TableLines")
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
showStatus("Formatting Paragraphs")
docTmpl.Application.Run("SetParaNorm")
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
showStatus("Formatting Paragraphs Common")
docTmpl.Application.Run("SetParaCommon")
'
Threading.Thread.Sleep(x80010001FixSleepVal)
'
'
MSWord.Visible = False
docTmpl.SaveAs2(FileName:=savePath.ToString, FileFormat:=Word.WdSaveFormat.wdFormatDocumentDefault, AddToRecentFiles:=False)
docTmpl.Close(Word.WdSaveOptions.wdDoNotSaveChanges)
docTmpl = Nothing
If tempFilesL.Count > 500 Then
CloseMSWord(True)
TempFileLimit()
End If
showStatus("")
Catch ex As Exception
AddActivity("ERROR ---> " & ex.Message)
thisApp.GALog.WriteException(ex, TraceEventType.Error, "Macro error")
End Try
End Sub
The thread sleeps were from an article I found, and they do appear to help. Here are some refs.
'Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED)).
'happens occasionally
'see - http://stackoverflow.com/questions/20638978/call-was-rejected-by-callee-exception-from-hresult-0x80010001-rpc-e-call-rej
'and
'http://blogs.artinsoft.net/Mrojas/archive/2012/09/28/Office-Interop-and-Call-was-rejected-by-callee.aspx
Today I made it through about 10,000 sections before I had any error.
If you follow all the links, for all the titles and chapters here, Revised Statutes you will get an idea of what I am doing. FWIW - two weeks ago I could barely spell Interop, and now I am trying to produce documents that will literally fill 20 Stephen King size novels.
There is a loop on the outside that feeds the code you see. It takes care of releasing the Word app. Two weeks ago the first issue I uncovered and fixed was having multiple instances of the Word app. Today there is only one instance of Word running at anytime.
If you notice there is a commented Exit Sub at the beginning. This morning I ran it with the Exit Sub un-commented for several hours to make certain that the code I posted caused the problem. It ran through the list several times without a problem. It was when I commented it out, that it threw an exception after about 10,000 sections. The section processed later without issue.
I have ran this locally and using a network drive, same problem.
User contributions licensed under CC BY-SA 3.0