1

番号付きアイテムのテキストを指定して、(単純な番号付きリストから) 特定の番号付きアイテムへの相互参照を挿入する必要があります。ユーザーは、以下に示すように、相互参照するリスト項目と相互参照を挿入する場所を選択します。

1. This is item 1
2. This is item 2  <-- user selects this line
3. This is item 3
------------------
[2]  This is a reference to item 2  <-- user ctrl selects this line too
 ^ macro will insert the 2 as a cross reference to the selected list item

ただし、同じテキストの番号付きアイテムが多数存在する可能性があるため、どのアイテムが選択されているかを判断する方法が必要です。正しいテキストを含む各アイテムを選択し、それが文書内の正しい場所にあるかどうかを確認する予定です。正しい場所にある場合は、"ReferenceItem:" 番号がわかったので、相互参照を挿入できます。次の結果をループします。

ActiveDocument.GetCrossReferenceItems(wdRefTypeNumberedItem)

番号付きのアイテムの参照番号を正しいテキストで取得しますが、各候補を選択する方法がわからないため、その場所をテストできます。何かのようなもの:

ActiveDocument.Goto.CrossReferenceItem(81)

これはワード2010です。

コード例 (すべてのエラー チェックを削除):

'Create a temporary character style
ActiveDocument.Styles.Add "_TEMP_STYLE_", wdStyleTypeCharacter

'Apply the temporary style to the discontiguous selection
Selection.Style = ActiveDocument.Styles("_TEMP_STYLE_")

Set olRange = ActiveDocument.Range

With olRange.Find
    .ClearAllFuzzyOptions
    .ClearFormatting
    .ClearHitHighlight
    .Style = ActiveDocument.Styles("_TEMP_STYLE_")
    .Text = ""
    .Wrap = wdFindStop

    'llNumberedParaStart is used in the check of a numbered item to see if it is
    'the right one 
    llNumberedParaStart = -1
    llChildParaStart = -1

    Do While .Execute
        If .Found Then
            If olRange.Paragraphs(1).Range.ListFormat.ListType = wdListSimpleNumbering Then
                llNumberedParaStart = olRange.Characters(1).Start
                ' Do some work before this to get the text to check for
                slNumberedParaText = Selection.Text
            Else
                llChildParaStart = olRange.Characters(1).Start
            End If
    Loop
End With

slaNumItems = ActiveDocument.GetCrossReferenceItems(wdRefTypeNumberedItem)

'Loop through all the numbered items and find the correct one
For ilRefItem = 0 To UBound(slaNumItems)

    If InStr(slNumberedParaText, slaNumItems(ilRefItem)) = 0 Then

        'Check to make sure the reference is the correct one
        ********** select the numbered item and check its position **********

        'Insert the cross reference after selecting the correct location
        Selection.InsertCrossReference ReferenceType:="Numbered item", _
             ReferenceKind:=wdNumberRelativeContext, ReferenceItem:=ilRefItem, _
             InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, _
             SeparatorString:=" "        

        Exit For

    End If
Next ilRefItem
4

1 に答える 1

0

この maro は、タイプ「wdRefTypeHeading」のすべてのクロス リファレンス アイテムを解析し、それらの段落番号と現在選択されている段落の番号を比較します。一致する場合、テキスト挿入ポイントが 1 行上に移動し、次のテキストが追加されます。

§xxx、p.yyy

xxx と yyy はもちろん段落番号とページ番号です。

次に、テキストが切り取られてクリップボードに入れられるため、元のドキュメントには影響しません。

注: 見出しの前に空の行が存在する必要があります。そうでない場合、上記の行の内容はすべて切り取られます。

Sub CreaRiferimento()
    Dim d As Document
    Set d = ActiveDocument
    Debug.Print "Current selection: " & Selection.Paragraphs(1).Range.ListFormat.ListString & " " & Selection.Paragraphs(1).Range
    n = GetRefNum()
    Debug.Print "Internal reference number = " & n

    ' Sposta punto inserimento sopra a titolo
    Selection.MoveUp Unit:=wdLine, Count:=1

    ' Scrive "§"
    Selection.TypeText Text:="§"

    ' Scrive riferimento a paragrafo
    Selection.InsertCrossReference ReferenceType:="Titolo", ReferenceKind:= _
        wdNumberRelativeContext, ReferenceItem:=Trim(Str(n)), InsertAsHyperlink:=True, _
        IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "

    ' Scrive "p." per la pagina
    Selection.TypeText Text:=", p."

    'Scrive riferimento a pagina del paragrafo
    Selection.InsertCrossReference ReferenceType:="Titolo", ReferenceKind:= _
        wdPageNumber, ReferenceItem:=Trim(Str(n)), InsertAsHyperlink:=True, _
        IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "

    ' Taglia in clipboard quanto appena scritto
    Selection.EndKey Unit:=wdLine
    Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
    Selection.Cut

  End Sub

Function GetRefNum() As String
    CRI = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)
    HeadNum = Selection.Paragraphs(1).Range.ListFormat.ListString
    CRINumber = 1
    For Each CR In CRI
        HeadingNumberFromFunction = Mid$(LTrim(CR), 1, InStr(LTrim(CR), " ") - 1)
        'Debug.Print HeadNum & " ? " & HeadingNumberFromFunction
        'Debug.Print "'" & CR & " ' = ReferenceItem n." & CRINumber
        If HeadingNumberFromFunction = HeadNum Then
            GetRefNum = CRINumber
            Exit Function
        End If
        CRINumber = CRINumber + 1
    Next

End Function
于 2017-01-13T11:37:02.440 に答える