Log in

View Full Version : [SOLVED:] Save file as PDF by file name using content from current document with Word VBA



tendosai
04-05-2020, 08:07 PM
Greeting everyone,


So i am trying to make macro to save from word document (many pages) to separate PDF file. However, I want the second line of paragraph as my file name accordingly. Here is my code that i have tried but instead it saving with replace of each other due to same file name.

Sub AllSectionsToSubDoc()

Dim x As Long
Dim Sections As Long
Dim Doc As Document
Dim FirstPara As String
Dim r As Range

Application.ScreenUpdating = False
Application.DisplayAlerts = False


Set Doc = ActiveDocument
Sections = Doc.Sections.Count
For x = Sections - 1 To 1 Step -1
FirstPara = Paragraphs(2).Range.Text
FirstPara = Left(FirstPara, Len(FirstPara) - 1)
Doc.Sections(x).Range.Copy
Documents.Add
ActiveDocument.Range.Paste
ActiveDocument.SaveAs (Doc.Path & "\" & FirstPara & ".pdf"), (wdExportFormatPDF)
ActiveDocument.Close False
Next x

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub

Another question: I try to trim the paragraph. example: I have my second paragraph "Dear Mr. John Adam". I want my file name "John Adam.pdf" however in my code it gave me full "Dear Mr. John Adam.pdf" instead. I tried using Right(FirstPara, Len(FirstPara) - 1) but i got error command.

macropod
04-05-2020, 08:59 PM
It appears you're trying to split the output from a mailmerge. For that, see: Split Merged Output to Separate Documents in the Mailmerge Tips and Tricks thread at: msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html. Better still would be to split the content as the mailmerge is done. For that, see Send Mailmerge Output to Individual Files on the same page.

FWIW, your own code would likely work as:

Sub AllSectionsToSubDoc()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim DocSrc As Document
Dim DocTgt As Document
Dim s As Long
Dim StrNm As String

Set DocSrc = ActiveDocument
With DocSrc
For s = .Sections.Count - 1 To 1 Step -1
Set DocTgt = Documents.Add
With .Sections(s).Range
StrNm = Split(Split(.Paragraphs(2).Range.Text, vbCr)(0), ".")(1)
DocTgt.Range.FormattedText = .Sections(x).Range.FormattedText
DocTgt.SaveAs Doc.Path & "\" & StrNm & ".pdf", wdFormatPDF
DocTgt.Close False
End With
Next
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

gmayor
04-05-2020, 09:12 PM
You need to process 'firstname' to get the string you want e.g.



Dim vPara as Variant
Dim sName as String
Dim y as Long



FirstPara = Left(FirstPara, Len(FirstPara) - 1)
vPara = Split(FirstPara, Chr(32))
sName = ""
For y = 1 To UBound(vPara)
sName = sName & vPara(y)
If y < UBound(vPara) Then sName = sName & Chr(32)
Next y
Then use sName in the naming code.

I have not seen your original document, but shouldn't the code extract the second para from each section? e.g.

FirstPara = Doc.Sections(x).Range.Paragraphs(2).Range.Text

macropod
04-05-2020, 11:25 PM
Cross-posted at: https://social.msdn.microsoft.com/Forums/office/en-US/18059b97-bf1a-4abb-87b0-65786d9c8365/save-file-as-pdf-by-file-name-using-content-from-current-document-with-word-vba
Please read VBA Express' policy on Cross-Posting in Rule 3: http://www.vbaexpress.com/forum/faq.php?faq=new_faq_item#faq_new_faq_item3

tendosai
04-05-2020, 11:41 PM
gmayor
Thank brother. I tried as you mention.
i got error "The request member of the collection does not exist."

macropod
i paste the code and i got same error "The request member of the collection does not exist."
I actually tried with mail merge trick. i got the pdf save seperately but cant figured out the name. i cant seem to get an idea how to get (let's say "Name" to use as filename when save.

For cross post. i have deleted the post at forum but it still there tho. let me delete again.

macropod
04-05-2020, 11:47 PM
macropod
i paste the code and i got same error "The request member of the collection does not exist."
That suggests your source document is not consistently as described; we can only work with what we're given.


Without actually seeing the problem document, with some representative samples of the data, it can be difficult for anyone to diagnose the issue. Can you attach a document to a post with some representative data (delete anything sensitive)? You do this via the paperclip symbol on the 'Go Advanced' tab at the bottom of this screen.


I actually tried with mail merge trick. i got the pdf save seperately but cant figured out the name. i cant seem to get an idea how to get (let's say "Name" to use as filename when save.
The instructions in the link say quite clearly how to do that...

tendosai
04-06-2020, 12:08 AM
Sub Merge_To_Individual_Files()
' Sourced from: https://www.msofficeforums.com/mail-merge/21803-mailmerge-tips-tricks.html
Application.ScreenUpdating = False
Dim StrFolder As String, StrName As String, MainDoc As Document, i As Long, j As Long
Const StrNoChr As String = """*./\:?|"
Set MainDoc = ActiveDocument
With MainDoc
StrFolder = .Path & "\"
With .MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
On Error Resume Next
For i = 1 To .DataSource.RecordCount
With .DataSource
.FirstRecord = i
.LastRecord = i
.ActiveRecord = i
If Trim(.DataFields("First_Name")) = "" Then Exit For
'StrFolder = .DataFields("Folder") & "\"
StrName = .DataFields("First_Name")
End With
.Execute Pause:=False
If Err.Number = 5631 Then
Err.Clear
GoTo NextRecord
End If

With ActiveDocument
'Add the name to the footer
'.Sections(1).Footers(wdHeaderFooterPrimary).Range.InsertBefore StrName
' .SaveAs FileName:=StrFolder & StrName & ".docx", FileFormat:=wdFormatXMLDocument, AddToRecentFiles:=False
' and/or:
.SaveAs FileName:=StrFolder & StrName & ".pdf", FileFormat:=wdFormatPDF, AddToRecentFiles:=False
.Close SaveChanges:=False
End With
NextRecord:
Next i
End With
End With
Application.ScreenUpdating = True
End Sub

Thank bro macropod for pointing the right direction.
If you happen to google and land here. Code above save your .docm (macro enable) file that is using mail merge into .pdf seperately. (it saved the separated file the same path of your .docm file.) I have removed "Last_Name" because i have only "First_Name" I also remove

For j = 1 To Len(StrNoChr)
StrName = Replace(StrName, Mid(StrNoChr, j, 1), "_")
Next
StrName = Trim(StrName)

All credit give to Mr. Macropod

macropod
04-06-2020, 12:19 AM
I also remove
For j = 1 To Len(StrNoChr)
StrName = Replace(StrName, Mid(StrNoChr, j, 1), "_")
Next
StrName = Trim(StrName)
That code exists to remove any characters that would be illegal in a filename; omit it at your peril.