2011-02-10 6 views
9

북마크를 텍스트로 바꿀 것을 권장하는 C# .net 코드는 매우 직설적으로 나타나며 많은 인터넷 사이트에서 동일한 코드를 보았습니다 (2009 년 9 월 게시물에서 귀하의 것을 포함하여) 그러나 오류를 지나칠 수 없습니다.범위를 삭제할 수 없습니다. Microsoft.Office.Interop.Word.Range.set_Text (String prop)

범위를 삭제할 수 없습니다. Microsoft.Office.Interop.Word.Range.set_Text (문자열 소품)

에서 (필자는 윈도우 7 및 Word 2010 14.0와 VS 2010를 사용하고 있습니다).

내 코드 :

private void ReplaceBookmarkText(Microsoft.Office.Interop.Word.Document doc, string bookmarkName, string text) 
     { 
      try 
      { 
       if (doc.Bookmarks.Exists(bookmarkName)) 
       { 
        Object name = bookmarkName; 
        // throws error 'the range cannot be deleted' 
        doc.Bookmarks.get_Item(ref name).Range.Text = text; 
       } 
      } 

답변

8

대신, 같은 시도를 직접 범위를 변경 :

Bookmark bookmark = doc.Bookmarks.get_Item(ref name); 

//Select the text. 
bookmark.Select(); 

//Overwrite the selection. 
wordApp.Selection.TypeText(text); 

일예를 대신 Word 응용 프로그램 인스턴스를 사용하여 문서를 변경하십시오.

+0

이 현상은 작동하지 않으나 Late Binding 대안을 가지고 있지 않습니까? – Schuere

1
if (doc.Bookmarks.Exists(name)) 
    { 
     Word.Bookmark bm = doc.Bookmarks[name]; 
     bm.Range.Text = text 
    } 

이 방법으로 기존 책갈피의 전체 텍스트를 바꾸면 작동하지만 기억이 사라집니다. 기존 북마크의 첫 번째 문자를 대체 할 때마다 (기존 북마크로 대체하더라도) 북마크가 사용됩니다. 내가 발견 한 것은 (마이크로 소프트가 승인 한 방법이라고 주장하지는 않지만) 다음과 같은 내용입니다.

if (doc.Bookmarks.Exists(name)) 
    { 
     Word.Bookmark bm = doc.Bookmarks[name]; 
     Word.Range range = bm.Range.Duplicate; 
     bm.Range.Text = text;     // Bookmark is deleted, range is collapsed 
     range.End = range.Start + text.Length; // Reset range bounds 
     doc.Bookmarks.Add(name, range);   // Replace bookmark 
    } 
+0

이것은 여전히 ​​"범위를 삭제할 수 없습니다"라는 오류를 발생시킵니다. COMException – Schuere

+0

어떤 상황에서 COMException이 발생합니까? –

+0

필드 설정이있는 텍스트 양식 필드 책갈피. ==>이 필드를 설정하면 Office에서 올바른 책갈피를 만들지 못했습니다. 여전히 INSERT => Bookmark => "Select Bookmarks"=> Add를해야합니다. 올바른 책갈피를 만들려면 (한숨 ...) + 편집 : 나는이 답변을 upvote 올바른 것입니다. – Schuere

관련 문제