简体   繁体   中英

Range.Find Word VBA: finding heading with specific heading number only works if heading style is specified

I'd like to find the location of a heading that has a specific heading number. Eg "2.3." For some reason, I can only find the location of the heading if i specify what Style that heading is going to be. If i don't specify the heading style then I don't get any matches (ie .Execute is never True). How can I find the location of a heading without having to specify it's style?

Code that works:

Function FindHeadingPos(oRng As Word.Range) As Long
    Dim rng As Word.Range
    With oRng.Find

        .ClearAllFuzzyOptions
        .ClearHitHighlight
        .ClearFormatting
        .Text = ""
        .Forward = True
        .Wrap = 2
        .Format = True
        .Style = "Heading 2,H2 Numb"

        Do While .Execute
            '.Parent contains the found range
            Set rng = .Parent
            If rng.ListFormat.ListString = "2.3." Then
                FindHeadingPos = rng.Start
                Exit Do
            End If
            'below statement seems to prevent code hanging on some headings.
            rng.Collapse Direction:=wdCollapseEnd
        Loop
    End With
End Function

Code that doesn't work:

Function FindHeadingPos(oRng As Word.Range) As Long
    Dim rng As Word.Range
    With oRng.Find

        .ClearAllFuzzyOptions
        .ClearHitHighlight
        .ClearFormatting
        .Text = ""
        .Forward = True
        .Wrap = 2
        '.Format = True
        '.Style = "Heading 2,H2 Numb"

        Do While .Execute
            '.Parent contains the found range
            Set rng = .Parent
            If rng.ListFormat.ListString = "2.3." Then
                FindHeadingPos = rng.Start
                Exit Do
            End If
            'below statement seems to prevent code hanging on some headings.
            rng.Collapse Direction:=wdCollapseEnd
        Loop
    End With
End Function

Thanks @GSerg for suggesting the .ParagraphFormat.OutlineLevel property.

The code below seems to solve my problem in case it helps anyone else.

Function getParaOutlineLevel(headNumberRaw As String) As Integer

    Dim numberOfDecimals As Integer
    numberOfDecimals = Len(headNumberRaw) - Len(Replace(headNumberRaw, ".", ""))
    
    If Not IsNumeric(Left(headNumberRaw, 1)) Then
        getParaOutlineLevel = numberOfDecimals + 5
    Else
        getParaOutlineLevel = numberOfDecimals
    End If

End Function


Function FindHeadingPos(oRng As Word.Range) As Long
    
    Dim headNumber As String
    Dim rng As Word.Range
    
    headNumber = "2.3."
    
    With oRng.Find
        .ClearAllFuzzyOptions
        .ClearHitHighlight
        .ClearFormatting
        .Text = ""
        .Forward = True
        .Wrap = 2
        .Format = True
        .ParagraphFormat.OutlineLevel = getParaOutlineLevel(headNumber)

        Do While .Execute
            '.Parent contains the found range
            Set rng = .Parent
            If rng.ListFormat.ListString = headNumber Then
                FindHeadingPos = rng.Start
                Exit Do
            End If
            'below statement seems to prevent it hanging on some headings.
            rng.Collapse Direction:=wdCollapseEnd
        Loop
    End With

End Function

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM