书签前插入文字

时间:2017-06-01 22:39:24

标签: vba ms-word word-vba

好的,我正努力让这段代码以我想要的方式运行。我有一个文档,我试图设置一个宏,将复制的文本从源文档插入到目标文档的中间。我在那里放了一个书签,我所拥有的代码实际上会粘贴文本,但它总是在书签的最开头粘贴文本。我需要能够多次运行此宏以在书签后插入多个段落。

源文档中填充了段落,每个段落都在一个名为" B"的封闭书签中,然后是后面的字母数字代码。我们试图填充的目标表格将需要这些段落中的1到7个。我不介意多次运行宏(但是,如果有一种方法可以使用逗号分隔的输入框列表来循环,那就太好了),但是宏现在运行的方式,它放了这些段落的顺序相反,这意味着如果我为第1段运行它,那么对于第2段,它将它们命令为第2段,然后是第1段。我需要能够在第一段之后插入第二段(和后续段)。

我尝试过使用insertbefore和insertafter,但却无法使用它们。我尝试在原始书签之前添加新书签,然后使用新书签作为文本的放置位置,但无法使该代码正常运行。在下面还有一个命令按钮(1),我希望段落可以放入,所以如果它可以用作插入点,那就太棒了。但我根本找不到任何东西,所以我走了书签路线。

Private Sub CommandButton1_Click()

    Dim TarDoc As Document, SourDoc As Document
    Dim aRng As Word.Range
    Dim Mark As String, MarkB As String

    Application.ScreenUpdating = False

    Set SourDoc = Documents.Open("C:\Projects\SourceDocument.docx")
    Set TarDoc = ThisDocument
    Set aRng = TarDoc.Bookmarks("End").Range

    Do
        Mark = InputBox("100, 289, 981a...", "Enter Number and Letter as Shown")
        If Len(Mark) Then              ' do nothing if user enters nothing
            MarkB = "B" & Mark
            If SourDoc.Bookmarks.Exists(MarkB) Then
                SourDoc.Bookmarks(MarkB).Range.Copy
                aRng.PasteAndFormat (wdFormatOriginalFormatting)
                Mark = vbNullString    ' to enable exiting the loop

            Else
                MsgBox "Bookmark """ & Mark & """ doesn't exist.", vbInformation, _
                       "Invalid entry"
            End If
        End If
    Loop While Len(Mark)               ' the user entered a wrong mark

    Application.ScreenUpdating = True
End Sub

2 个答案:

答案 0 :(得分:3)

下面的代码将查找书签,移动到它前面的空格并在那里插入文本。因此,书签保持不变,并且将位于新插入的文本的末尾。您可以在循环中使用它来继续使用相同的书签添加文本。

import org.scalatest._
import org.easymock.EasyMock._
import org.scalatest.easymock._

// definition of Grid
trait Grid {
    def steps: Int
}

class MyTestSuite extends FunSuite with Matchers with EasyMockSugar {
  test("First differential correctness") {
    val grid: Grid = mock[Grid]
    val steps = 4
    expect(grid.steps).andReturn(steps)
    // use the grid mock ...
  }
}

在我的试验中,书签的长度为1个字符。事实上,长度并不重要。但是,我认为如果仅包含段落结尾标记并且您希望插入具有自己格式的段落可能会出现问题,因为插入的文本将继承插入它的段落的格式。因此,如果您希望使用上面的代码插入整个段落,那么书签的开头必须与新段落的开头重合。以这种方式,带标签的段落将保持其格式,而插入的文本将带来它自己的。

答案 1 :(得分:0)

variatus的答案确实有效。我实施的方式略有不同,可以帮助其他人。

我的实现需要传递文本/书签名称,并且如果书签不存在,则可以选择处理。

Sub insertStringBeforeBookmark(str1 As String, bmkName As String)

    Dim rng As Range

    If ActiveDocument.Bookmarks.Exists(bmkName) Then
        Set rng = ActiveDocument.Bookmarks(bmkName).Range

        With rng
            rng.SetRange .Start - 1, .Start - 1
            .Text = str1
        End With
    Else 'do some handling here.
        Debug.Print "The procedure insertStringBeforeBookmark " _
        ; "was called but the bookmark does not exist."

    End If   

End Sub