2

我目前的项目是为一位同事制作一份清单,因为我喜欢把所有事情都复杂化,所以我正在运行宏,让他在完成工作时检查一下。当他完成工作时,工作描述将从标题样式更改为正常,然后更新 ToC。所有这一切都有效,但我有时会遇到内容控件保持选中状态的问题。我通常可以检查和取消检查一次或两次没有问题,但最终由于某种原因光标不会移出复选框,因此后续点击不会触发OnEnter.

Private Sub Document_ContentControlOnEnter(ByVal CCtrl As ContentControl)
With CCtrl
  If .Type = wdContentControlCheckBox Then
    If .Checked = True Then
      .Range.Paragraphs.First.Style = wdStyleNormal
      ActiveDocument.TablesOfContents(1).Update
      Selection.Collapse direction:=wdCollapseEnd
    Else
      .Range.Paragraphs.First.Style = wdStyleHeading2
      ActiveDocument.TablesOfContents(1).Update
      Selection.MoveRight 1
    End If
  End If
End With
End Sub

有没有办法强制 word 取消选择内容控件并将光标移动到同一行的某处?

我试过Selection.MoveDown 1, Selection.Collapse direction:=wdCollapseEnd, 也Selection.MoveEnd没有工作。

4

1 回答 1

2

您可以利用这样一个事实,即通过内容控件的范围可以访问包含它的对象。例如,您可以“向上钻取”到内容控件所在的段落:

CCtrl.Range.Paragraphs(1).Range.Characters.Last.Select

这也可以是段落中的任何字符。以下(在我的测试中)将选择放在内容控件之后:

CCtrl.Range.Paragraphs(1).Range.Characters(4).Select

合并到您的代码中:

Private Sub Document_ContentControlOnEnter(ByVal CCtrl As ContentControl)
  With CCtrl
    If .Type = wdContentControlCheckBox Then
      If .Checked = True Then
        .Range.Paragraphs.First.Style = wdStyleNormal
        ActiveDocument.TablesOfContents(1).Update
        Selection.Collapse direction:=wdCollapseEnd
      Else
        .Range.Paragraphs.First.Style = wdStyleHeading2
        ActiveDocument.TablesOfContents(1).Update
        Selection.MoveRight 1
      End If

      'Select the last character in the paragraph (the paragraph mark)
      CCtrl.Range.Paragraphs(1).Range.Characters.Last.Select
      'Remove the selection, so the cursor blinks at the end of the paragraph
      Selection.Collapse

    End If
  End With
End Sub
于 2018-06-06T16:44:54.317 回答