VBA Word - InsertFile 更改书签的样式(字体、大小...)并添加新行

VBA Word - InsertFile changes the style (font, size...) of the bookmark and adds a new line

我正在尝试用 VBA 中的纯文本文件填充 Word 文档。 这是我的资料:

  1. Word 文档中包含默认文本的书签(这有助于我确保替换所有书签)
  2. 下面的 VBA 完成将 txt 文件中的内容插入书签的工作
strt = bookmark.Range.Start
bookmark.Select
Selection.InsertFile Filename:=Filename, ConfirmConversions:=False, Link:=False, Attachment:=False
Selection.Bookmarks.Add Name:=bookmarkname, Range:=ActiveDocument.Range(strt, Selection.Range.End)

主要问题是在我 运行 VBA 之后,字体名称、字体大小、项目符号(如果有)...都更改为不同的内容(Courier New 10, 5分)。如果文本文件被修改,我重新创建书签以便能够 运行 宏多次。

我找到了一个丑陋的(恕我直言)解决方案:

  1. 保存样式名称并在插入文件后应用它。对于要点,应用样式不会设置正确的字体和大小,因此最后两行
strt = bookmark.Range.Start
bookmark.Select
myStyle = (Selection.Style)
Selection.InsertFile Filename:=Filename, ConfirmConversions:=False, Link:=False, Attachment:=False
Selection.Bookmarks.Add Name:=bookmarkname, Range:=ActiveDocument.Range(strt, Selection.Range.End)
ActiveDocument.Range(strt, Selection.Range.End).Style = myStyle
ActiveDocument.Range(strt, Selection.Range.End).Font.Name = "Calibri"
ActiveDocument.Range(strt, Selection.Range.End).Font.Size = 11

你有没有想过做点更“专业”的事情?

另一个问题是插入文件总是在末尾添加一个新行,即使文件末尾没有新行。 有什么想法可以防止它或至少在插入后将其删除吗?

感谢您提供任何帮助我的想法!

纯文本文件没有样式。它们将采用应用于您插入文件的选区的任何样式。创建一个看起来像您希望最终文本看起来像的样式,将其应用于接收文档,然后重新运行您的代码。

尽量改掉编程选择对象的习惯。它很慢而且不可靠。范围优于选择。下面是微软对 Ranges 的介绍:Working with Range Objects

不使用 InsertFile,您可以使用 Range.Text 来插入文本:

Sub Text2Doc()
    Dim iFreeFileNum As Integer
    Dim strPath As String
    Dim strFileContent As String

    strPath = "C:\Test.txt"
    'Get the next file number available for use by the FileOpen function
    iFreeFileNum = FreeFile
    Open strPath For Input As iFreeFileNum
    strFileContent = Input(LOF(iFreeFileNum), iFreeFileNum)
    ActiveDocument.Bookmarks("BookmarkName").Range.Text = strFileContent
    Close iFreeFileNum
End Sub

不会添加尾随段落标记。

对于我未来的自己或任何有相同 UTF-8 问题的人,这是我在 VBA 中的解决方案。这是@john-korchok 接受的答案与此处找到的一些代码之间的合并:Read & Write UTF8 file in VBA

Dim bookmark As bookmark
Dim Filename As String
Dim fs
Dim bookmarkname As String
Dim rngBookmark As Word.Range
Dim objStream

Set objStream = CreateObject("ADODB.Stream")
Set fs = CreateObject("Scripting.FileSystemObject")

For Each bookmark In ActiveDocument.Bookmarks
    If bookmark.Name <> bookmarkname Then ' Avoids infinity loop because of Selection.Bookmarks.Add
        bookmarkname = bookmark.Name
        Filename = Path + bookmarkname + ".txt"
        If fs.FileExists(Filename) Then
            ' Records the bookmarks position to recreate it after
            Set rngBookmark = ActiveDocument.Bookmarks(bookmarkname).Range
            objStream.Charset = "utf-8"
            objStream.Open
            objStream.LoadFromFile (Filename)
            rngBookmark.Text = objStream.ReadText()
            ' Recreation of the bookmark
            ActiveDocument.Bookmarks.Add bookmarkname, rngBookmark
            objStream.Close
        End If
    End If
Next

我发现了字体问题。 每个文档,无论其当前由什么组成,都有一个默认字体。插入的文件继承了该字体。