(This question is a follow-up on how to work with a document embedded in an Excel workbook in the Word application interface (instead of in-place). The reason this is necessary is to be able to save the result as an independent document.)
The problem is that I have dynamic content in Excel. In cells of Column EI have actually formula, for example E55 =IF(B55="";"";"normal")
E55 is also =IF('Technical!B55'="";"";'Technical!B55')
. My current code does not understand that for example cell B57 is empty and thinks it should be printed to MS Word. It does not insert any content to MS Word but inserts for example bullets that are predefined for style in MS Word. How to stop that? I can make for example =IF(B55="";"empty";"normal")
so unnecessary rows will be marked with word "empty" if it helps anyhow.
A B C D E
49 Paragraph with number 1 main
48 Ok text is text and it is good to have here.. a lot of normal
50 Legal John Smith table
51 Telephone +4854132155 table
52 Email john.smith@mail.com table
53 Paragraph with number 2 main
54 Text again a lot of text again comes here normal
55 Text again a lot of text again comes here normal
56 Text again a lot of text again comes here normal
57 =IF('Technical!B57'="";"";'Technical!B57') =IF(B57="";"";"normal")
58 =IF('Technical!B58'="";"";'Technical!B58') =IF(B58="";"";"normal")
My current code:
With objWord
Set wdRng = .Range.Characters.Last
Set wdUndo = .Application.UndoRecord
wdUndo.StartCustomRecord ("Doc Data")
Set xlSht = Sheets("Other Data")
'Here comes Header
.Bookmarks("Date").Range.Text = xlSht.Range("AT2").Value
.Bookmarks("DocumentName").Range.Text = xlSht.Range("AX13").Value
Set xlSht = Nothing
Set xlSht = Sheets("Pricelist")
For Each cell In xlRng
wdRng.InsertAfter vbCr & cell.Offset(0, -4).Text
Select Case LCase(cell.Value)
Case "title"
wdRng.Paragraphs.Last.Style = .Styles("Heading 1")
Case "main"
wdRng.Paragraphs.Last.Style = .Styles("Heading 2")
Case "sub"
wdRng.Paragraphs.Last.Style = .Styles("Heading 3")
Case "sub-sub"
wdRng.Paragraphs.Last.Style = .Styles("Heading 4")
Case "normal"
wdRng.Paragraphs.Last.Style = .Styles("Normal")
Case "contact"
wdRng.Paragraphs.Last.Style = .Styles("Contact")
Case "attachment"
wdRng.Paragraphs.Last.Style = .Styles("Attachment")
Case "technical"
wdRng.Paragraphs.Last.Style = .Styles("Technical")
Case "topic"
wdRng.Paragraphs.Last.Style = .Styles("Topic")
Case "signature"
Sheets("Signatures").Range("M7:N7").Copy
With wdRng
.Paragraphs.Last.Range.PasteSpecial (wdPasteBitmap)
End With
Case "pagebreak"
With wdRng
.Paragraphs.Last.Range.InsertBreak Type:=wdPageBreak
End With
Case "table"
xlSht.Range(cell.Offset(0, -4), cell.Offset(0, -1)).Copy
With wdRng
.Paragraphs.Last.Range.PasteAndFormat (wdFormatPlainText)
End With
End Select
Next cell
.SaveAs2 ActiveWorkbook.Path & "\" & _
Sheets("Other Data").Range("AN2").Value & ", " & _
Sheets("Other Data").Range("AN7").Value & "_" & _
Sheets("Other Data").Range("AN8").Value & "_" & _
Sheets("Other Data").Range("AX3").Value & ".docx"
wdUndo.EndCustomRecord
Set wdUndo = Nothing
.Undo
.Application.Quit False
End With
Sometimes it is good to have a cup of tea and think about something else. I have came up with an idea of using =IF(B55="";"empty";"normal")
so I will get word "empty" in unnecessary cells. Then I created new Case with name "empty" and used following code:
Case "empty"
With wdRng
.Paragraphs.Last.Range.Delete
End With
I don't know if this is the best solution. At least it works.
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.