Reputation: 405
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>
Upvotes: 0
Views: 2642
Reputation: 405
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
Upvotes: 1