如何知道光标/选择是否在空行上?

Ezo*_*zor 0 vba ms-word

我目前正在努力解决一个非常简单的问题。对于宏,我想知道我的光标是否在空行上。我想使用Len()orCount但它们总是返回1(即使当前行有更多字符)。

我认为使用 aRange而不是Selection可以有所帮助,但我不知道该怎么做(我对 vba-word 不是很熟练)。我想我可以选择整条线(如何?),但if Selection.Characters.Count > 1 Then [...]它看起来丑陋且效率低下。

预先感谢您的任何帮助或建议,

Cin*_*ter 5

您询问空行...Word 中“空段落”和“空行”之间存在重要区别。大多数人在使用术语“行”时指的是段落,但段落以 ANSI 13 结尾,而行以 ANSI 11 (Shift+Enter) 结尾。假设你的意思是段落...

有很多方法可以实现这一点,但有一种简单的方法可以测试段落中有多少个字符。空段落只有 1 个字符,ANSI 13:

If Selection.Paragraphs(1).Range.Characters.Count = 1 Then
  'Only a paragraph mark - the paragraph (line) is empty
End If
Run Code Online (Sandbox Code Playgroud)

如果你真正指的是“线”,那就有点复杂了。一行可以是空的,而段落可以在其他行上包含附加内容。这是一个例子

在此输入图像描述

此外,选择可能不是单个点,当询问选择是否位于空行/段落中时,这一点很重要。

以下过程首先检查Selection.Type,如果不是 IP,则不会发生任何情况。然后它检查所选内容是否位于空段落中(如上所述)。如果段落包含多个内容,则有必要确定紧邻所选内容之前和之后的内容。ANSI 13 或 ANSI 11 可能位于这些位置,除此之外别无其他。

选择范围已扩展为搜索 ANSI 11 和 ANSI 13,但搜索仅限于一个字符。如果搜索成功,将返回 1 和 -1,否则返回 0。如果 1 和 -1 为一,则所选内容位于空行中,即使该段落包含多行,如图所示。

在图像中,第一“行”是一个空段落;第二个不为空;第三个是空行;第四个不为空;第五个是空行。

Sub EmptyLineOrPara()
    Dim nrChars As Long
    Dim rng As Word.Range
    Dim nrCharsMovedForward As Long
    Dim nrCharsMovedBackward As Long

    If Selection.Type = wdSelectionIP Then
        Set rng = Selection.paragraphs(1).Range
        nrChars = rng.Characters.Count
        If nrChars = 1 Then
            Debug.Print "Empty paragraph"
        ElseIf nrChars > 1 Then
            nrCharsMovedForward = Selection.MoveEndUntil(Chr(11) & Chr(13), 1)
            nrCharsMovedBackward = Selection.MoveStartUntil(CSet:=Chr(11) & Chr(13), Count:=-2)
            If nrCharsMovedForward = 1 And nrCharsMovedBackward = -1 Then
                Debug.Print "Empty line"
            ElseIf Selection.Fields.Count > 0 Then
                Debug.Print "Selection contains fields!"
            Else
                Debug.Print "Not empty"
            End If
        End If
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)