![]() |
|
#1
|
|||
|
|||
|
The script below is supposed to highlight certain keywords in the text that was just pasted. The problem is that it's only highlighting the first keyword in the array, without any results for the rest of the keywords. What could be the problem, please? Alex Code:
Dim pasted_content As Word.range
Dim r As Long
Dim Keywords
Keywords = Array("keyword1", "keyword2", "keyword3")
Set pasted_content = Selection.range
pasted_content.Paste
For r = 0 To UBound(Keywords)
With pasted_content.Find
.Text = Keywords(r)
.Format = True
Do While .Execute(Forward:=True) = True
pasted_content.HighlightColorIndex = wdYellow
Loop
End With
Next
|
|
#2
|
||||
|
||||
|
What's wrong with a simple Find/Replace loop, rather than a nested one? Far quicker:
Code:
Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range, arrWords, i As Long
arrWords = Array("keyword1", "keyword2", "keyword3")
Options.DefaultHighlightColorIndex = wdYellow
Set Rng = Selection.Range
With Rng
.Paste
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.Replacement.Text = "^&"
.Replacement.Highlight = True
For i = 0 To UBound(arrWords)
.Text = arrWords(i)
.Execute Replace:=wdReplaceAll
Next
End With
End With
Application.ScreenUpdating = True
End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
|
#3
|
|||
|
|||
|
Very nice, thank you! I have two questions, please...
1. how can I use RGB colors for highlighting? I tried using "Options.DefaultHighlightColorIndex = RGB(190, 190, 190)" but without any success; 2. how can I add an extra condition to the find function so that it will only find (and highlight) those keywords that have not already been highlighted? I tried using ".Font.HighlightColorIndex = wdNoHighlight", but once again, without any results. I am trying to avoid double-highlighting, as for example when I want to highlight keyword "great music" in green and keyword "music" in red. Without a stop in place, you would get "great" highlighted in green, and "music" in red. I'd like both words ("great music") to be shown in green, as a single keyword. Alex |
|
#4
|
||||
|
||||
|
1. You can't - only the 16 indexed highlights can be used.
2. Insert: Code:
.Highlight = False Code:
.Replacement.Highlight = True And, to vary the highlighting, for each expression, use something like: Code:
Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range, arrWords, i As Long, h As Long
arrWords = Array("keyword1 & keyword2", "keyword1", "keyword3")
Set Rng = Selection.Range
With Rng
.Paste
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.Replacement.Text = "^&"
.Highlight = False
.Replacement.Highlight = True
For i = 0 To UBound(arrWords)
h = i Mod 14
If h < 6 Then
h = h + 2
Else
h = h + 3
End If
Options.DefaultHighlightColorIndex = h
.Text = arrWords(i)
.Execute Replace:=wdReplaceAll
Next
End With
End With
Application.ScreenUpdating = True
End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
|
#5
|
|||
|
|||
|
It's really important to be able to select the highlighting colors from a large color gamut. I will only use three colors (depending on the importance of the highlighted keyword), and these colors need to be very shallow/light, almost unnoticeable. The colors in the WdColorIndex are very strong. For red, there are only two options, with no light option at all.
While searching Google, I found Greg Maxey's highlighter script, which is based on changing the text shading (Shading.BackgroundPatternColor), giving you endless options in terms of color gamut: gregmaxey.com/word_tip_pages/highlighter.html Paul, is there a way to make your initial version of the script work with 'Shading.BackgroundPatternColor' instead of 'HighlightColorIndex'? I tried to do that myself, but nothing seemed to work - i'm simply lost here. This would be very helpful! Thank you, Alex |
|
#6
|
||||
|
||||
|
Since you can't us a BackgroundPatternColor property as a Find parameter, you'll need to revert to a nested loop. Try:
Code:
Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range, arrWords, i As Long, RGB As Long
arrWords = Array("keyword1 & keyword2", "keyword1", "keyword2", "keyword3")
Set Rng = Selection.Range
Rng.Paste
For i = 0 To UBound(arrWords)
Select Case i
Case 0: RGB = wdColorGray05
Case 1: RGB = wdColorPaleBlue
Case 2: RGB = wdColorLightOrange
Case 3: RGB = wdColorPink
End Select
With Selection
With .Find
.ClearFormatting
.Text = arrWords(i)
.Replacement.Text = ""
.Format = False
.Forward = True
.Wrap = wdFindStop
End With
Do While .Find.Execute
If .InRange(Rng) = False Then Exit Do
If .Shading.BackgroundPatternColor = wdColorAutomatic Then .Shading.BackgroundPatternColor = RGB
.Collapse wdCollapseEnd
Loop
End With
Rng.Select
Next
Application.ScreenUpdating = True
End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
|
#7
|
|||
|
|||
|
Brilliant, thank you!
One more thing, and I'd like to point out that I'm asking this mostly because I know there will be other people that will find this thread and may use your code for themselves. Today I spend about half an hour searching Google for Word highlighters, and while I found quite many, almost no one had the ability to use RGB colors. Except for Greg's Highlighter, they all used the 'HighlightColorIndex' property. As you wrote it, I understand that each keyword in the 'arrWords' array has a corresponding color in the 'Case 0,1,2,etc' RGB list. So there's a keyword/color pair, and I hope I'm not mistaken. Please let me know if I am. Like me, I think most people who use such highlighters need to assign a single color to an entire list of keywords. Basically, you want ten keywords to be highlighted in red, 15 keywords in blue, and so on. With this in mind, I think the best approach would be to have multiple arrays, each one with a corresponding color. Something like this: arrWords1 = Array("keyword1", "keyword2") arrWords2 = Array("keyword1", "keyword2", "keyword3") arrWords3 = Array("keyword1", "keyword2", "keyword3", "keyword4", "keyword5", "keyword6") Then, the RGB list should basically assign one color to each array: arrWords1: RGB (10, 175, 150) arrWords2: RGB (74, 18, 188) arrWords3: RGB (150, 175, 190) What do you think? This is what I am looking for, and I'm sure this solution would be the closest one to most user's needs. Most probably, this is just a minor change to your code, but with lots of added value. Alex |
|
#8
|
||||
|
||||
|
Quote:
Quote:
Quote:
• 15 blue, 15 red, and so on, then padding out the arrWords array with empty elements for keyword groups that have less than 15 items; or • only the required number of colour definitions to match what's in the arrWords array, either of which could be used in conjunction with specifying a range of values for 'i' in the Select Case statement. For example: Code:
Select Case i
Case 0 - 14: RGB = wdColorRed
Case 15 - 29: RGB = wdColorOrange
Case 30 - 44: RGB = wdColorYellow
Case 44 - 59: RGB = wdColorGreen
Case 60 - 74: RGB = wdColorBlue
End Select
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
|
#9
|
|||
|
|||
|
I'm sorry, I was under the impression the changes would be minimal in terms of coding.
Anyhow, I did manage to adapt it precisely to my needs, so this has been very helpful! Thank you! Alex |
|
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| I am trying to delete text of any format between two bold, recurring keywords or symbols | qubie | Word VBA | 8 | 03-04-2020 03:20 PM |
how do I make pasted text the same size as the text it's being pasted into?
|
David Lee | Word | 6 | 08-16-2015 10:46 AM |
Help with finding multiple keywords in a single document then highlight
|
navyguy | Word | 2 | 01-03-2014 12:48 PM |
| Trying to highlight pasted text in a macro | goldengate | Word VBA | 0 | 09-14-2010 09:41 PM |
| find - reading highlight - highlight all / highlight doesn't stick when saved | bobk544 | Word | 3 | 04-15-2009 03:31 PM |