gpt4 book ai didi

vba - 用VBA提取Word文档目录的标题和页码

转载 作者:行者123 更新时间:2023-12-04 12:14:15 25 4
gpt4 key购买 nike

基本上我们这里有

Getting the headings from a Word document

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 and footer.
Set rng = docOutline.Content
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

但我也需要每个标题的页码。

我尝试搜索每个标题,选择搜索结果并检索 wdActiveEndPageNumber。

这不起作用,速度很慢,而且肯定是一种丑陋的方法。

我想将找到的东西粘贴到另一个 word 文档中,例如:
rng.InsertAfter "Page:"& pageNum & "Header:"& strText & vbNewLine

最佳答案

那么,我可能不明白这个问题,但是这段代码会遍历文档,查找仅作为标题的行并打开页面。

Public Sub SeeHeadingPageNumber()
On Error GoTo MyErrorHandler

Dim sourceDocument As Document
Set sourceDocument = ActiveDocument

Dim myPara As Paragraph
For Each myPara In sourceDocument.Paragraphs
myPara.Range.Select 'For debug only
If InStr(LCase$(myPara.Range.Style.NameLocal), LCase$("heading")) > 0 Then
Debug.Print myPara.Range.Information(wdActiveEndAdjustedPageNumber)
End If

DoEvents
Next

Exit Sub

MyErrorHandler:
MsgBox "SeeHeadingPageNumber" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Sub

关于vba - 用VBA提取Word文档目录的标题和页码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3628222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com