Forum Discussion

Joe Gray's avatar
Joe Gray
Copper Contributor
May 30, 2017
Solved

Re: Macro to save as PDF with auto filename as cell value

Hi I recently used the following Macro, provided by Gary's Student, to create a PDF from an active sheet, generate a unique Filename based on a cell ref and save it to a specific location.

 

This macro works well for me, however, I would like to add to it so that I can also attach it too and email and send to a specific email group (using Outlook). Maybe have it allow you to View so it can be sent manually, or the option to automatically send.

 

Below is the value I used to create the filename based on the date entry within I3 and I formatted it as shown.

 

Cell H1 "=I:\2017 - 2018\Operations Unit\Day Sheets\"&"DS_"&TEXT(I3,"yymmdd")&".PDF"

 

Sub Macro1()

 

s = Range("H1").Value

'

      ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _

            s,  Quality:=xlQualityStandard, IncludeDocProperties _

            :=True, IgnorePrintAreas:=False, OpenAfterPublish:=True

 

End Sub

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

 

End Sub

 

 

 

  • This is code I use.

    End Sub

    Private Sub Email()
    
        Dim objOutlook As Object
        Dim objMail As Object
        Dim signature As String
        Dim oWB As Workbook
        Set oWB = ActiveWorkbook
        
        Set objOutlook = CreateObject("Outlook.Application")
        Set objMail = objOutlook.CreateItem(0)
        
            
        With objMail
            .Display
        End With
            signature = objMail.HTMLbody
        With objMail
            .To = oWB.Sheets("Sheet1").Range("A1").Value
            ''.SentOnBehalfOfName = ""
            .Subject = strMySubject
            ''.body = "Dear Sir," & vbNewLine & vbNewLine & "Add stuff here" & vbNewLine & vbNewLine & signature
            .HTMLbody = "<font face=" & Chr(34) & "Calibri" & Chr(34) & " size=" & Chr(34) & 4 & Chr(34) & ">" & "Dear Sir," & "<br> <br>" & "Add stuff here" & "<br> <br>" & signature & "</font>"
            .Attachments.Add (strSaveFileName + ".pdf")
            .Display
        End With
    
        Set objOutlook = Nothing
        Set objMail = Nothing
        
    End Sub
  • Andrew Jones's avatar
    Andrew Jones
    Copper Contributor

    This is code I use.

    End Sub

    Private Sub Email()
    
        Dim objOutlook As Object
        Dim objMail As Object
        Dim signature As String
        Dim oWB As Workbook
        Set oWB = ActiveWorkbook
        
        Set objOutlook = CreateObject("Outlook.Application")
        Set objMail = objOutlook.CreateItem(0)
        
            
        With objMail
            .Display
        End With
            signature = objMail.HTMLbody
        With objMail
            .To = oWB.Sheets("Sheet1").Range("A1").Value
            ''.SentOnBehalfOfName = ""
            .Subject = strMySubject
            ''.body = "Dear Sir," & vbNewLine & vbNewLine & "Add stuff here" & vbNewLine & vbNewLine & signature
            .HTMLbody = "<font face=" & Chr(34) & "Calibri" & Chr(34) & " size=" & Chr(34) & 4 & Chr(34) & ">" & "Dear Sir," & "<br> <br>" & "Add stuff here" & "<br> <br>" & signature & "</font>"
            .Attachments.Add (strSaveFileName + ".pdf")
            .Display
        End With
    
        Set objOutlook = Nothing
        Set objMail = Nothing
        
    End Sub
    • Joe Gray's avatar
      Joe Gray
      Copper Contributor

      Thank you Andrew

       

      You‘re no doubt aware that I am new to Coding and very much appreciate your response. I will hopefully be able to pass on assistance to others in the very near future.

      • Joe Gray's avatar
        Joe Gray
        Copper Contributor

        Andrew

         

        Just to let you know that the code below works well for me, and thank you again. 

         

         

        Command Button: -

         

        1. Generates a pdf of the ActiveSheet
        2. Saves pdf to a specific location, indicated in Cell H1, with an auto Filename based on the Sheet Date within Cell I3, formatted as YYMMDD
        3. Opens Outlook and displays email with pdf attached (file with date "Now")
        4. Auto fills Recipients, reading from Cell C50
        5. Email Body as required

        When i'm happy i will change code to automatically send email not display.

         

        for reference:-

        Cell H1:  ="I:\2017 - 2018\Operations Unit\Day Sheets\"&"DS_"&TEXT(I3,"yymmdd")&".PDF"

         

         

        Private Sub Email_Sheet_Click()
        
        Dim objOutlook As Object
            Dim objMail As Object
            Dim signature As String
            Dim oWB As Workbook
            Set oWB = ActiveWorkbook
            
            
            
             s = Range("h1").Value	
          
         '
             ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _
                 s, Quality:=xlQualityStandard, IncludeDocProperties _
                 :=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
                 
                 
            PDF_File = "Insert Path here\DS_" & Format(Now, "YYMMDD") & ".pdf"
         
            
            Set objOutlook = CreateObject("Outlook.Application")
            Set objMail = objOutlook.CreateItem(0)
                
            With objMail
                .Display
            End With
                signature = objMail.HTMLbody
            With objMail
                .To = ActiveSheet.Range("C50")
                .Cc = ActiveSheet.Range("C55")
                .Subject = "Insert Subject Here"
                .HTMLbody = "<font face=" & Chr(34) & "Calibri" & Chr(34) & " size=" & Chr(34) & 4 & Chr(34) & ">" & "Hi," & "<br> <br>" & "Insert email body here" & "<br> <br>" & signature & "</font>"
                .Attachments.Add PDF_File
                .Save
                .Display
            End With
        
            Set objOutlook = Nothing
            Set objMail = Nothing
        End Sub

         

    • Andrew Jones's avatar
      Andrew Jones
      Copper Contributor

      And this is code to export to PDF

       

      You obviously need a full path as a string to save the file to

       

       ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strSaveFileName, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False
                      ThisWorkbook.SaveAs Filename:=strSaveFileName, FileFormat:=xlOpenXMLTemplateMacroEnabled
      • Jitender_modgil's avatar
        Jitender_modgil
        Copper Contributor

        Andrew Jones 

        code as you share not works in window 7/10 64 bit .  my cvode be below

         

        Declare Function RegOpenKeyA Lib "advapi32.dll" ( _
        ByVal Key As Long, _
        ByVal SubKey As String, _
        NewKey As Long) As Long
        Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" ( _
        ByVal hKey As Long, _
        ByVal lpValueName As String, _
        ByVal Reserved As Long, _
        ByVal dwType As Long, _
        lpData As Any, _
        ByVal cbData As Long) As Long
        Declare Function RegCloseKey Lib "advapi32.dll" ( _
        ByVal hKey As Long) As Long

        Sub PrintPDF()
        Dim sPath As String
        Dim strDefaultPrinter As String
        Dim strOutFile As String
        Dim lngRegResult As Long
        Dim lngResult As Long
        Dim dhcHKeyCurrentUser As Long
        Dim PDFPath As String
        Const dhcRegSz As Long = 1

        dhcHKeyCurrentUser = &H80000001
        strDefaultPrinter = Application.ActivePrinter

        sPath = "D:\JOBCARD201920"
        PDFPath = sPath

        strOutFile = PDFPath & "\" & Range("G3").VALUE & ".pdf"


        lngRegResult = RegOpenKeyA(dhcHKeyCurrentUser, "Software\Adobe\Acrobat Distiller\PrinterJobControl", _
        lngResult)
        lngRegResult = RegSetValueEx(lngResult, Application.Path & "\Excel.exe", 0&, dhcRegSz, ByVal strOutFile, Len(strOutFile))
        lngRegResult = RegCloseKey(lngResult)

        ThisWorkbook.ActiveSheet.PrintOut copies:=1, ActivePrinter:="Adobe PDF"
        Application.ActivePrinter = strDefaultPrinter

        end sub

  • Joe Gray's avatar
    Joe Gray
    Copper Contributor
    Further to my previous post I have managed to adapt the code to do what I required: 1. Create a pdf of ActiveSheet 2. Save pdf into a specific location 3. Name the pdf with a file name based on the sheet date 4. Open an email, with selected recipients, and attach the current pdf to and email If you have any suggestions to develop the code or see any possible errors please let me know. Sub Sent_Email() Dim olApp As Object s = Range("h1").Value ' ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _ s, Quality:=xlQualityStandard, IncludeDocProperties _ :=True, IgnorePrintAreas:=False, OpenAfterPublish:=False PDF_File = "I:\2017 - 2018\Operations Unit\Day Sheets\DS_" & Format(Now, "YYMMDD") & ".pdf" Set olApp = CreateObject("Outlook.Application") With olApp.CreateItem(0) .Subject = "Daily Resource Sheet" .To = ActiveSheet.Range("C50") .Cc = ActiveSheet.Range("C55") .Body = "Hi," & vbLf & vbLf _ & "Please find attached the Daily Resource Sheet." & vbLf & vbLf _ & "Regards," & vbLf & vbLf _ & "Roads Operations Unit" .Attachments.Add PDF_File .Save .Display End With End Sub

Resources