Using Word Automation - highlight a word + insert a comment


Can someone help me out? Im trying to open a word document and search for certain words in the document, and then highlight (make the background yellow) them, and add a comment. However, I don't know which functions I need to use for highlighting or adding a comment. I've only gotten so far as to calling Range.Find.Execute(), but I don't know what to do next.

Who is Participating?
GrahamSkanConnect With a Mentor RetiredCommented:
I would have thought that it would work. The operation depends on the Word Object model, and I would be surprised if the Find does not set the Range object to the found text in C#.

I have tried to replicate what you are doing in VBA in order to assure myself on the way that it works in that environment.  The only point I would make, and I don't know if it's relevant to your problem, is that the GoTo probably isn't necessary.
Sub FindAndComment()
    Dim oWordApp As Word.Application
    Dim oWordDoc As Word.Document
    Dim oRange As Word.Range
    Dim success As Boolean
    Dim strFindText As String
    Dim strComment As String
    strFindText = "fox"
    strComment = "Animal"
    Set oWordDoc = oWordApp.Documents.Open(documentPath)
    Set oRange = oWordDoc.Range
    success = oRange.Find.Execute(strFindText, , , , , True, True)
    If success Then
       oWordDoc.Comments.Add oRange, strComment
    End If
    oWordDoc.Close wdSaveChanges
End Sub

Open in new window

You can first set the default highlight colour to yellow.
WrdApplication.Options.DefaultHighlightColorIndex = wdYellow

In the Find, set the .Format property of the Find object to True, and the .Replacement.Highlight to True.

I don't know C#, but this is VBA for adding a Comment if the Find is successful.
Dim comm  As Word.Comment
Dim wrdDoc as Word.Document
If MyRange.Find.Execute() then
   Set comm = ActiveDocument.Comments.Add(MyRange, MyCommentText)
End If

Open in new window

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

muskad202Author Commented:
The code for highlight worked great - thanks!
Regarding adding the comments, what happens is, I initially start off with the range spanning the entire .doc (since i dont knoe where the word i want to find lies). If I then pass in the range to Comments.Add(), it ends up adding the comment for the entire document, instead of just the word. How do I work around this?

Perhaps you could post your code. I have worked with C and Javascript, so I could probably read it well enough.
muskad202Author Commented:
The code is shown below.
The problem is that "range" is initialized to be the entire document, and so when i add a comment, it gets associated with the entire range. I guess what i need to do is - for each successful occurrence for the Find() operation, i need the range corresponding only to that, and then add a comment to that new range, instead of the originall range within which i did the Find().
oWordDoc = OpenDocument(documentPath, false);
range = oWordDoc.Range(ref missing, ref missing);
object item = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage;
object whichItem = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst;
object forward = true;
object matchAllWord = true;
range.Document.GoTo(ref item, ref whichItem, ref missing, ref missing);
bool success = range.Find.Execute(ref oFindText, ref missing, ref matchAllWord, ref missing, ref missing, ref missing, ref forward, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
if (success)
   oWordDoc.Comments.Add(range, ref oComment);
oWordDoc.Close(ref oTrue, ref missing, ref missing);

Open in new window

I have run up VS.Net and tried C# for the first time by pasting your code into a button click event.

It gives 28 build errors because it doesn't know what 'oWordDoc', 'range', 'oFindText' and 'Office' are.

I guess that they have to be 'declared' somehow. Is that easy for you to explain, or would you rather wait for a C# expert to carry on with the question?
muskad202Author Commented:
I've attached my entire solution here. It's pretty small, so you can give it a try if you want.
muskad202Author Commented:
I just tried it - if I remove the GoTo, it works perfect! Thanks!!
Thanks. I'll study your solution anyway.Perhaps it's time I got involved with .net
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.