![]() |
|
#1
|
|||
|
|||
![]()
Hello,
I'm trying to write a simple macro that determines if a Section number within the document's text has a field code. In other words, did the author use Microsoft Word's "cross-reference" feature. For example, "Please see Section 1 for more details." Does the "1" have a field code? If it does then turn the font blue. If it doesn't then turn the font red and add a comment. I tried to mimic this application based off of a similar question, where I was looking for "Table n". However, it seems there is something unique about "Section n" vs "Table n". That solution is located here. I believe the format is the word "Section" + non-breaking space + number. Therefore, my search string I have tried was: aRng.Find.Text = "Section?[0-9.]{1,}" However, this isn't working. It finds the "Section n" if Word's cross-reference isn't used, but it misses the properly formatted one that uses Word's cross reference feature. My full code is below. I am attaching a simple Word file to illustrate the issue. The first paragraph has "Section 2" and was properly formatted with Word's cross-reference feature. Therefore, the font for "2" should be turned blue. The third paragraph has "Section 1.1", which was not properly formatted. Therefore, its font should be turned red and a comment added. Thank for you in advance for any assistance! Roy Code:
Sub myMacro() Dim aRng As Range Set aRng = ActiveDocument.Range With aRng.Find .ClearFormatting .Text = "Section^s[0-9.]{1,}" .MatchWildcards = True Do While .Execute ' Loop until Word can no longer find the search string aRng.MoveStart Unit:=1, Count:=8 'wdCharacter = 1 aRng.MoveEnd Unit:=1, Count:=1 If aRng.Fields.Count > 0 Then 'there is a field If InStr(1, aRng.Fields(1).Code.Text, "_Ref") > 0 And aRng.Font.Color <> vbBlue Then aRng.Font.Color = vbBlue End If Else aRng.Font.Color = vbRed ActiveDocument.Comments.Add Range:=aRng, Text:="Missing cross-reference field code" End If '' aRng.Collapse Direction:=0 'wdCollapseEnd Loop End With End Sub |
#2
|
||||
|
||||
![]()
Try this version. It is more correct to search for a Ref field type rather than whether the field text includes "_Ref" somewhere in it.
Code:
Sub myMacro() Dim aRng As Range, rngNumber As Range Set aRng = ActiveDocument.Range With aRng.Find .ClearFormatting .Text = "Section?[0-9.]{1,}" .MatchWildcards = True Do While .Execute ' Loop until Word can no longer find the search string Set rngNumber = aRng.Duplicate rngNumber.Start = aRng.Words(2).Start If rngNumber.Fields.Count > 0 Then 'there is a field If rngNumber.Fields(1).Type = 3 Then rngNumber.Font.ColorIndex = vbBlue 'wdFieldRef=3 Else rngNumber.Font.Color = vbRed ActiveDocument.Comments.Add Range:=rngNumber, Text:="Missing cross-reference field code" End If aRng.Collapse Direction:=0 'wdCollapseEnd Loop End With End Sub
__________________
Andrew Lockton Chrysalis Design, Melbourne Australia |
#3
|
|||
|
|||
![]()
Thanks, Guessed! Unfortunately, it still doesn't catch the "Section n", where the Section n was entered as a true cross-reference.
Roy |
#4
|
||||
|
||||
![]()
You are right. The Find is not hitting those ones so the If statement is pointless. I am surprised by this as I thought it would find those as numbers.
It appears you need to toggle the field codes and then you can search for those instances with a .Text = "Section?^d"
__________________
Andrew Lockton Chrysalis Design, Melbourne Australia |
#5
|
|||
|
|||
![]()
Thank you for your continued help! That will certainly catch the properly formatted ones, but unfortunately, will miss the others. The only solution I have come up with is to do two rounds on searching for “Section [0-9.]{1,}” and one searching for “Section?^d”. Not very elegant but it works.
|
#6
|
||||
|
||||
![]()
Based on your example, the following modification to Andrew's code should work
Code:
Sub Macro2() Dim aRng As Range Set aRng = ActiveDocument.Range With aRng.Find .ClearFormatting .Text = "Section" .MatchWildcards = True Do While .Execute ' Loop until Word can no longer find the search string aRng.MoveEnd wdWord, 2 aRng.MoveEndWhile "0123456789." aRng.Start = aRng.Words(2).Start If aRng.Fields.Count > 0 Then 'there is a field If aRng.Fields(1).Type = 3 Then aRng.Font.ColorIndex = wdBlue 'wdFieldRef=3 Else aRng.Font.ColorIndex = wdRed ActiveDocument.Comments.Add Range:=aRng, Text:="Missing cross-reference field code" End If aRng.Collapse 0 'wdCollapseEnd Loop End With Set aRng = Nothing End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#7
|
|||
|
|||
![]()
Hi Graham,
Thanks for the help! We're almost there! ![]() Sorry for the trouble, but I really do appreciate the assistance! Thanks, Roy |
#8
|
||||
|
||||
![]()
OK the following should address that issue
Code:
Sub Macro2() Dim aRng As Range Set aRng = ActiveDocument.Range With aRng.Find .ClearFormatting .Text = "Section" .MatchWildcards = True Do While .Execute aRng.End = aRng.End + 1 aRng.Collapse 0 aRng.MoveEndWhile "0123456789." If aRng.Fields.Count > 0 Then If aRng.Fields(1).Type = 3 Then aRng.Font.ColorIndex = wdBlue Else If Len(aRng) > 0 Then aRng.Font.ColorIndex = wdRed ActiveDocument.Comments.Add _ Range:=aRng, _ Text:="Missing cross-reference field code" End If End If aRng.Collapse 0 Loop End With MsgBox "Done!", vbInformation Set aRng = Nothing End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#9
|
|||
|
|||
![]()
Many thanks, Graham and Andrew! You guys are ROCK STARS!!!
|
![]() |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Field Code: Page number for current StyleRef | Cosmo | Word | 4 | 11-15-2020 03:54 PM |
Word 2016: How do I change a REF field code to display a reference to a Roman number as Arabic | Peggy Sue | Word | 1 | 08-15-2017 09:50 PM |
![]() |
welcometocandyland | Word VBA | 4 | 02-08-2017 06:53 PM |
![]() |
gn4619 | Word VBA | 2 | 11-23-2015 11:00 PM |
![]() |
palanski | Word | 3 | 10-15-2014 01:54 PM |