【问题标题】:Excel macro to print varying numbers of copies of multiple sheetsExcel 宏可打印不同数量的多张工作表副本
【发布时间】:2018-02-20 19:58:13
【问题描述】:

我有一个包含多张工作表的 Excel 工作簿。在此工作簿中,有时会删除、重命名或添加工作表。此工作簿具有一个工作表 (Sheet1),它应该用作命令中心,用于打印工作簿中其他工作表的副本。不幸的是,这个打印指挥中心没有按预期工作。

指挥中心只有两列。在 A 列中是一个列表,其中包含其他工作表的名称。在 B 列中,用户可以指定在 A 列中打印相应工作表的份数。

这是当前代码:

Sub PrintSheets()
    Dim mysheets As Range
    For Each mySheets In Sheet1.Range("A2:A100")
    If mySheets.Offset(0, 1).Value <> "" Then Sheets(mySheets.Value).PrintOut Copies:=mySheets.Offset(0, 1).Value
    Next mySheets
End Sub

前两张纸按预期打印,然后我收到“运行时错误'9':下标超出范围”

1) 我该如何解决这个错误?

2) 是否可以自动生成带有工作表名称的列表并按其位置排序(即工作表选项卡中从左到右 -> 列中从上到下)?

【问题讨论】:

    标签: excel printing vba


    【解决方案1】:

    如果您重命名、添加和删除工作表,则必须在打印前更新您的列表。此子将清除 Range("A2:A100") 并将所有工作表名称插入到您的第一张工作表中。确保您的“命令中心”工作表是第一个(或将索引引用更改为该特殊工作表的名称)。

    Sub LIST_SHEETS()
    Application.ScreenUpdating = False
    Dim ws As Worksheet
    Dim i As Byte
    ThisWorkbook.Sheets(1).Range("A2:A100").Clear
    
    i = 2
    
    For Each ws In ThisWorkbook.Sheets
        ThisWorkbook.Sheets(1).Range("A" & i).Value = ws.Name
        i = i + 1
    Next ws
    Application.ScreenUpdating = True
    
    End Sub
    

    恐怕您必须弄清楚将代码放在哪里。我不知道您的需求,所以可能是在重命名/添加/删除所有工作表之后,或者当工作簿打开或类似的事情时。试试吧!

    【讨论】:

    • 谢谢,这就是我要找的!
    【解决方案2】:

    似乎工作表列表中的名称与实际名称不完全匹配。您可以使用以下两个选项中的任何一个来循环浏览每个工作表

    For Each sht in ThisWorkbook.Sheets
         'Do Something
    Next
    

    或者

    Dim sht as Worksheet
        For i= 0 to ThisWorkbook.Sheets.Count
        Set sht=ThisWorkbook.Sheets(i)
        'Do something
    Next
    

    当工作表被删除时,第二个选项不可靠(它们的整数索引可能不是连续的)所以我更喜欢第一个选项。

    【讨论】:

    • 我不确定如何实现这一点。如果我以这种方式引用工作表,如何将其与应打印的单独份数(在工作簿 Sheet1 的 B 列中输入)结合起来?
    • 您可以使用sht.NameActiveSheet.Name 获取每张工作表的名称。在Sheet1的列表中查找,得到对应的份数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多