Solved

Detect invalid cross-references using VBA

Posted on 2013-11-06
10
947 Views
Last Modified: 2013-11-11
Dear Experts:

I wonder whether it is possible by means of VBA ...

... to validate a REF-Field, ie. whether the Reference Source exists or not (can be found or not).

In the current document ...
... I created a lot of cross-references that all point to bookmarked text.
... e.g. {REF bookmark_90 \h} or  {REF bookmark_91 \h}
... These cross-references are all listed in a (1) table

There are lots of bookmarks where the reference source could not be found, ie. cross-references that point to non-existing bookmarks.

Is it possible to run a macro that ...

... detects the row of the current table where the first error occurs and then
... sets a range till the end of the current table and ...
... deletes these rows (this range)

There are never any valid references in between, ie. if the first error ( Error: Reference Source could not be found!) occurs, it continues down to the last row.

This screenshot concisely explains my problem

Reference-Source-not-found.tif

Help is much appreciated. Thank you very much in advance.

Regards, Andreas
0
Comment
Question by:AndreasHermle
  • 7
  • 3
10 Comments
 
LVL 50

Accepted Solution

by:
Rgonzo1971 earned 500 total points
ID: 39626733
Hi,

pls try
Sub Macro()
'
For Each fld In ActiveDocument.Fields
    If Split(fld.Result.Text, " ")(0) = "Fehler!" Then
        fld.Result.Rows.Delete
    End If
Next
End Sub

Open in new window

Regards
0
 

Author Comment

by:AndreasHermle
ID: 39626974
Hi Rgonzo,

great this did the trick! Thank you very much for your swift and professional support.

There is one thing I still would like to address:

Is it possible to restrict this row deleting to ....
... just the currently selected table, which happens to be the first table in the document.

Regards, Andreas
0
 

Author Comment

by:AndreasHermle
ID: 39627007
Hi Rgonzo,

I came up with my own code, but as a matter of act I can detect no increase in speed.

I have many more fields in this document and below macro still seems to iterate thru all the fields in the whole document.


Sub Macro_2()

Dim fld As Field
Dim tbl As Table

For Each fld In ActiveDocument.Tables(1).Range.Fields

    If Split(fld.Result.Text, " ")(0) = "Fehler!" Then
        fld.Result.rows.Delete
    End If

Next
End Sub

Open in new window

0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
LVL 50

Expert Comment

by:Rgonzo1971
ID: 39627069
Hi,

Your code could be quicker by inhibiting the screenupdating
Sub Macro_3()

Dim fld As Field
Dim tbl As Table
Application.ScreenUpdating = False
For Each fld In ActiveDocument.Tables(1).Range.Fields

    If Split(fld.Result.Text, " ")(0) = "Fehler!" Then
        fld.Result.Rows.Delete
    End If

Next
Application.ScreenUpdating = True
End Sub

Open in new window

0
 

Author Comment

by:AndreasHermle
ID: 39627325
Ok, I'll give it a try and let you know then.

Regards, Andreas
0
 

Author Comment

by:AndreasHermle
ID: 39629682
Ok, this sped it up considerably. Thank you very much. Now comes the points awarding.

Regards, Andreas
0
 

Author Closing Comment

by:AndreasHermle
ID: 39629685
Thank you very much for your professional support. Regards, Andreas
0
 
LVL 50

Expert Comment

by:Rgonzo1971
ID: 39630000
Hi,

As bonus here the code where it deletes from the first where it finds an error until the end of the table in one go

Sub Macro_4()

Dim fld As Field
Dim tbl As Table

For Each fld In ActiveDocument.Tables(1).Range.Fields
    If Split(fld.Result.Text, " ")(0) = "Fehler!" Then
        Idx = fld.Code.Cells(1).Row.Index
        EndOfTable = ActiveDocument.Tables(1).Rows.Count
        With ActiveDocument.Tables(1)
            Set rngRowsToBeDeleted = .Rows(Idx).Range
            rngRowsToBeDeleted.End = .Rows(EndOfTable).Range.End
        End With
        rngRowsToBeDeleted.Rows.Delete
        Exit For
    End If
Next
End Sub

Open in new window

Regards
0
 

Author Comment

by:AndreasHermle
ID: 39634852
Hi Rgonzo,

that's very nice of you. I will give it a try and let you know.

Thank you very much for your great, professional and swift help.

Regards, Andreas
0
 

Author Comment

by:AndreasHermle
ID: 39638251
Hi Rgonzo,

great, this works just fine and it is quicker to perform.

Thank you very much for your great and professional support.

Andreas
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

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.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A few years ago I was very much a beginner at VBA, and that very much remains the case today.  I'll do my best to explain things as I go in the hope that other beginners can follow.  If you just want to check out a tool that creates a Select Case fu…
You need to know the location of the Office templates folder, so that when you create new templates, they are saved to that location, and thus are available for selection when creating new documents.  The steps to find the Templates folder path are …
This video walks the viewer through the process of creating a watermark for their document, customizing it, and saving it for viewing/printing needs.
This video shows the viewer how to set up and create Footnotes in their document. Click on the References tab: Select "Insert Footnote": Type in desired text:

730 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question