如何更改当前ContentControl-Object的颜色?

时间:2019-07-04 13:32:44

标签: vba ms-word

我想制作一个快捷键,它可以将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

1 个答案:

答案 0 :(得分:0)

没有直接的方法来确定Selection(或Range)是否在内容控件中-只能间接完成。例如,

  • 获取所选内容的Range
  • Range start 扩展回文档的开头
  • 计算到目前为止的内容控件数量
  • 使用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