2010-09-02 14 views
7

के साथ एक वर्ड दस्तावेज़ की विषय-सूची के PAGENUMBER हम यहाँनिकालें हेडिंग और VBA

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 पुनर्प्राप्त करें।

यह काम नहीं किया, धीमा था और यकीन है कि एक बदसूरत दृष्टिकोण है। rng.InsertAfter "पृष्ठ::" & pageNum &

मैं एक और शब्द दस्तावेज़ की तरह में पाया सामान पेस्ट करना चाहते हैं "हैडर:" & strText & vbNewLine

उत्तर

6

मुझे प्रश्न समझ में नहीं आ रहा है, लेकिन, यह कोड दस्तावेज़ के माध्यम से जाता है, केवल उन शीर्षकों की तलाश करता है जो केवल शीर्षलेख होते हैं और पृष्ठ को प्राप्त करते हैं।

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 
+1

+1। यह शायद इस बारे में जाने का सबसे तेज़/आसान तरीका है। अगर यह मैं था, तो मैं यह जवाब स्वीकार करूंगा। –

+0

वाह, बहुत देर से जवाब देने के लिए खेद है और आपके उत्तर के लिए धन्यवाद। – FTav

0

सामग्री क्षेत्र की एक तालिका का उपयोग करें। निम्नलिखित कोड एक टीओसी विच्छेदन करता है और आपको आइटम, पेज नंबर और शैली देता है। आपको आवश्यक सटीक जानकारी या फ़ॉर्मेटिंग प्राप्त करने के लिए आपको प्रत्येक स्ट्रिंग को पार्स करना पड़ सकता है।

Public Sub SeeTOCInfo() 
    On Error GoTo MyErrorHandler 

    Dim sourceDocument As Document 
    Set sourceDocument = ActiveDocument 

    Dim myField As Field 
    For Each myField In sourceDocument.TablesOfContents(1).Range.Fields 
     Debug.Print Replace(myField.Result.Text, Chr(13), "-") & " " & " Type: " & myField.Type 
     If Not myField.Result.Style Is Nothing Then 
      Debug.Print myField.Result.Style 
     End If 
     DoEvents 
    Next 

    Exit Sub 

MyErrorHandler: 
    MsgBox "SeeTOCInfo" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description 
End Sub 
+0

यह अच्छा लगता है, लेकिन मैं बाद में पुनः प्राप्त जानकारी विस्तार करने के लिए हो सकता है और मैं एक टीओसी के साथ "स्वतंत्रता" के प्रकार लगते हैं की जरूरत नहीं है:/ – FTav

0

यह संदर्भित शीर्षक की पृष्ठ संख्या सम्मिलित होगा:

rng.InsertCrossReference ReferenceType:=wdRefTypeHeading, _ 
      ReferenceKind:=wdPageNumber, ReferenceItem:=intItem 

लेकिन तभी काम करता है आप एक ही दस्तावेज़ में डालने कर रहे हैं। आप वर्तमान दस्तावेज़ में सम्मिलित कर सकते हैं और फिर किसी नए दस्तावेज़ में कट/पेस्ट कर सकते हैं।

+0

यह अच्छा लगता है, लेकिन कैसे वास्तव में डालने होगा और कट/पेस्ट प्रक्रिया एक तरह दिखती है? क्षमा करें मैं वीबीए के बारे में एक असली शुरुआत कर रहा हूँ। – FTav