代码之家  ›  专栏  ›  技术社区  ›  Ezor

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

  •  0
  • Ezor  · 技术社区  · 6 年前

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

    我假设使用 Range 而不是 Selection 有帮助,但我不知道怎么做(我对vba单词不是很熟练)。 我想我可以选整条线(怎么选?)然后 if Selection.Characters.Count > 1 Then [...] 但它看起来又丑又不正式。

    提前感谢您的帮助或建议,

    2 回复  |  直到 6 年前
        1
  •  1
  •   3-14159265358979323846264    6 年前

    试试这个…

    If Asc(ThisDocument.Characters(Selection.Start)) = 13 And Asc(ThisDocument.Characters(Selection.Start + 1)) = 13 Then
        MsgBox "y"
    End If
    

    ThisDocument.Characters 包含文档中的所有文本,拆分为单个字符(如字母/数字/空格等)

    Asc(...) 获取特定字符的字符代码

    13 是回车的代码(新行)

    Selection.Start 指插入符号/光标前的字符

    Selection.Start + 1 指插入符号后的字符


    正如@ezor所建议的,这可能不适用于所有版本的Word vba,因此另一种选择是使用 ActiveDocument 而不是 ThisDocument

    If Asc(ActiveDocument.Characters(Selection.Start)) = 13 And Asc(ActiveDocument.Characters(Selection.Start + 1)) = 13 Then
        MsgBox "y"
    End If
    
        2
  •  2
  •   Cindy Meister    6 年前

    你问空行…“空段落”和“空行”在字面上有一个重要的区别。大多数人在使用“行”这个词时都是指段落,但段落以ansi 13结尾,而行以ansi 11结尾(shift+enter)。假设你的意思是段落…。

    有很多种方法可以解决这个问题,但一个简单的方法可以测试段落中有多少字符。空段落只有1个字符,ansi 13:。

    if selection.paragraphs(1).range.characters.count=1 then
    '只有段落标记-段落(行)为空
    结束如果
    

    如果你的意思是“线”,那就更复杂了。一行可以为空,而段落可以包含其他行上的其他内容。下面是一个例子

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

    以下步骤首先检查selection.type如果不是IP,则不会发生任何情况。然后检查所选内容是否在空段落中(如上所述)。如果段落包含多个段落,则必须确定选择前后的内容。无论是ANSI 13还是ANSI 11都可能处于这些位置,而不是其他任何位置。

    该选项被扩展到搜索ansi 11和ansi 13,但搜索仅限于一个字符。如果搜索成功,将返回1和-1,否则返回0。如果是1和-1,则所选内容为空行,即使段落包含多行,如图像中所示。

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

    sub-emptylineorpara()。
    将NRchars变暗为长
    调暗为字范围
    变暗NRcharsmovedforward,变长
    将nrcharsmovedbackward变暗为长
    
    如果selection.type=wdselectionip,则
    设置rng=选择。段落(1)。范围
    nrchars=rng.characters.count
    如果nrchars=1,则
    debug.print“空段落”
    Elseif NRchars>1然后
    nCharsMovedForward=selection.moveEndUntil(chr(11)&chr(13),1)
    nCharsMovedBackward=selection.moveStartUntil(cset:=chr(11)&chr(13),count:=-2)
    如果nCharsMovedForward=1和nCharsMovedBackward=-1,则
    调试打印“空行”
    elseif selection.fields.count>0然后
    debug.print“选择包含字段!”
    否则
    调试打印“非空”
    结束如果
    结束如果
    结束如果
    末端接头
    
    e术语“行”,但段落以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
    

    如果你的意思是“线”,那就更复杂了。一行可以为空,而段落可以包含其他行上的其他内容。下面是一个例子

    enter image description here

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

    以下步骤首先检查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