Excel宏:遍历工作簿并从每个工作簿打印单独的工作表

Excel宏:遍历工作簿并从每个工作簿打印单独的工作表,excel,vba,iteration,Excel,Vba,Iteration,我需要执行的步骤是重复的,但我不确定如何遍历每个工作簿,然后遍历每个工作表 我的任务是: 查找文件夹:(源文件夹) 遍历该文件夹(源文件)中的每个工作簿 将每个工作簿中的4张工作表(工作表名称)中的每一张打印到PostScript打印机(打印机名称/路径) 将打印到的文件命名为PS文件=源文件+图纸名称 放置在最终文件夹(目标文件夹)中的最终PS输出文件 原始工作簿已关闭且未保存 我搜索了迭代VBA/Macro并看到了一些想法,但我不确定代码在工作手册和工作表中运行时的外观 此外,PS打印机通过

我需要执行的步骤是重复的,但我不确定如何遍历每个工作簿,然后遍历每个工作表

我的任务是:

  • 查找文件夹:(源文件夹)
  • 遍历该文件夹(源文件)中的每个工作簿
  • 将每个工作簿中的4张工作表(工作表名称)中的每一张打印到PostScript打印机(打印机名称/路径)
  • 将打印到的文件命名为PS文件=源文件+图纸名称
  • 放置在最终文件夹(目标文件夹)中的最终PS输出文件
  • 原始工作簿已关闭且未保存
  • 我搜索了迭代VBA/Macro并看到了一些想法,但我不确定代码在工作手册和工作表中运行时的外观

    此外,PS打印机通过打印到文件完成。这会导致问题吗

    更新了我迄今为止尝试过的代码:

    Sub Make_PS_Files()
    
    Dim path2 As String, path3 As String
    
    path2 = "Drive:\Source folder\"
    path3 = " Drive:\Destination folder\"
    
    Workbooks.Open Filename:=path2 + "File_Name.XLS"
    Sheets("Specific_Sheet_Name1").Activate
    
      Application.ActivePrinter = "\\PRINTER NAME\LOCATION:"
    
      ActiveWindow.SelectedSheets.PrintOut copies:=1, PrintToFile:=True, Collate _
       :=True, Prtofilename:=True
       ActiveSheet.PrintOut copies:=1, Prtofilename:=path3 + " Specific_Sheet_Name1.ps"
    
    
    Sheets("Specific_Sheet_Name2").Activate
    
      Application.ActivePrinter = "\\VS PRINTER NAME\LOCATION:"
    
      ActiveWindow.SelectedSheets.PrintOut copies:=1, PrintToFile:=True, Collate _
       :=True, Prtofilename:=True
       ActiveSheet.PrintOut copies:=1, Prtofilename:=path3 + " Specific_Sheet_Name2.ps"
    
    
    Sheets("Specific_Sheet_Name3").Activate
    
      Application.ActivePrinter = "\\ PRINTER NAME\LOCATION:"
    
      ActiveWindow.SelectedSheets.PrintOut copies:=1, PrintToFile:=True, Collate _
       :=True, Prtofilename:=True
       ActiveSheet.PrintOut copies:=1, Prtofilename:=path3 + " Specific_Sheet_Name3.ps"
    ActiveWorkbook.Close
    
    
    Sheets("Specific_Sheet_Name4").Activate
    
      Application.ActivePrinter = "\\ PRINTER NAME\LOCATION:"
    
      ActiveWindow.SelectedSheets.PrintOut copies:=1, PrintToFile:=True, Collate _
       :=True, Prtofilename:=True
       ActiveSheet.PrintOut copies:=1, Prtofilename:=path3 + " Specific_Sheet_Name4.ps"
    ActiveWorkbook.Close
    
    End Sub
    
    抱歉昨晚我发邮件时没有发这个。对它正在做的事情来说似乎很冗长。我认为它可以再打磨一点,这样它就更通用,可以指向任何工作簿和任何数量的工作表


    并非所有工作表都有特定的工作表名称,因此我希望在不参考名称的情况下进行迭代。

    您可以使用和对象在文件夹中的工作簿中进行迭代。(请记住添加对
    Microsoft脚本运行时的引用

    迭代工作表就像在
    工作簿.Sheets
    集合中对每个
    进行
    一样简单

    最后,您可以使用每个工作表上的方法打印工作表以打印它们。只需确保将
    PrintToFile
    参数设置为true

    如果您需要更多的指导,我建议您遵循@JMax的建议,并发布一些您已经尝试过的内容

    更新

    要使用
    FileSystemObject
    遍历工作簿,请执行以下操作:

    Sub Make_PS_Files()
      Dim fso As New Scripting.FileSystemObject
      Dim source As Scripting.Folder
      Dim wbFile As Scripting.File
      Dim book As Excel.Workbook
    
      Set source = fso.GetFolder("Drive:\Source folder\")
      For Each wbFile In source.Files
        If fso.GetExtensionName(wbFile.Name) = "xls" Then
          Set book = Workbooks.Open(wbFile.Path)
          ' Print out the workbook
        End If
      Next 
    End Sub
    
    以及在工作簿中的工作表中进行迭代:

    Dim sheet As Excel.Worksheet
    
    For Each sheet in book.Sheets
      sheet.PrintOut Copies:=1, ActivePrinter:="\\Printer:", PrintToFile:=True, _
                     PrToFileName:=fso.BuildPath(destination, sheet.Name & ".ps")
    Next
    

    请记住,这没有错误处理,但我希望它能有所帮助。

    谢谢您的评论。不确定上述代码中如何包含文件和文件夹对象。正如你所看到的,我的代码非常基本。谢谢。这给了我一个框架来恰当地攻击这个小项目。非常感谢。@Jmax:为没有发布代码而道歉。我已经添加了上面的内容。@Mike,你真的在每张纸上使用不同的打印机吗?如果没有,则只需设置一次
    Application.ActivePrinter
    。此外,您应该在更改前保存
    ActivePrinter
    的值,然后在完成后(或发生错误时)重置该值。@Harry。是否保存活动打印机的值?我通过录制一个宏,然后粘贴适当的值,找到了活动打印机的值。如何保存/重置它?为什么呢?@Mike你可以通过将它的值存储在变量中来保存它。如果您选择的打印机不是用户的默认打印机,如果他们尝试在Excel实例中手动打印,他们会感到惊讶。它将使用您选择的系统默认值,而不是使用它们的系统默认值。@Harry。谢谢我会调查一下,试试看。