我正在尝试编写一个vbs脚本来创建一个包含目录的word文档。我能够插入目录但无法填充表格。
Set oInfo = Dictionary.Items("Use Case")
For Each oInfo in oInfo
Set entryRange = objSelection.Range
objDoc.TablesOfContents.MarkEntry entryRange, oInfo("Name"), oInfo("Name"), W, 1
objSelection.TypeText "Info" + vbNewline + oInfo("Name")
objSelection.TypeParagraph()
Next
objDoc.TablesOfContents.Add(tocRange)
这会导致正确插入目录,但只显示" 找不到目录条目。"此外,在文档的最后,我得到奇怪的无格式文本,看起来像这样:
{TC" Info1" \ f C \ | " 1"}
对于我在For循环中迭代并为每个部分使用正确标题的每个对象重复此操作。我觉得自己走在正确的轨道上,但我对TablesOfContents
对象的了解不够,无法做我想做的事情。我认为其中一个主要问题是TableId
函数中的markEntry
字段。
答案 0 :(得分:0)
使用MarkEntry时,Word会插入{TC}字段。那些"奇怪的无格式文本"事情是。它们没有可见的结果,因此如果您切换到字段结果视图(Windows Word上的Alt-F9)并且不显示隐藏文本,它们将完全消失。因此,它们通常是在文档完全填充后在文档中的适当位置添加的内容。我猜大多数ToCs实际上都会从标题级别或大纲级别中获取条目。如果您进入Word本身的相关部分并使用各种ToC选项,您应该能够更好地了解这些内容的工作原理。
当您插入TOC时,您还会获得一个字段。在你的代码中,您的代码可能正在插入
{ TOC \o "1-9" }
这将从大纲级别1-9的段落中获取条目。但它不会从TC字段插入条目。为此,您需要(至少)
{ TOC \f C }
(因为C是您在theTC字段中使用的标识符。)
您可以使用
在VBA代码中执行此操作objDoc.TablesOfContents.Add Range:=tocRange, UseFields:=True, TableID:="C"
如果您仍然需要从"大纲级别"那么你需要在.Add方法中将适当的参数设置为True。
在您的代码中的某个时刻,您可能还需要找到TOC字段并且"更新"它
另外,如果您无法通过对象模型的.Add和.MarkEntry字段访问所需的所有现场设施,则还可以更直接地插入大多数字段代码,例如:通过添加" wdFieldEmpty"类型的字段到一个范围并提供其域代码。