2012-01-26 90 views
1

我需要执行的步骤是重复的,但我不确定如何遍历每个工作簿,然后遍历每个工作表。Excel宏:遍历工作簿并打印每个工作簿中的单个工作表

我的任务是:

  1. 查找一个文件夹中(来源:文件夹)
  2. 迭代通过该文件夹(源文件),每个工作簿每4个工作表
  3. 打印(表名称)在每个工作簿中添加到PostScript打印机(打印机名称/路径)。
  4. 名称印刷到文件PS文件=源文件+表名称放置在最终的文件夹(目的地文件夹)
  5. 原始工作簿关闭,不保存
  6. 最后的PS输出文件。

我搜索了迭代VBA /宏,并看到了一些想法,但我不确定代码在工作簿和工作表中工作时的外观。

此外,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 

道歉时,我没有张贴这张贴昨晚。它在做什么似乎很长时间。我认为它可以更精细一点,所以它更通用,可以指向任何工作簿和任意数量的工作表。

并非所有工作表都具有Specific_Sheet_Name,所以我想遍历而不参考名称。

+0

@Jmax:不要发布代码的道歉。我已经添加了上面的内容。 – RocketGoal

+0

@Mike,你实际上是为每张纸使用不同的打印机吗?如果没有,那么你只需要设置'Application.ActivePrinter'一次。此外,在更改之前应先保存“ActivePrinter”的值,然后在完成后重置(或发生错误)。 –

+0

@哈里。保存活动打印机的值?我通过录制宏来找到活动打印机的值,然后粘贴适当的值。你如何保存/重置它?为什么? – RocketGoal

回答

3

通过使用FolderFile对象,可以使用FileSystemObject迭代文件夹中的工作簿。 (请记住添加对Microsoft Scripting Runtime的引用)

遍历工作表与在Workbook.Sheets集合上的For Each一样简单。

最后,您可以在每张工作表上使用PrintOut方法打印工作表以打印它们。只要确保将PrintToFile参数设置为true即可。

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

UPDATE

要通过工作簿使用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 

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

+0

感谢您的评论。不确定文件和文件夹对象如何包含在上面的代码中。正如你所看到的,我的代码非常基础。 – RocketGoal

+0

谢谢。这给了我适当的攻击这个小项目的框架。非常感激。 – RocketGoal

相关问题