VBA Word - InsertFile 更改书签的样式(字体、大小...)并添加新行
VBA Word - InsertFile changes the style (font, size...) of the bookmark and adds a new line
我正在尝试用 VBA 中的纯文本文件填充 Word 文档。
这是我的资料:
- Word 文档中包含默认文本的书签(这有助于我确保替换所有书签)
- 下面的 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分)。如果文本文件被修改,我重新创建书签以便能够 运行 宏多次。
我找到了一个丑陋的(恕我直言)解决方案:
- 保存样式名称并在插入文件后应用它。对于要点,应用样式不会设置正确的字体和大小,因此最后两行
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
我发现了字体问题。
每个文档,无论其当前由什么组成,都有一个默认字体。插入的文件继承了该字体。
我正在尝试用 VBA 中的纯文本文件填充 Word 文档。 这是我的资料:
- Word 文档中包含默认文本的书签(这有助于我确保替换所有书签)
- 下面的 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分)。如果文本文件被修改,我重新创建书签以便能够 运行 宏多次。
我找到了一个丑陋的(恕我直言)解决方案:
- 保存样式名称并在插入文件后应用它。对于要点,应用样式不会设置正确的字体和大小,因此最后两行
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
我发现了字体问题。 每个文档,无论其当前由什么组成,都有一个默认字体。插入的文件继承了该字体。