2

いくつかの例を調べましたが、Range オブジェクトがどのように機能するのかよくわかりません。(レベル 4 の) 各見出しをループして、見出し間のすべてのテーブルを調べるネストされたループを作成しようとしています。その特定の範囲を設定する方法がわからないので、どんな助けでも大歓迎です。

    Dim myHeadings As Variant
    myHeadings = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)

    For iCount = LBound(myHeadings) To UBound(myHeadings)

      level = getLevel(CStr(myHeadings(iCount)))
      If level = 4 Then

         'This is where I want to set a range between myHeadings(iCount) to myHeadings(iCount+1)
         set aRange = ??


      End If

    Next iCount
4

2 に答える 2

3

あなたはここで正しい軌道に乗っています。あなたが持っている myHeadings 変数は、ドキュメント内のレベル 4 の見出しの文字列のリストを提供するだけです。次に、これらの文字列をドキュメントで検索して、レベル 4 の見出しの範囲を取得する必要があります。

各見出しの範囲を取得したら、これらの見出し間の範囲にあるテーブルを確認できます。これを行うために、コードを少し変更しました。また、Option Explicitすべての変数が確実に宣言されるように、モジュールの先頭に配置することをお勧めします。

私のコードは、レベル 4 の各見出しの間にいくつのテーブルがあるかを示します。注: 最後の見出しとドキュメントの最後の間はチェックしません。それはあなたに任せます ;)

Sub DoMyHeadings()
    Dim iCount As Integer, iL4Count As Integer, Level As Integer, itabCount As Integer
    Dim myHeadings As Variant, tbl As Table
    Dim Level4Heading() As Range, rTableRange As Range

    myHeadings = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)

    'We want to move to the start of the document so we can loop through the headings
    Selection.HomeKey Unit:=wdStory

    For iCount = LBound(myHeadings) To UBound(myHeadings)
        Level = getLevel(CStr(myHeadings(iCount)))
        If Level = 4 Then

            'We can now search the document to find the ranges of the level 4 headings
            With Selection.Find
                .ClearFormatting                                'Always clear find formatting
                .Style = ActiveDocument.Styles("Heading 4")     'Set the heading style
                .Text = VBA.Trim$(myHeadings(iCount))           'This is the heading text (trim to remove spaces)
                .Replacement.Text = ""                          'We are not replacing the text
                .Forward = True                                 'Move forward so we can each consecutive heading
                .Wrap = wdFindContinue                          'Continue to the next find
                .Format = True
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
                .Execute
           End With

           'Just make sure the text matches (it should be I have a habit of double checking
            If Selection.Text = VBA.Trim$(myHeadings(iCount)) Then
                iL4Count = iL4Count + 1                             'Keep a counter for the L4 headings for redim
                ReDim Preserve Level4Heading(1 To iL4Count)         'Redim the array keeping existing values
                Set Level4Heading(iL4Count) = Selection.Range       'Set the range you've just picked up to the array
             End If
         End If
     Next iCount

    'Now we want to loop through all the Level4 Heading Ranges
    For iCount = LBound(Level4Heading) To UBound(Level4Heading) - 1
        'Reset the table counter
        itabCount = 0

        'Use the start of the current heading and next heading to get the range in between which will contain the tables
        Set rTableRange = ActiveDocument.Range(Level4Heading(iCount).Start, Level4Heading(iCount + 1).Start)

        'Now you have set the range in the document between the headings you can loop through
        For Each tbl In rTableRange.Tables
            'This is where you can work your table magic
            itabCount = itabCount + 1
        Next tbl

        'Display the number of tables
        MsgBox "You have " & itabCount & " table(s) between heading " & Level4Heading(iCount).Text & " And " & Level4Heading(iCount + 1).Text
    Next iCount
End Sub
于 2013-02-06T23:09:45.270 に答える
1

を使用して、ある見出しから次の見出しにジャンプできGotoます。レベル 4 の見出しをループする方法については、以下を参照してください。

Dim heading As Range
Set heading = ActiveDocument.Range(start:=0, End:=0)
Do   ' Loop through headings
    Dim current As Long
    current = heading.start
    Set heading = heading.GoTo(What:=wdGoToHeading, Which:=wdGoToNext)
    If heading.start = current Then
        ' We haven't moved because there are no more headings
        Exit Do
    End If
    If heading.Paragraphs(1).OutlineLevel = wdOutlineLevel4 Then

        ' Now this is a level 4 heading. Let's do something with it.
        ' heading.Expand Unit:=wdParagraph
        ' Debug.Print heading.Text

    End If
Loop

特に「見出し 4」を探す必要はありません。

  • 非組み込みスタイルを使用することもできます。
  • 国際バージョンの Word では機能しません。

wdOutlineLevel4代わりにチェックしてください。

ここで、レベル 4 全体の範囲を取得するための、あまり知られていないトリックを次に示します。

Dim rTableRange as Range
' rTableRange will encompass the region under the current/preceding heading
Set rTableRange = heading.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")

これは、ドキュメントの最後の見出し 4 または見出し 3 の下の最後の見出しでうまく機能します。

于 2015-05-30T00:58:01.713 に答える