【问题标题】:how to create PDF of files in a folder that match range如何在匹配范围的文件夹中创建文件的 PDF
【发布时间】:2019-02-01 16:32:49
【问题描述】:

如果特定文件夹中的任何 excel 文件从我的范围 B3 到 lr 匹配,我正在尝试 ExportAsFixedFormat。 (范围是文件名减去扩展名)

这是我到目前为止所拥有的。目前它尝试打开每个文件(并非所有文件都是 excel 文件,有些是 autocad)并将 .xlsx 导出为 pdf。它对当前页面(我不想要)进行 PDF 处理,并且对我列表中的一个 .xlsx 文件进行 PDF 处理。

我不想只打印该文件夹中的所有 excel 文件。

感谢您的任何反馈。

Sub ExcelPrint()
Dim myFile As String, myFolder As String
Dim LoginName As String, destFolder As String
myFolder = Range("B1").Value
lr = Cells(Rows.Count, "B").End(xlUp).Row
LoginName = UCase(GetUserID)
destFolder = "C:\Users\" & LoginName & "\Desktop\_PDF\_Temp\"

If Len(Dir("C:\Users\" & LoginName & "\Desktop\_PDF\", vbDirectory)) = 0 Then
    MkDir "C:\Users\" & LoginName & "\Desktop\_PDF\"
End If

If Len(Dir("C:\Users\" & LoginName & "\Desktop\_PDF\_Temp\", vbDirectory)) = 0 Then
    MkDir "C:\Users\" & LoginName & "\Desktop\_PDF\_Temp\"
End If

For i = 3 To lr
    myFile = Cells(i, 2).Value & ".xlsx"
    On Error Resume Next
    Workbooks.Open _
            FileName:=myFolder & myFile, _
            ReadOnly:=True

    With ActiveSheet.PageSetup 'How to print only the .xlsx files from 3 to lr?
        .Orientation = xlLandscape
        .FitToPagesTall = 1
        .FitToPagesWide = 1
    End With

        ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        FileName:=destFolder & ActiveSheet.Name, _ 'How to save as Workbook name?
        IgnorePrintAreas:=False, _
        From:=1, _
        To:=1, _
        OpenAfterPublish:=False
        ActiveSheet.Close
Next i
End Sub

【问题讨论】:

  • 当您尝试使用 xlsx 扩展名打开一个 autocad 文件时,它会如何打开它?这不会引发错误吗?您可以使用FileSystemObjectDIR 在尝试打开文件之前检查文件类型
  • 它不会打开它只会通过on error resume next 传递的AutoCAD文件
  • 我没有看到Resume Next 声明!不是我经常使用的东西。你不需要那个。就像我说的,您可以使用FSO 之类的东西在打开文件之前检查文件是否存在
  • 只是一个提示(不是您问题的答案):不要依赖C:\Users\<username> 成为用户文档的主页。请改用environ("Userprofile")。就个人而言,我不喜欢在桌面上存储任何东西......
  • @FunThomas 感谢environ 的提示。桌面是一个临时位置,用户随后将从该位置打印并将文件移动到 ProjectWise 内的最终位置。

标签: excel vba


【解决方案1】:

您的问题在于On Error Resume Next。例如,假设它在第一次迭代时失败。 On Error Resume Next 将允许它在不打开任何内容的情况下继续,您当前的工作簿将是 ActiveWorkbook 然后它将执行您列出的其余操作。此外,ActiveSheet 不支持 .Close。我猜你在找ActiveWorkbook.Close

我建议使用FileSystemObject 并检查文件扩展名,但如果这不是一个选项,请使用合法的错误处理程序来处理尝试打开不存在的工作簿。

On Error Goto eHandler
For i = 3 to lr
    'Do Stuff
nextLine:
Next i
Exit Sub
eHandler:
If Err.Number = 1004 Then 'Use whatever error number it raises without `On Error Resume Next`
    Resume nextLine
End If
Msgbox Err.Number & vbcrlf & Err.Description
End Sub

此外,您可以添加一个变量来存储打开的工作簿,这样您就不必使用ActiveSheet。这也可以解决您在注释掉的行 'How to save as Workbook name? 中的技术上第二个问题,因为您可以使用 .Name 前缀并以您的工作簿所在的变量为前缀。

【讨论】:

    猜你喜欢
    • 2021-03-26
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多