微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Word VBA 插入目录构建块

如何解决Word VBA 插入目录构建块

我正在尝试使用定义目录的内置构建块之一将目录插入 Word 文档。当我录制宏并插入目录时,宏录制器会给出以下代码行:

 Application.Templates( _
        "C:\Users\me\AppData\Roaming\Microsoft\Document Building Blocks\1033\16\Built-In Building Blocks.dotx" _
        ).BuildingBlockEntries("Automatic Table 1").Insert Where:=Selection.Range,RichText:=True

我已验证此名称 - 自动表 1 - 存在于构建块组织器中。当然,当我使用菜单功能区按钮插入目录时,目录确实被正确插入。

但是当我使用同一行代码并将其放入 VBA 宏时,我收到一条错误消息,指出请求的项目不存在。是否可以从 VBA 代码中引用构建块项目?谁能告诉我我做错了什么,或者如何实现我的目标?谢谢。

解决方法

宏记录器只是一个起点。您发布的示例取决于构建基块模板的非常具体的路径,其中包括您的用户名和您使用的语言(1033 是美国英语)和 Word 版本(16 表示 Word 2016 和 2019)。此外,积木模板位置没有到达它的 VBA 快捷方式。

更可靠的是将表格插入到您的宏模板或基于该模板的文档中。选择表格,然后选择插入>快速部件>自动图文集>将所选内容保存到自动图文集。您可以将名称设置为您喜欢的任何名称。将图库设置为目录。 OK,然后删除表样本。

现在您可以使用更简单、更可靠的代码,如下所示:

null
,

Word 不会在启动时加载 Building Blocks,它们是按需加载的。当您点击其中一个 Building Block 画廊时,您可能会注意到在显示画廊之前有一个短暂的停顿,即 Word 正在加载它们。

您可以通过在代码中使用 Application.Templates.LoadBuildingBlocks 安全地指示 Word 加载构建块,如果它们已经加载,则不会生成错误。

内置构建块的路径也只对您有效,但您可以通过使用 Environ 返回路径的第一部分来解决这个问题。

Sub InsertTOC()
   Dim path As String
   Application.Templates.LoadBuildingBlocks
   path = Environ$("USERPROFILE") & "\AppData\Roaming\Microsoft\Document Building Blocks\1033\16\Built-In Building Blocks.dotx"
   Application.Templates(path).BuildingBlockEntries("Automatic Table 1").Insert Where:=Selection.Range,RichText:=True
End Sub
,

录制的宏很少会执行您想要的操作,尤其是在您共享模板时。

编写宏

要做到这一点,您需要知道:

  • 积木名称

  • 保存构建块的模板的名称(和位置),除非宏在同一个模板中

  • 如何插入宏。 请参阅安装宏和安装/使用 VBA 过程(宏)。

  • Building Block Name = "MyBB"(此宏中的示例,更改以适应)

情况 1 和 1a 在同一模板中具有 Building Block 和宏。 这简化了编码,因为宏总是可以告诉 包含它的模板的名称和位置。那个信息 需要使用宏插入构建块。

情况 1 - 模板同时包含构建块和宏

这是在文档中的插入点插入唯一命名的构建块的宏:

Sub InsertMyBB()
'  Will not work if there are multiple building blocks with the same name in the template! See below.
'
   Dim sBBName As String
   sBBName = "MyBB"
   On Error GoTo Oops
   Application.Templates.LoadBuildingBlocks ' Thank you Timothy Rylatt!
   Application.Templates(ThisDocument.FullName).BuildingBlockEntries(sBBName).Insert _
      Where:=Selection.Range,_
      RichText:=True ' Insert MyBB Building Block
   Exit Sub ' We're done here
Oops: ' Didn't work - building block not there!
   MsgBox Prompt:="The Building Block " & sBBName & " cannot be found in " & _
      ThisDocument.Name & ".",Title:="Didn't Work!"
   On Error GoTo 0
End Sub

这个和下面的宏都包含在一个演示模板中,可以从我的下载页面下载。

情况 1a - 模板在同一模板中包含构建块和宏 - 多个具有相同名称的构建块

在这种情况下,之前的宏会混淆 Word 并给出不可预测的(用户)结果。在这种情况下,宏需要 知道积木的画廊和类别。这 以下宏假定构建块存储在 自动图文集库和常规类别。你可以找到名字 使用 Building Blocks Organizer 的画廊和类别。类别 名称是纯文本。画廊在 vba 中被称为建筑 块类型和使用常量。您可以找到常量列表 对于这里不同的画廊。

Sub InsertMyBB()
'
' Assumes that the Building Block is of the type AutoText (wdTypeAutoText) in Category "General"
' See https://msdn.microsoft.com/en-us/library/bb243303(v=office.12).aspx
'
' This is based in part upon contributions from Greg Maxey and Jay Freedman - any errors remain mine
' Written by Charles Kenyon February 2016
'
   Dim sBBName As String
   Dim sTempName As String
   Dim oBB As BuildingBlock
   sBBName = "MyBB" 'use the name of your building block instead of "MyBB"
   sTempName = ThisDocument.FullName ' puts name and full path of template in string variable
   On Error Resume Next
   Application.Templates.LoadBuildingBlocks  ' thank you Timothy Rylatt
   Set oBB = Application.Templates(sTempName).BuildingBlockTypes(wdTypeAutoText) _
      .Categories("General").BuildingBlocks(sBBName)
   If Err.Number = 0 Then
      oBB.Insert Selection.Range,True
   Else
      MsgBox Prompt:="The Building Block '" & sBBName & "' cannot be found in " & _
         ThisDocument.Name & ".",Title:="Didn't Work!"
   End If
   On Error GoTo 0
lbl_Exit:
   Exit Sub
End Sub

这个和前面的宏都包含在一个演示模板中,可以从我的下载页面下载。

情况 2 - 包含构建块的模板位于 Word 启动文件夹中并命名为 MyBBTemplate.dotx

由于某种原因,这个模板不包含宏,它在一个单独的模板中。我们知道容器模板的名称。这 包含宏的模板名称对我们来说无关紧要 目的。

Sub InsertMyBB()
'  Will not work if the Startup Folder is the root directory of a drive,i.e. C:\
'  For use with building block stored in a template loaded in the Word Startup Folder that does NOT hold this macro
'  Will not work if there are multiple building blocks with the same name in the template!
'
   Dim sBBName As String
   Dim sTemplateName as String
   Dim sStartupPath as String
   sBBName = "MyBB"
   sTemplateName="MyBBTemplate.dotx"
   sStartupPath = Application.Options.DefaultFilePath(wdStartupPath)
   On Error GoTo Oops ' error handler
   Application.Templates.LoadBuildingBlocks  ' thank you Timothy Rylatt
   Application.Templates(sStartupPath & "\" & sTemplateName).BuildingBlockEntries(sBBName) _
      .Insert Where:=Selection.Range,RichText:=True ' Insert MyBB Building Block
   Exit Sub ' We're done here
Oops: ' Didn't work - building block not there!
   MsgBox Prompt:="The Building Block " & sBBName & " cannot be found in " & _
      sTemplateName".",Title:="Didn't Work!"
   On Error GoTo 0
End Sub

情况三——模板所在的积木存放位置为“Building Blocks.dotx”

这个模板也不包含宏,因为构建块文件夹中的模板不会向 Word 贡献宏,即使 它们包含它们。这个宏结合了 Greg Maxey 和 Jay Freedman 在此线程中给出。 Building Blocks.dotx 是 默认情况下用于存储自定义构建块的模板 比自动图文集。它由用户以依赖于语言的方式存储, 版本相关的文件夹。此宏旨在检索 构建块,无论语言或版本如何。

Sub InsertMyBB()
'  Based on code by Greg Maxey and Jay Freedman
'  For use with building block stored in the default custom building blocks file "Building Blocks.dotx"
'  Will not work if there are multiple building blocks with the same name in the template!
'
   Templates.LoadBuildingBlocks ' in case building blocks not yet accessed
   Dim sBBName As String
   Dim sStartupPath as String
   Dim sTemplateName as String
   sBBName = "MyBB"
   sTemplateName="Building Blocks.dotx"
   sStartupPath = Application.Options.DefaultFilePath(wdStartupPath)
   On Error GoTo Oops ' error handler
   Application.Templates(sStartupPath & "\" & sTemplateName).BuildingBlockEntries(sBBName) _
      .Insert Where:=Selection.Range,RichText:=True ' Insert MyBB Building Block
   Exit Sub ' We're done here
Oops: ' Didn't work - building block not there!
   MsgBox Prompt:="The Building Block " & sBBName & " cannot be found in " & _
      sTemplateName & ".",Title:="Didn't Work!"
   On Error GoTo 0
End Sub

插入构建块的各种代码来自我在 AutoText,Building Blocks and AutoFormat 上的页面。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。