excel 查找选定内容的标题编号以及前面的标题编号

ttygqcqt  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(111)

我试图获得标题编号,和所有前面的标题级别数字的选择在Word VBA简单地通过文本的选择。例如:

十点一

第10.1.1节
10.1.1.1
“这是我的文字”
我希望能够选择“This is my text”(这是我的文本),并将前面的每个标题级别(即10.1.1.1、10.1.1、10.1)写入一个数组,以便我可以将每个值写入Excel中的单独单元格。
我想出了一个解决办法。

oWord.Selection.GoTo(wdGoToHeading, wdGoToPrevious).Select

以获得文本“10.1.1.1“,然而,我随后进入各种循环,这些循环通过每个先前的标题来确定标题级别并获得它们的编号,如下所示。

HeadingSearch4:

                    If oWord.Selection.Style = "Heading 4" Then
                            Do
                                prevHeading = oWord.Selection.Style
                                oWord.Selection.GoTo(wdGoToHeading, wdGoToPrevious).Select
                                prevHeading = oWord.Selection.Style
                            Loop Until prevHeading = "Heading 3"
                        GoTo HeadingSearch3
                    End If

HeadingSearch3:

                    If oWord.Selection.Style = "Heading 3" Then
                        lgHeading3num = oWord.Selection.Paragraphs(1).Range.ListFormat.ListString
                            Do
                                prevHeading = oWord.Selection.Style
                                oWord.Selection.GoTo(wdGoToHeading, wdGoToPrevious).Select
                                prevHeading = oWord.Selection.Style
                            Loop Until prevHeading = "Heading 2"
                        GoTo HeadingSearch2
                    End If
HeadingSearch2:
                    If oWord.Selection.Style = "Heading 2" Then
                        lgHeading2num = oWord.Selection.Paragraphs(1).Range.ListFormat.ListString
                            Do
                                prevHeading = oWord.Selection.Style
                                oWord.Selection.GoTo(wdGoToHeading, 
wdGoToPrevious).Select
                                prevHeading = oWord.Selection.Style
                            Loop Until prevHeading = "Heading 1"
                        GoTo HeadingSearch1
                    End If
HeadingSearch1:
                    If oWord.Selection.Style = "Heading 1" Then
                        lgHeading1num = "Section " & oWord.Selection.Paragraphs(1).Range.ListFormat.ListString
                    End If

显然,当我深入到大纲的几个级别(iIndiee.www.example.com)时,这需要花费大量的时间10.10.5.5,因为它必须循环通过以前的每个标题,而不管标题级别如何。
我的问题是......有没有更容易使用的方法。

oWord.Selection.GoTo(wdGoToHeading, wdGoToPrevious).Select

转到上一个标题级别?例如,如果我的文本在“10.1.5”之下,我可以直接转到“10.1”而不循环前面的标题3的其余部分吗?或者是我缺少了选择的属性吗?我找不到使用“wdGoToPrevious”转到下一个最高标题级别的方法。任何帮助都将不胜感激,谢谢!

j13ufse2

j13ufse21#

我将使用伪代码,只是因为我没有时间在Word中完全测试它。
我要用另一种方法来解决你的问题。

  • 重要的一点是不要使用Selection-选择可能会根据代码或用户输入而改变,而您可能没有意识到这一点。
  • 我将在Whole Document范围的上下文中使用内置Paragraphs集合(为了伪代码的方便,我们将其称为wdAllDocRange)。

我最初考虑使用图灵磁带风格的过程,但下面的代码确定了一个更简单的方法。

Dim counter as Long ' set up the navigation
Dim coll as Collection
Counter = 1 ' start at the beginning
While counter < wdAllDocRange.Paragraphs.Count ' error check - we have reached the end of file
    GetCurrentLevel wdAllDocRange.Paragraphs(counter) 'Code here to get current level
    if a Heading
        if a new level then
            coll.add currentlevel
        else if same level then
            coll.replace lastlevel with currentlevel number
        else if a previous level then
            coll.removelevels until at the right level then set level number
    else
        output coll and text into the array for further use
    endif
    counter = counter + 1
Loop

上面的代码使用了一个老式的循环(因为我想在范围内来回移动),但是实际上可以将所有的主代码包含在一个for-each循环中

Dim coll as Collection
Dim para as Paragraph
For Each para in wdAllDocRange.Paragraphs 
    GetCurrentLevel para 'Code here to get current level
    if a Heading
        if a new level then
            coll.add currentlevel
        else if same level then
            coll.replace lastlevel with currentlevel number
        else if a previous level then
            coll.removelevels until at the right level then set level number
    else
        output coll and text into the array for further use
    endif
Next
xwbd5t1u

xwbd5t1u2#

尝试基于以下内容的内容:

Sub Demo()
Dim Rng As Range, i As Long, j As Long, StrOut As String
Set Rng = Selection.Range: j = 10
Do While Rng.Paragraphs.First.Range.Style <> "Heading 1"
  If InStr(Rng.Paragraphs.First.Range.Style, "Heading") <> 0 Then
    i = CLng(Split(Rng.Paragraphs.First.Range.Style, " ")(1))
    If i < j Then
      j = i
      StrOut = Rng.Paragraphs.First.Range.ListFormat.ListString & ", " & StrOut
    End If
  End If
  Rng.Start = Rng.Start - 1
  Set Rng = Rng.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
Loop
StrOut = Rng.Paragraphs.First.Range.ListFormat.ListString & ", " & StrOut
MsgBox StrOut
End Sub

相关问题