从Word文档中获取标题

2024-02-14

如何使用VBA获取Word文档中所有标题的列表?


你的意思是这样创建大纲 http://msdn.microsoft.com/en-us/library/bb960898.aspx函数(实际上将源 Word 文档中的所有标题复制到新的 Word 文档中):

(我相信astrHeadings = docSource.GetCrossReferenceItems http://msdn.microsoft.com/en-us/library/aa201500(office.10).aspx(wdRefTypeHeading)函数是这个程序的关键,应该允许您检索您所要求的内容)

Public Sub CreateOutline()
    Dim docOutline As Word.Document
    Dim docSource As Word.Document
    Dim rng As Word.Range
    
    Dim astrHeadings As Variant
    Dim strText As String
    Dim intLevel As Integer
    Dim intItem As Integer
        
    Set docSource = ActiveDocument
    Set docOutline = Documents.Add
    
    ' Content returns only the main body of the document, not the headers/footer.        
    Set rng = docOutline.Content
    ' GetCrossReferenceItems(wdRefTypeHeading) returns an array with references to all headings in the document
    astrHeadings = docSource.GetCrossReferenceItems(wdRefTypeHeading)
    
    For intItem = LBound(astrHeadings) To UBound(astrHeadings)
        ' Get the text and the level.
        strText = Trim$(astrHeadings(intItem))
        intLevel = GetLevel(CStr(astrHeadings(intItem)))
        
        ' Add the text to the document.
        rng.InsertAfter strText & vbNewLine
        
        ' Set the style of the selected range and
        ' then collapse the range for the next entry.
        rng.Style = "Heading " & intLevel
        rng.Collapse wdCollapseEnd
    Next intItem
End Sub

Private Function GetLevel(strItem As String) As Integer
    ' Return the heading level of a header from the
    ' array returned by Word.
    
    ' The number of leading spaces indicates the
    ' outline level (2 spaces per level: H1 has
    ' 0 spaces, H2 has 2 spaces, H3 has 4 spaces.
        
    Dim strTemp As String
    Dim strOriginal As String
    Dim intDiff As Integer
    
    ' Get rid of all trailing spaces.
    strOriginal = RTrim$(strItem)
    
    ' Trim leading spaces, and then compare with
    ' the original.
    strTemp = LTrim$(strOriginal)
    
    ' Subtract to find the number of
    ' leading spaces in the original string.
    intDiff = Len(strOriginal) - Len(strTemp)
    GetLevel = (intDiff / 2) + 1
End Function

@kol 于 2018 年 3 月 6 日更新

虽然astrHeadings是一个数组(IsArray回报True, and TypeName回报String())我得到一个type mismatch当我尝试在 VBScript 中访问其元素时出现错误(Windows 10 Pro 1709 16299.248 上的 v5.8.16384)。这肯定是 VBScript 特定的问题,因为如果我在 Word 的 VBA 编辑器中运行相同的代码,我就可以访问这些元素。我最终迭代了 TOC 的各行,因为它甚至可以在 VBScript 中工作:

For Each Paragraph In Doc.TablesOfContents(1).Range.Paragraphs
  WScript.Echo Paragraph.Range.Text
Next
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从Word文档中获取标题 的相关文章

  • VBA MS-Word:是否可以用通配符替换文本?

    是否可以替换使用通配符找到的文本并将其也替换为通配符 例如FindText 13 2 13 Forward True MatchWildcards True 然后用这样的通配符替换它replacewith 13 2 11 是否可以 评论中的
  • 在 Word 2010 中开发功能区选项卡,在组标签名称中使用 & 符号

    我正在开发一个用于模板的功能区选项卡 MyTemplate dotm 对于 Word 2010 我的问题 我想在组的标签中使用与号 我尝试了很多方法 也用谷歌搜索了很多关于这个问题的信息 但没有任何效果 named amp decimal
  • VBA Excel 选择以字符开头的命名范围

    我在命名范围方面遇到了一些问题 我在不同的工作表上有多个命名范围 我想用VBA隐藏或显示所有这些范围 命名范围的示例 r1 name1 另一张纸上的第二个是r1 name2 因此 所有范围都以前面相同的代码开头 r1 我如何循环遍历以 r1
  • 使用 UnmanagedExports 包 [DllExport] 在 VBA 中调用 C# DLL 触发“找不到 DLL 入口点”错误

    我在用着罗伯特 吉塞克 http stackoverflow com users 35443 robert giesecke用于访问 Excel VBA 中的 c dll 的非托管导出包 我遵循了几个示例并继续收到运行时错误 453 在 m
  • 将 VBA 字符串转换为双精度

    我正在使用非常基本的 VBA for word 编码来创建一个模板 该模板可以从 Windows 中的其他屏幕中提取数据 当它提取数字时 它们被格式化为字符串 我现在需要将字符串转换为双精度 以便对它们进行加 减 我一直在尝试一切 但似乎无
  • VBA 代码基准测试

    对 VBA 代码进行基准测试最准确的方法是什么 在我的例子中 我正在 Excel 中测试代码 除了下面的 2 种之外 还有其他对代码进行基准测试的技术吗 如果有 该方法的优点 缺点是什么 这里有两种流行的方法 First Timer Sub
  • VBA 从文本文件的属性获取日期

    我正在尝试获取特定文本文件上传到计算机的日期 该日期不在实际的文本文件中 您必须右键单击然后转到属性才能查看日期 我需要将日期读入变量 我不知道从哪里开始尝试完成这件事 谢谢你 杰西 斯莫瑟蒙 如果内置FileDateTime 不是你可以使
  • 如何查找 Outlook .pst 文件的完整路径?

    有没有办法通过 API 调用或注册表项以编程方式查找当前用户的 Outlook pst 文件的位置 With 展望赎回 http www dimastr com redemption 您可以使用 VBA 迭代消息存储RDOStores集合
  • 副水平X轴VBA最大刻度

    通过以下代码和敏 正在设置 VBA 中图表的主水平 X 轴的比例 Sub chart set Dim objCht As ChartObject With ActiveSheet ChartObjects 1 Chart Axes xlVa
  • 使用 access VBA 将列表框项目添加到数组

    我在访问表单中有一个列表框 它包含 18 项 我如何使用 access vba 将这些项目存储到数组中 下面将把列表框的内容拉入数组并吐出内容 Dim Size As Integer Size Me List0 ListCount 1 Re
  • 访问应用程序,带有表单任务栏图标的隐藏应用程序窗口

    我有一个带有一个主表单的访问应用程序 当您打开应用程序时 AutoExec 宏会通过 Windows API apiShowWindow 隐藏应用程序 然后 AutoExec 打开设置为 Popup 的主窗体 这一切都很顺利 我的数据库内容
  • 将 Excel 单元格对齐到中心 VB - xlCenter 未声明

    我使用 Visual Studio 2013 Visual Basic MS ACCESS 2013 EXCEL 2013 我的程序将数据另存为数据网格中的数据以进行Excel处理 我使用access 2013作为我的数据库 这是我的代码
  • 根据每日价格时间序列计算每周收益

    我想根据每日价格的时间序列计算共同基金的每周回报 我的数据如下所示 A B C D E DATE WEEK W DAY MF PRICE WEEKLY RETURN 02 01 12 1 1 2 7587 03 01 12 1 2 2 76
  • VBA 中类初始化时的参数

    是否可以在初始化时向类传递参数 就像 Java 等面向对象语言中所做的那样 您可以在其中创建参数化构造函数 事件Class Initialize 不允许我输入参数 我怎么解决这个问题 不幸的是 您不能使用参数化构造函数 最接近的替代方案是工
  • VBA填写两个单元格之间的所有单元格

    我目前正在尝试编写一些 VBA 代码 该代码将使用两个单元格的值填充两个单元格之间的所有单元格 这是我所拥有的 我希望代码能够填写之间的所有单元格 如下所示 因此 正如您所看到的 我希望中间的所有单元格都填写为与两个角单元格相同的值 很感谢
  • 使用 MS Access 在 Excel VBA 中运行代码

    我使用访问前端从 SQL Server 中提取查询 然后 我将记录集导出到新的 Excel 工作簿 然后我想使用 Excel 运行 Access 中的代码 它只是循环遍历单元格并添加格式并检查特定值 我可以从访问权限运行它 它将让工作簿打开
  • 使用 VBA 从 Word 发送 HTTP 请求

    我正在尝试将数据从 Word 文档发送到网页 我找到了一些代码 将其粘贴到新模块中并保存 当我运行它时 我收到 编译错误 用户定义的类型未定义 My code Sub http Dim MyRequest As New WinHttpReq
  • 64 位 Windows 7 上的 Excel 2003 自动更改对 SysWOW64\MSCOMCTL.OCX 的引用,因此 32 位 Excel 会抱怨

    在 Excel 2003 VBA 项目中 我使用 MSCOMCTL OCX 中的控件 也就是说 VBA 项目引用了 System32 MSCOMCTL OCX 当我在 64 位 Windows 7 系统上的 Excel 2003 中打开该项
  • Excel 区分大小写的 COUNTIF 带通配符:本机函数?

    我正在尝试找到一个本机 Excel 函数 或其组合 该函数将以 COUNTIF 的方式精确运行 即处理通配符 但区分大小写 我已经成功使用了 SUMPRODUCT EXACT 函数 它们确实执行区分大小写的计数 但问题是我无法让它们识别通配
  • 变量的变化触发事件

    是否可以通过变量的更改来触发事件 例如 这将触发事件 Dim t As Integer Dim Fire As Boolean Private Sub Test t 0 Fire True IIf Fire t 1 t 2 End sub

随机推荐