2

我想制作一个快捷键,它将 ContentControl 中所有内容的颜色更改为黄色。它必须是我当前所在的 ContentControl。(光标位于该 ContentControl 中的某处)

问题是您可以通过标题和索引查找 ContentContros,但我不需要。我需要一个知道我在哪里并选择 ContentControl 的所有内容并将其变为黄色的代码。

我的代码只会标记一个单词,而不是整个 ContentConrol-Object。

Sub toggleColor()
    If Selection.Range.HighlightColorIndex = wdNoHighlight Then
        Options.DefaultHighlightColorIndex = wdYellow
        Selection.Range.HighlightColorIndex = wdYellow
    Else
        Options.DefaultHighlightColorIndex = wdNoHighlight
        Selection.Range.HighlightColorIndex = wdNoHighlight
    End If
End Sub
4

1 回答 1

1

没有直接的方法可以确定Selection( 或 a Range) 是否在内容控件中 - 它只能间接完成。例如通过

  • 得到Range选择的
  • 将后面的开头延伸到文档开头Range
  • 计算到目前为止的内容控件的数量
  • 使用 方法将Range这些内容控件中的最后一个控件与当前选择的控件进行比较InRange

以下代码包含一个返回内容控件对象的函数。如果函数无法为其分配内容控件,则返回的对象是Nothing并且调用过程不会突出显示任何内容。否则,将突出显示选择所在的内容控件的整个范围。

Sub TestSelInCC()
    Dim rng As Word.Range
    Dim cc As Word.ContentControl

    Set cc = IsSelectionInCC(Selection)
    If Not cc Is Nothing Then
        Set rng = cc.Range
        rng.HighlightColorIndex = wdYellow
    End If
End Sub

Function IsSelectionInCC(sel As Word.Selection) As Word.ContentControl
    Dim rng As Word.Range
    Dim doc As Word.Document
    Dim nrCC As Long
    Dim cc As Word.ContentControl
    Dim InCC As Boolean

    InCC = False
    Set rng = sel.Range
    Set doc = rng.Parent
    rng.Start = rng.Document.content.Start
    nrCC = rng.Contentcontrols.Count
    If nrCC > 0 Then
        If sel.InRange(doc.Contentcontrols(nrCC).Range) Then
            InCC = True 'Debug.Print ("Sel in cc")
            Set cc = doc.Contentcontrols(nrCC)
        Else
            sel.MoveEnd wdCharacter, 1
            If Len(sel) = 0 Then
                'Debug.Print ("Sel at end of cc")
                InCC = True
                Set cc = doc.Contentcontrols(nrCC)
            End If
        End If
    End If
    Set IsSelectionInCC = cc
End Function
于 2019-07-04T16:57:18.583 回答