【问题标题】:VBA Word - InsertFile changes the style (font, size...) of the bookmark and adds a new lineVBA Word - InsertFile 更改书签的样式(字体、大小...)并添加新行
【发布时间】:2021-08-20 16:46:08
【问题描述】:

我正在尝试用 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,5pts)。如果文本文件被修改,我会重新创建书签以便能够多次运行宏。

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

  1. 保存样式名称并在插入文件之后应用它。对于要点,应用样式不会设置正确的字体和大小,因此最后 2 行
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

你有什么想法可以做一些更“专业”的事情吗?

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

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

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

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

    尝试改掉对选择对象进行编程的习惯。它缓慢且不可靠。范围比选择更好。以下是微软对 Ranges 的介绍:Working with Range Objects

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

    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
    

    不会添加结尾段落标记。

    【讨论】:

    • 谢谢!两个问题都解决了(样式不变,没有添加尾段标记),肯定更快!它产生了一个新问题:我的文件包含 UTF8 字符(法语口音)并且它们没有正确插入(我的“解决方案”是正确的)。你知道我该如何解决吗?
    • 这是一个新问题。请用详细信息开始一个新线程。如果这个答案有帮助,我将不胜感激。谢谢!
    • 我设法更改了创建文件的脚本中的编码,所以结果没问题。我在开头添加了Set prevRange = ActiveDocument.Bookmarks(bookmarkname).Range,在结尾添加了ActiveDocument.Bookmarks.Add bookmarkname, prevRange,以重新创建书签。
    【解决方案2】:

    对于我未来的自己或遇到相同 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多