このコード サンプル:
object miss = System.Reflection.Missing.Value;
object Visible = true;
Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.Application();
Document report = WordApp.Documents.Add(ref miss, ref miss, ref miss, ref miss);
Paragraph para = report.Content.Paragraphs.Add(ref miss);
String prefix = "Prefix";
String suffix = "text after the colon";
String allText = prefix + ":" + suffix;
para.Range.Text = allText;
para.Range.Font.Bold = 0;
para.Range.Font.Size = 12;
Object start = para.Range.Start;
Object end = para.Range.Start + allText.IndexOf(":");
Range bold = report.Range(ref start, ref end);
bold.Bold = 1;
para.Range.InsertParagraphAfter();
object filename = "test.doc";
report.SaveAs(ref filename, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
object saveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdPromptToSaveChanges;
object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdWordDocument;
object routeDocument = true;
((_Document)report).Close(saveChanges, originalFormat, routeDocument);
次のテキストを含む Word ドキュメントが正常に作成されます。
プレフィックス: コロンの後のテキスト
ただし、このコード:
object miss = System.Reflection.Missing.Value;
object Visible = true;
Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.Application();
Document report = WordApp.Documents.Add(ref miss, ref miss, ref miss, ref miss);
Paragraph para = report.Content.Paragraphs.Add(ref miss);
String prefix = "Prefix";
String suffix = "text after the colon\n"; // <-- Note the additional newline in the string
String allText = prefix + ":" + suffix;
para.Range.Text = allText;
para.Range.Font.Bold = 0;
para.Range.Font.Size = 12;
Object start = para.Range.Start;
Object end = para.Range.Start + allText.IndexOf(":");
Range bold = report.Range(ref start, ref end);
bold.Bold = 1;
para.Range.InsertParagraphAfter();
object filename = "test.doc";
report.SaveAs(ref filename, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
object saveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdPromptToSaveChanges;
object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdWordDocument;
object routeDocument = true;
((_Document)report).Close(saveChanges, originalFormat, routeDocument);
COMException: Value out of range
次の行で例外をスローします。
Range bold = report.Range(ref start, ref end);
これら 2 つのコード スニペットの唯一の違いは、この行の改行文字です。
String suffix = "text after the colon\n"; // <-- Note the additional newline in the string
スタックトレース
参考になるかわかりませんが、これはエラーの完全なスタック トレースです。
at Microsoft.Office.Interop.Word.DocumentClass.Range(Object& Start, Object& End)
at Sandbox.Program.Main(String[] args) in C:\Users\ricardo\Documents\Visual Studio 2010\Projects\Sandbox\Sandbox\Program.cs:line 48
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
デバッグ結果
繰り返しますが、役に立たないかもしれませんが、各コード サンプルをデバッグすると、これらの結果が得られます。最初の結果では、例外が発生する行の直前の変数の値は次のとおりです。
para.Range.Text == "Prefix: text after the colon\r"
start == 0
end == 0
2 番目の結果の値は次のとおりです。
para.Range.Text == "\r"
start == 28
end == 34
明らかに、何かが間違っていますが、正確に何を特定することはできません。