简体   繁体   中英

Word 2 HTML VBA Macro

I have multiple word documents, all in same format. Now I am putting all those as HTML pages for a internal help portal. I thought of creating a macro that when run automatically generates valid HTML file which I can directly upload to web server. I am able to get everything out as HTML code using vba code. But I am stuck at list paragraphs. I am getting <Li></Li> tags for all the list items but how can I get a <ol> or <ul> tag surronding them?

Sample document is available at here.

Below is my VBA code.

    Sub ListParagraphs()
Dim p As Paragraph
For Each p In ActiveDocument.Paragraphs

If p.Style = ActiveDocument.Styles("Title") Then
Debug.Print "<h2>" & p.Range.Text & "</h2>"
End If

If p.Style = ActiveDocument.Styles("Heading 1") Then
Debug.Print "<h3>" & p.Range.Text & "</h3>"
End If

If p.Style = ActiveDocument.Styles("Heading 2") Then
Debug.Print "<h4>" & p.Range.Text & "</h4>"
End If

If p.Style = ActiveDocument.Styles("Normal") Then
Debug.Print "<p>" & p.Range.Text & "<p>"
End If

If p.Style = ActiveDocument.Styles(wdStyleListParagraph) Then
    p.Range.Select
    Selection.EndKey Unit:=wdLine
    Debug.Print "<li>" & p.Range.Text & "</li>"
End If

Next p

End Sub

The Output I am getting is:

        <h2>Main Title of page
    </h2>
    <p>On the Insert tab, the galleries include items that are designed to coordinate with the overall look of your document. You can use these galleries to insert tables, headers, footers, lists, cover pages, and other document building blocks. When you create pictures, charts, or diagrams, they also coordinate with your current document look.
    <p>
    <h3>Sub topic heading – number 1
    </h3>
    <p>On the Insert tab, the galleries include items that are designed to coordinate with the overall look of your document. You can use these galleries to insert tables, headers, footers, lists, cover pages, and other document building blocks.
    <p>
    <li>Instruction number one. You can use these galleries to insert tables, headers, footers, lists.
    </li>
    <li>/
    </li>
    <li>Instruction number two. This is a small step.
    </li>
    <li>/
    </li>
    <li>More instructions go here. 
    </li>
    <li>/
    </li>
    <h3>Subtopic heading - number 2
    </h3>
    <p>On the Insert tab, the galleries include items that are designed to coordinate with the overall look of your document. You can use these galleries to insert tables, headers, footers, lists, cover pages, and other document building blocks. When you create pictures, charts, or diagrams, they also coordinate with your current document look.
    <p>
    <h4>Sub sub-topic under number 2
    </h4>
    <p>On the Insert tab, the galleries include items that are designed to coordinate with the overall look of your document.
    <p>
    <li>Remember the following points. 
    </li>
    <li>/
    </li>
    <li>More instructions.
    </li>
    <li>/
    </li>
    <h4>Second sub topic under number 2
    </h4>
    <li>Line one.
    </li>
    <li>/
    </li>
    <li>Line 2.
    </li>
    <li>/
    </li>
    <p>
    <p>
    <p>
    <p>
    <p>
    <p>

Oh yes! Thank you very much enhzflep for giving me the hint! Below code working as expected.

Dim lastElement As String
Dim typeElement As String

lastElement = "none"
typeElement = "none"
For Each p In ActiveDocument.Paragraphs

If p.Style = ActiveDocument.Styles("Title") Then
    If lastElement = "list" Then
        stream.WriteLine "</" & typeElement & ">"
    End If

    stream.WriteLine "<h2>" & p.Range.Text & "</h2>"
    lastElement = "title"

End If

If p.Style = ActiveDocument.Styles("Heading 1") Then
    If lastElement = "list" Then
            stream.WriteLine "</" & typeElement & ">"
    End If

stream.WriteLine "<h3>" & p.Range.Text & "</h3>"
lastElement = "heading1"

End If

If p.Style = ActiveDocument.Styles("Heading 2") Then
    If lastElement = "list" Then
            stream.WriteLine "</" & typeElement & ">"
    End If

stream.WriteLine "<h4>" & p.Range.Text & "</h4>"
lastElement = "heading2"

End If

If p.Style = ActiveDocument.Styles("Normal") Then
    If lastElement = "list" Then
            stream.WriteLine "</" & typeElement & ">"
    End If

stream.WriteLine "<p>" & p.Range.Text & "</p>"
lastElement = "normal"

End If

If p.Style = ActiveDocument.Styles(wdStyleListParagraph) Then
    If p.Range.ListFormat.ListType = wdListSimpleNumbering Then
       typeElement = "ol"
       ElseIf p.Range.ListFormat.ListType = wdListBullet Then
       typeElement = "ul"
    End If

    If lastElement <> "list" Then
        stream.WriteLine "<" & typeElement & ">"
    End If
    stream.WriteLine "<li>" & p.Range.Text & "</li>"
    lastElement = "list"

End If

Next p

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM