【问题标题】:Selection of particular text in two lines with different scenarios在具有不同场景的两行中选择特定文本
【发布时间】:2018-06-15 07:06:31
【问题描述】:

我曾经遇到过需要在两行中选择特定文本的情况。我一直在通过以下代码执行此操作:

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

图片说明:

【问题讨论】:

  • 场景 3 和场景 4 没有逗号,这样对吗?
  • 是的 4th 没有逗号。很抱歉回复晚了..再加上一件事,字母“MM”并不总是相同的,它可能是土耳其的“TI”,罗马尼亚的“RO”等等。但它是两个大写字母的单词。
  • 没问题,我会编辑我的答案,应该涵盖这个。
  • 澄清一下,上面的场景格式是此代码将遵循的唯一格式吗?
  • 格式是一样的

标签: vba ms-word selection


【解决方案1】:

以下内容将两个段落作为单独的范围进行处理。第一段被原封不动地拾取并用作获取第二段的起点。

使用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

【讨论】:

  • 您在范围内工作,这很棒。但在我的情况下,我需要复制选定的文本,然后将其粘贴到两行的 excel 文件中。所以请您详细说明 range.text 的复制/粘贴。请考虑第一行中的段落标记,这将有助于我粘贴。
  • 自动包含第一行的段落标记。您没有在问题中提及复制/粘贴,但这很简单:rngLIne1.Copy 就在End Sub 之前。或者,如果您更喜欢选择,那么rngLine1.Select : Selection.Copy。两者应该是一样的。
  • 您的回答很好。但是,您使用的是.Range,与Selection. 方法相比,代码会变得很长(在另一个答案中提及)。我想知道它是否会影响执行速度?
  • @IbneAshiq 一般来说,使用Range 对象比使用Selection 更快——屏幕不需要更新(而且看起来更安静)。当然有很多方法可以解决这个问题。我选择了这个,因为它很清楚发生了什么,执行效率相当高,维护简单,以防需求发生变化。另一个建议在内部重复,移动末端直到找到目标字符。这就像按住 Shift 键并按多次右箭头...
  • 它跑题了,但我找不到另一种交流方式。我了解到您是一本名为“您今天可以使用的 Office VBA 宏”的书的作者。我买不起这本书,但我的好奇心促使我问起这本书。它有免费的pdf版本吗?我可以免费吗:)
【解决方案2】:

从字面上理解你的问题:

...我正在寻找可以输出选择的第一行和第二行直到“逗号”的代码。

您可以对代码的第 2 行进行如下调整;

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

它的作用是将选择的结尾向前移动,直到找到“,”。

但是,如果根据您的“场景”,某些选择可能不包含逗号,则以下方法将起作用:

子选择测试()

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

结束子

它的作用是选择段落,将字符串设置为变量 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 行,仅此而已。

这使代码更短,而不是为每个国家/地区(“MM”、“RO”、“TI”等)使用ElseIf 语句,但不依赖国家/地区代码后的文本。否则,按照答案的前一部分,对每个 Country 变量重复 ElseIf

我在您的所有场景中对此进行了测试(通过将您的场景段落复制/粘贴到 word 中)并且每个结果都与您的“目标选择”相同,只要光标在代码时位于所需段落的开头已运行。

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

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

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

在下面的链接中有更多关于函数和方法的信息:

【讨论】:

  • 亲爱的你在正确的道路上.. 但问题是当第一行的文本少于第二行时,选择会改变,因为两行也是可变的。请考虑到这一点。我已经在我的问题的第 4 个场景中对此进行了编辑。
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2021-08-21
  • 2012-04-02
相关资源
最近更新 更多