【问题标题】:Convert Multiple Excel Sheet Ranges as PDF VBA将多个 Excel 工作表范围转换为 PDF VBA
【发布时间】:2021-08-20 18:41:11
【问题描述】:

以下代码取 Col"E" 的状态,如果是 = Include,则其对应的工作表范围将转换为 PDF。

我已经尝试过,但它无法正常接收错误invalid procedure call or argument 在线

rng.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=saveLocation

如果您能帮助解决问题,我们将不胜感激。

Sub SelectSheets_Ranges()

  Dim sh As Worksheet, lastR As Long, rng As Range, arr, arrSplit, i As Long, k As Long
  
  Set sh = ActiveSheet
  lastR = sh.Range("C" & sh.Rows.Count).End(xlUp).Row
  
  ReDim arr(lastR - 1)
  For i = 6 To lastR
        If sh.Range("E" & i).Value = "Include" Then
            arr(k) = sh.Range("C" & i).Value & "|" & sh.Range("D" & i).Value: k = k + 1
        End If
  Next i
  ReDim Preserve arr(k - 1)
  For i = 0 To UBound(arr)
        arrSplit = Split(arr(i), "|")
        Set rng = Worksheets(arrSplit(0)).Range(arrSplit(1))


'Create and assign variables
Dim saveLocation As String

saveLocation = "C:\Users\marks\OneDrive\Documents\myPDFFile.pdf"

'Save a range as PDF
rng.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=saveLocation

  
  Next
End Sub

【问题讨论】:

  • 您正在创建多个输出,但看起来您总是使用相同的文件位置来保存?
  • 是的,你是对的。该文件可以保存到已保存 excel 文件的类似文件夹中。无需将文件保存在不同的位置。
  • 但是您有多个文件要在运行中保存?你不能像这样导出一个文件。
  • 是的,我必须一次将多个工作表范围转换为 PDF。那怎么可能呢。
  • 转换成单个 PDF?工作表是否仅设置为打印区域列出的范围?

标签: excel vba pdf


【解决方案1】:

请尝试下一个代码。它保存在ThisWorkbook 路径中,将pdf文件命名为“myPDFFile_sheetName.pdf”。每个创建的文件都将在默认的 pdf 应用程序中打开。如果运行正常,可以适当更改最后一个参数:


Sub SelectSheets_Ranges_ExpPdf()
  Dim sh As Worksheet, lastR As Long, rng As Range, arr, arrSplit, i As Long, k As Long
  
  Set sh = ActiveSheet
  lastR = sh.Range("C" & sh.Rows.Count).End(xlUp).Row
  
  ReDim arr(lastR - 1)
  For i = 6 To lastR
        If sh.Range("E" & i).Value = "Include" Then
            arr(k) = sh.Range("C" & i).Value & "|" & sh.Range("D" & i).Value: k = k + 1
        End If
  Next i
  If k > 0 Then
        ReDim Preserve arr(k - 1)
  Else
        MsgBox "No appropriate range (containing ""Include"") could be found...:exit sub"
  End If
  Dim boolHide As Boolean, boolProt As Boolean
  ActiveWorkbook.Unprotect "4321" 'in order to unprotect he workbook structure
  For i = 0 To UBound(arr)
        boolHide = False: boolProt = False
        arrSplit = Split(arr(i), "|")
        Set rng = Worksheets(arrSplit(0)).Range(arrSplit(1))
        
        If ActiveWorkbook.Sheets(arrSplit(0)).ProtectContents Then _
                ActiveWorkbook.Sheets(arrSplit(0)).Unprotect "4321": boolProt = True
                Debug.Print arrSplit(0)
        If ActiveWorkbook.Sheets(arrSplit(0)).Visible <> xlSheetVisible Then _
                ActiveWorkbook.Sheets(arrSplit(0)).Visible = xlSheetVisible: boolHide = True
        
        'Create and assign variables
        Dim saveLocation As String
        
        saveLocation = ThisWorkbook.Path & "\myPDFFile_" & arrSplit(0) & ".pdf"
        
        'Save a range as PDF
        rng.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
          saveLocation, Quality:=xlQualityStandard, IgnorePrintAreas:=False, OpenAfterPublish:=True
         If boolHide Then ActiveWorkbook.Sheets(arrSplit(0)).Visible = xlSheetHidden
         If boolProt Then ActiveWorkbook.Sheets(arrSplit(0)).Protect "4321"
  Next
  ActiveWorkbook.Protect "4321"
End Sub

【讨论】:

  • 非常感谢,但在rng.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ saveLocation, Quality:=xlQualityStandard, IgnorePrintAreas:=False, OpenAfterPublish:=True@FaneDuru 线上收到错误invalid procedure call or argument
  • @Valiant:代码已检查并且可以正常工作。让我们调试一下,看看您的情况会发生什么。您确定保留“包含”字符串的列是 E:E 列,并且这一列从第 6 行开始吗?
  • 是的,我确定并且我重新检查了所有列参考。
  • @Valiant:请尝试逐行运行代码,每行按 F8。代码在哪里出错?
  • @Valiant:请测试更新后的代码。
【解决方案2】:

试试这个:

Sub SelectSheets_Ranges()

    Dim sh As Worksheet, i As Long
    Dim saveLocation As String, FirstSheet As Boolean
    
    saveLocation = "C:\Users\marks\OneDrive\Documents\myPDFFile.pdf"
    
    Set sh = ActiveSheet
    FirstSheet = True
    For i = 6 To sh.Range("C" & sh.Rows.Count).End(xlUp).Row
        If sh.Cells(i, "E") = "Include" Then
            'FirstSheet determines whether the sheet is added to currently-selected 
            '  sheets or not (if not then it replaces them)
            ThisWorkbook.Sheets(sh.Cells(i, "C").Value).Select FirstSheet
            FirstSheet = False
        End If
    Next i
    If Not FirstSheet Then
        'at least one sheet was included
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=saveLocation
    End If
    
End Sub

【讨论】:

  • 先生这个错误是在运行代码时发生在ibb.co/Srbss2ZThisWorkbook.Sheets(sh.Cells(i, "C").Value).Select FirstSheet行上。 @蒂姆·威廉姆斯
  • 工作表是否与代码列在同一个工作簿中,是否都可见(即不隐藏)?
  • 是的工作簿是一样的,但问题是工作表被隐藏了。
  • 如果要将工作表全部导出到同一个文件,则需要取消隐藏工作表。
  • 您不能选择隐藏的工作表,所以不,您不能对隐藏的工作表执行此操作。您可以取消隐藏代码然后重新隐藏它们:如果您关闭屏幕更新,用户将不会注意到。
【解决方案3】:

我假设您想要一个 pdf 中不同工作表的所有范围。

Option Explicit

Sub SelectSheets_Ranges()

    Const FOLDER = "C:\Users\marks\OneDrive\Documents\"
    Const FILENAME = "myPDFFile.pdf"

    Dim wb As Workbook, wbPDF As Workbook
    Dim sh As Worksheet, wsPDF As Worksheet
    Dim lastR As Long, rng As Range, r As Long, n As Integer, m As Integer
    
    Set sh = ActiveSheet
    Set wb = ActiveWorkbook
    lastR = sh.Range("C" & sh.Rows.Count).End(xlUp).Row
    
    ' create temp workbook to hold ranges
    Set wbPDF = Workbooks.Add
    m = wbPDF.Sheets.Count
    n = m
    With sh
        For r = 6 To lastR
            If .Cells(r, "E").Value = "Include" Then
                Set rng = wb.Sheets(.Cells(r, "C").Value).Range(.Cells(r, "D").Value)
                Set wsPDF = wbPDF.Sheets.Add(After:=wbPDF.Sheets(n))
                rng.Copy wsPDF.Range("A1")
                n = n + 1
            End If
        Next
    End With

    ' delete initial sheets
    Application.DisplayAlerts = False
    For n = m To 1 Step -1
       wbPDF.Sheets(n).Delete
    Next
    Application.DisplayAlerts = True
    
    'end
    wbPDF.ExportAsFixedFormat Type:=xlTypePDF, FILENAME:=FOLDER & FILENAME
    'wbPDF.SaveAs FOLDER & "debug.xlsx"
    wbPDF.Close False
    MsgBox "PDF created " & FOLDER & FILENAME, vbInformation

End Sub

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 2021-08-26
    • 2017-01-31
    • 2023-03-25
    • 2017-01-28
    • 1970-01-01
    • 2016-08-04
    • 2022-01-25
    相关资源
    最近更新 更多