![]() |
#1
|
||||
|
||||
![]()
I have a long file that contains about 6 tables containing data with endnotes and cross references to endnotes (the source). This file is to have each table copied and pasted into different places in a larger document (the target), which also contains endnotes and cross references. The two files on their own are fine and are correct formatted using Word’s cross references and endnotes. When I do a Ctrl-A and F9 to the target document, the endnotes do update their numbers in the original and pasted in sections and the cross references do work, but, the cross references are higher up in the document (towards page 1), than the endnote the cross reference is referring to.
Is there any way to fix this so the first cross reference to an endnote is an endnote, and all further references below the first instance are cross references? |
#2
|
||||
|
||||
![]()
So what you want to do is to find NOTEREF fields whose location precedes the note to which they refer, then swap them around. Correct? Should be quite doable - it's just a matter of comparing the ranges for the two items, then using cut & paste for the re-locations.
I'm working on a uni assignment this week, so it'd probably be a day or two before I could take more of a look at it.
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
||||
|
||||
![]()
Hi Boatwrench,
Try: Code:
Sub Test() Application.ScreenUpdating = False Dim Fld As Field, FtNtRng As Range, FldRng As Range, i As Long With ActiveDocument For Each Fld In .Fields If Fld.Type = wdFieldNoteRef Then Set FldRng = Fld.Code i = Fld.Result While FldRng.Fields.Count = 0 FldRng.End = FldRng.End + 1 Wend Set FtNtRng = .Footnotes(i).Reference If FtNtRng.End > FldRng.End Then FldRng.Fields(1).Delete FtNtRng.Cut FldRng.Paste FtNtRng.InsertCrossReference ReferenceType:="Footnote", ReferenceKind:= _ wdFootnoteNumberFormatted, ReferenceItem:=i, InsertAsHyperlink:=True If FldRng.Characters.First = " " Then FldRng.Characters.First = vbNullString .Fields.Update End If End If Next End With Application.ScreenUpdating = True End Sub Code:
Sub Test() Application.ScreenUpdating = False Dim Fld As Field, EndNtRng As Range, FldRng As Range, i As Long With ActiveDocument For Each Fld In .Fields If Fld.Type = wdFieldNoteRef Then Set FldRng = Fld.Code i = Fld.Result While FldRng.Fields.Count = 0 FldRng.End = FldRng.End + 1 Wend Set EndNtRng = .Endnotes(i).Reference If EndNtRng.End > FldRng.End Then FldRng.Fields(1).Delete EndNtRng.Cut FldRng.Paste EndNtRng.InsertCrossReference ReferenceType:="Endnote", ReferenceKind:= _ wdEndnoteNumberFormatted, ReferenceItem:=i, InsertAsHyperlink:=True If FldRng.Characters.First = " " Then FldRng.Characters.First = vbNullString .Fields.Update End If End If Next End With Application.ScreenUpdating = True End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#4
|
||||
|
||||
![]()
Thank you very much Macropod. you are correct, it is document based endnoting. As soon as I get this document in my hands again, I will try this code out and get back to you.
|
#5
|
||||
|
||||
![]()
Hello again. I finally got the document back again and ran your endnote version of the code. The code did not work properly and gave an error. I am currently putting together a sample file and will post ASAP.
|
#6
|
||||
|
||||
![]()
Attached are the original and the fixed versions of the sample file. The original has the endnotes and cross references mixed and not in order, the final has the endnotes first and the cross references that correspond to the correct endnote later. The endnotes and cross references are also in numerical order in the fixed version. This sample is built off of the actual document. The actual document is 105 pages long, contains over 100 endnotes and over 200 cross references. Thank you for your help with this.
|
#7
|
||||
|
||||
![]()
I think the code got tripped up with the multiple cross-references to the same endnotes. Try:
Code:
Sub Test() Application.ScreenUpdating = False Dim Fld As Field, EndNtRng As Range, FldRng As Range, i As Long, j As Long, Rng As Range, RngFld As Field With ActiveDocument For Each Fld In .Fields If Fld.Type = wdFieldNoteRef Then Set FldRng = Fld.Code i = Fld.Result While FldRng.Fields.Count = 0 FldRng.End = FldRng.End + 1 Wend Set EndNtRng = .Endnotes(i).Reference If EndNtRng.End > FldRng.End Then FldRng.Fields(1).Delete EndNtRng.Cut FldRng.Paste FldRng.Style = "EndNote Reference" j = FldRng.Endnotes(1).Index EndNtRng.InsertCrossReference ReferenceType:="Endnote", ReferenceKind:= _ wdEndnoteNumberFormatted, ReferenceItem:=j, InsertAsHyperlink:=True If FldRng.Characters.First = " " Then FldRng.Characters.First = vbNullString Set Rng = FldRng Rng.End = ActiveDocument.Range.End If i <> j Then For Each RngFld In Rng.Fields If RngFld.Type = wdFieldNoteRef Then If RngFld.Result = i Then Set FldRng = RngFld.Code While FldRng.Fields.Count = 0 FldRng.End = FldRng.End + 1 Wend FldRng.Fields(1).Delete FldRng.InsertCrossReference ReferenceType:="Endnote", ReferenceKind:= _ wdEndnoteNumberFormatted, ReferenceItem:=j, InsertAsHyperlink:=True End If End If Next End If End If .Fields.Update End If Next End With Application.ScreenUpdating = True End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#8
|
||||
|
||||
![]()
Thank you for your code Macropod. In my sample document, it worked perfectly except for the ordering like you had said. However, in the actual document it didn't work and would throw a run-time error 13, type mismatch at the line ' i = Fld.Result ', hovering over it reveals the field is "Error! Bookmark not defined". I created another sample document that causes the same error as the actual document. I have experimented with this and cannot cause the links not to break as they are. I thought it should be a matter of doing a select all and update all fields but I have not found where in the code to put that so it works.
Thank you for your help and continued help on this. The actual document I was working on is out of my hands again (I had to do the fixes to it manually), but am certain it will or another like it will come to me soon. |
#9
|
||||
|
||||
![]()
OK, try it this way. The new code should also be more efficient than the old, plus (unlike the old) it'll process cross-references in footnotes, endnotes, textboxes, etc.
Code:
Sub Test() Application.ScreenUpdating = False Dim Fld As Field, EndNtRng As Range, FldRng As Range, i As Long, j As Long Dim Rng As Range, StrOld As String, StrNew As String With ActiveDocument For Each Fld In .Fields If Fld.Type = wdFieldNoteRef Then Set FldRng = Fld.Code i = Fld.Result While FldRng.Fields.Count = 0 FldRng.End = FldRng.End + 1 Wend Set EndNtRng = .Endnotes(i).Reference If EndNtRng.End > FldRng.End Then StrOld = FldRng.Fields(1).Code.Text FldRng.Fields(1).Delete EndNtRng.Cut FldRng.Paste FldRng.Style = "EndNote Reference" j = FldRng.Endnotes(1).Index EndNtRng.InsertCrossReference ReferenceType:="Endnote", ReferenceKind:= _ wdEndnoteNumberFormatted, ReferenceItem:=j, InsertAsHyperlink:=True If FldRng.Characters.First = " " Then FldRng.Characters.First = vbNullString StrNew = EndNtRng.Words.First.Fields(1).Code.Text ActiveWindow.View.ShowFieldCodes = True For Each Rng In .StoryRanges With Rng.Find .ClearFormatting .Replacement.ClearFormatting .Text = StrOld .Replacement.Text = StrNew .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = True .MatchWholeWord = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=wdReplaceAll End With Rng.Fields.Update Next ActiveWindow.View.ShowFieldCodes = False End If End If Next End With Application.ScreenUpdating = True End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
![]() |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
![]() |
kenglade | Word | 22 | 09-14-2012 04:10 PM |
![]() |
kenglade | Word | 4 | 12-03-2011 01:26 PM |
Index entries in endnotes | perhj | Word | 0 | 06-19-2011 09:28 AM |
![]() |
judicial85 | Word | 1 | 03-08-2011 10:33 PM |
Problems with pasting into another document | OneDayJD | Word | 0 | 04-25-2010 07:51 PM |