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

时间:2018-07-20 12:14:26

标签: vba ms-word word-vba

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

我认为使用Range而不是Selection可能会有所帮助,但我不知道该怎么做(我对vba字不是很熟练)。 我想我可以选择整行(如何?),然后选择if Selection.Characters.Count > 1 Then [...],但这似乎很丑陋且效率低下。

在此先感谢您的帮助或建议

2 个答案:

答案 0 :(得分:2)

您询问的是空行... 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

如果您真的要说“线”,那就有点复杂了。一行可能为空,而段落可能在其他行上包含其他内容。这是一个例子

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

答案 1 :(得分:1)

尝试一下...

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
  <table class="table">
    <thead>
      <tr>
        <th>To Do List</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>
          <div class="checkbox">
            <input type="checkbox" id="checkbox1" /><label>Task 1</label><label class="glyphicon glyphicon-trash"></label>
          </div>
        </td>
      </tr>

      <tr>
        <td>
          <div class="checkbox">
            <input type="checkbox" id="checkbox2" /><label>Task 2</label><label class="glyphicon glyphicon-trash"></label>
          </div>
        </td>
      </tr>

      <tr>
        <td>
          <div class="checkbox">
            <input type="checkbox" id="checkbox3" /><label>Task 3</label><label class="glyphicon glyphicon-trash" id="3"></label>
          </div>
        </td>
      </tr>
    </tbody>
  </table>
</div>

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是指插入符号后面的字符


如@Ezor所建议,这可能不适用于所有版本的Word VBA,因此一种替代方法是使用Selection.Start + 1而不是ActiveDocument,例如

ThisDocument