Excel VBA code to work on Mac, Create PDF Function

前端 未结 2 668
清歌不尽
清歌不尽 2021-01-24 12:04

I have coded the following function. However, I cannot get it to work on office Mac. I am not sure of the procedure to find the EXP_PDF.DLL mac equivalent

Funct         


        
2条回答
  •  醉梦人生
    2021-01-24 12:21

    There is no need to check for the existence of that specific DLL, because under MacOS, PDF export support is native. Your code simply works if you remove the Add-in check and remove the FileFilter string:

    Function Create_PDF(Myvar As Object, FixedFilePathName As String, _
    OverwriteIfFileExist As Boolean, OpenPDFAfterPublish As Boolean) As String
    
    Dim FileFormatstr As String
    Dim FName As Variant
    
        If FixedFilePathName = "" Then
           'Open the GetSaveAsFilename dialog to enter a file name for the pdf
           FName = Application.GetSaveAsFilename("", Title:="Create PDF")
            'If you cancel this dialog Exit the function
            If FName = False Then Exit Function
         Else
            FName = FixedFilePathName
        End If
        'If OverwriteIfFileExist = False we test if the PDF
         'already exist in the folder and Exit the function if that is True
        If OverwriteIfFileExist = False Then
            If Dir(FName) <> "" Then Exit Function
        End If
    
       'Now the file name is correct we Publish to PDF
       On Error Resume Next
       Myvar.ExportAsFixedFormat _
                Type:=xlTypePDF, _
                Filename:=FName, _
                Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, _
                IgnorePrintAreas:=False, _
                OpenAfterPublish:=OpenPDFAfterPublish
        On Error GoTo 0
    
        'If Publish is Ok the function will return the file name
         If Dir(FName) <> "" Then Create_PDF = FName
    
    End Function
    

    But GetSaveAsFilename is crippled on MacOS and does not allow filtering files by filetype. If you need to restrict users to a certain filetype, you can resort to AppleScript and do the following:

    Function Create_PDF_Mac(Myvar As Object, FixedFilePathName As String, _
    OverwriteIfFileExist As Boolean, OpenPDFAfterPublish As Boolean) As String
    
    Dim FileFormatstr As String
    Dim FName As Variant
    
        If FixedFilePathName = "" Then
           'Open the GetSaveAsFilename dialog to enter a file name for the pdf
           'FName = Application.GetSaveAsFilename("", ".PDF", Title:="Create PDF")
    
            On Error Resume Next
            ThePath = MacScript("return (path to documents folder) as String")
    
            TheScript = _
            "set applescript's text item delimiters to "","" " & vbNewLine & _
            "set theFile to (choose file name with prompt ""Save As File"" " & _
                "default name ""untitled.pdf"" default location alias """ & _
                ThePath & """ ) as string" & vbNewLine & _
            "if theFile does not end with "".pdf"" then set theFile to theFile & "".pdf"" " & vbNewLine & _
            "set applescript's text item delimiters to """" " & vbNewLine & _
            "return theFile"
    
               FName = MacScript(TheScript)
            On Error GoTo 0
    
            'If you cancel this dialog Exit the function
            If FName = False Then Exit Function
         Else
            FName = FixedFilePathName
        End If
        'If OverwriteIfFileExist = False we test if the PDF
         'already exist in the folder and Exit the function if that is True
        If OverwriteIfFileExist = False Then
            If Dir(FName) <> "" Then Exit Function
        End If
    
       'Now the file name is correct we Publish to PDF
       On Error Resume Next
       Myvar.ExportAsFixedFormat _
                Type:=xlTypePDF, _
                Filename:=FName, _
                Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, _
                IgnorePrintAreas:=False, _
                OpenAfterPublish:=OpenPDFAfterPublish
        On Error GoTo 0
    
        'If Publish is Ok the function will return the file name
         If Dir(FName) <> "" Then Create_PDF = FName
    
    End Function
    

    The you can use an OS selector switch to run the appropriate function for each OS:

    #If Mac Then
        savedFileName = Create_PDF_Mac(...)
    #Else
        savedFileName = Create_PDF_PC(...)
    #End If
    

    Given the limitations of default VB functions in MacOS, this is Microsof't suggested method as well.

提交回复
热议问题