选择具有不同场景的两行中的特定文本

时间:2018-06-15 07:06:32

标签: vba word-vba selection

我一直处于需要选择两行特定文本的情况。我通过以下代码执行此操作:

Selection.Paragraphs(1).Range.Select
Selection.MoveRight Unit:=wdWord, Count:=2, Extend:=wdExtend

但上述代码并不适用于以下所有四种情况。我正在寻找能够输出第一行和第二行选择的代码,直到“逗号”。我需要尽可能简单的代码,请帮助。

情景1

Infraestructura Energetica Nova SAB De CV

IENOVA * MM,购买

场景2

Infraestructura Energetica Nova SAB De CV

IENOVA13 MM,卖

场景3

Infraestructura Energetica Nova SAB De CV

IENOVA * MM

场景4已修改

Nova SAB

IENOVA MM

图片插图:

enter image description here

2 个答案:

答案 0 :(得分:2)

以下两段作为单独的范围。第一段被不加改变地拾取并用作获得第二段的起点。

使用Instr函数确定是否存在逗号 - Instr如果没有则返回0,否则返回正数。

如果没有逗号,则段落标记被截断。目前尚不清楚你是否想要这个Chr(13),如果你这样做,只需注释掉该行,并且该段落被拾取而没有任何变化。

如果有逗号,则Range会折叠到其起始点,然后扩展到逗号的位置,减去1(不包括逗号)。

然后为debug.print连接两个字符串。然后第一个Range的终点延伸到第二个Range的终点,这样你就有了一个Range(如果你需要的那个 - 那个不清楚)。

Sub SelectInfo()
    Dim rngLine1 As Word.Range
    Dim rngLine2 As Word.Range
    Dim isComma As Long

    Set rngLine1 = Selection.Range.Paragraphs(1).Range
    Set rngLine2 = rngLine1.Duplicate
    rngLine2.Collapse (wdCollapseEnd)
    Set rngLine2 = rngLine2.Paragraphs(1).Range

    isComma = InStr(rngLine2.Text, ",")
    If isComma = 0 Then
        'No comma, assume we don't want the last paragraph mark...
        rngLine2.MoveEnd wdCharacter, -1
    Else
        rngLine2.Collapse wdCollapseStart
        rngLine2.MoveEnd wdCharacter, isComma - 1
    End If

    Debug.Print rngLine1.Text & rngLine2.Text
    'Get a single Range instead of the string:
    rngLine1.End = rngLine2.End
End Sub

答案 1 :(得分:1)

从字面上理解你的问题:

  

...我正在搜索能够输出第一行和第二行选择的代码,直到“逗号”。

您可以按如下方式调整代码的第二行;

Selection.Paragraphs(1).Range.Select
Selection.MoveEndUntil ",", wdForward

这样做会将选择的结束向前移动,直到找到“,”。

但是,根据您的“情景”,某些选项可能不包含逗号,以下内容将起作用:

Sub SelectionTest()

Dim mySel As String

With Selection
    .Paragraphs(1).Range.Select
        mySel = Selection
            If InStr(1, mySel, ",") Then
                .MoveEndUntil ",", wdForward
            Else
                .Extend "M"
                .Extend "M"
            End If

End With

End Sub

这样做是选择段落,将字符串设置为变量mySel并使用InStr函数测试字符串是否包含逗号,如果是,则执行与上面相同的代码,但如果没有逗号,它将选择范围扩展到字符“M”(大写字母M),然后再将选择范围扩展到下一个“M”。

如您的评论所示,文字的“MM”部分是一个变量,所以:

Sub SelectionTest()

    Dim mySel As String

        With Selection
             .Paragraphs(1).Range.Select
             .MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
              mySel = Selection
                 If InStr(1, mySel, ",") Then
                     .Paragraphs(1).Range.Select
                     .MoveEndUntil ","
                 Else: Exit Sub
                 End If
        End With
End Sub

这样做是选择第一段然后将选择扩展到第二行的末尾,将所选文本设置为变量mySel并使用InStr函数测试,如果字符串包含逗号,如果是,它执行与上面相同的代码,但是如果没有逗号,它会保持选择2行,就是这样。

这样可以缩短代码,而不是每个国家/地区都有ElseIf语句(“MM”,“RO”,“TI”等),但在国家/地区代码之后不依赖于任何文本。否则,请按照答案的前一部分进行操作,并为每个国家/地区变量重复ElseIf

我在所有场景中测试了这一点(通过将场景段落复制/粘贴到单词中),只要光标位于所需段落的开头,每个场景都与“目标选择”相同跑了。

或者,您可以省略指定逗号的部分并使用(可能根据需要调整并将其放在if语句中以允许您的变量):

With Selection
    .Paragraphs(1).Range.Select
    .Extend "M"
    .Extend "M"
End With

这些代码将根据您在问题中提出并提供的内容而有效,但可能不是当前形式中最通用的代码。

以下链接中使用的功能和方法有更多信息: