【问题标题】:Print Variable Array of Specific Worksheets to a Single Printout将特定工作表的可变数组打印到单个打印输出
【发布时间】:2013-11-13 19:30:16
【问题描述】:

我想将 Excel 工作簿中的特定工作表打印到单个打印输出中。我的工作簿中有其他不应打印的工作表。

要打印的第一个工作表的名称将是常量(“配方”)。要打印的其他工作表的名称会有所不同(它们都将具有前缀“Pie”和不同的后缀)。要打印的纸张数量因项目而异。

例如,
在项目 #1 中,工作簿将包括以下工作表:“食谱”、“派 - 苹果”、“派 - 南瓜”、“成分”和“工具”。

在项目 #2 中,工作簿将包括以下工作表:“食谱”、“馅饼 - 蛋奶冻”、“馅饼 - 苹果”、“馅饼 - 酸橙”、“馅饼 - 蓝莓”、“配料”和“工具”。

我想将“食谱”工作表和以“派”开头的每个工作表打印到单个打印输出中。以下代码允许我在清除其余工作表的同时统一所需的工作表:

Sub PrintArrayOfWorksheets()
Dim PrintCollection
PrintCollection = Array("Recipe", "Pie - Apple", "Pie - Pumpkin")
ThisWorkbook.Worksheets(PrintCollection).PrintOut
End Sub

此代码有效;但是,它需要我手动输入每个项目的数组元素。请推荐一种自动更新数组以包含满足上述条件的工作表的方法。或者,请完全推荐其他方法。

我尝试了几个不同的不成功的想法,如果需要,我可以分享这些想法。

亲切的问候,
托尼

【问题讨论】:

  • 如果您有任何问题,请在此处发表您的评论。您可能无法编辑我的回答来提出问题:)

标签: vba excel


【解决方案1】:

我在您的代码中添加了一段代码,该代码会使用符合要求的工作表名称动态填充您的数组。

Sub PrintArrayOfWorksheets()
    Dim PrintCollection() As String
    Dim WS As Worksheet
    Dim i As Integer

    ReDim PrintCollection(0 To 0)
    i = 0

    'Dynamically populates array
    For Each WS In ActiveWorkbook.Worksheets
        If LCase(WS.Name) = "recipe" Or LCase(Left(WS.Name, 3)) = "pie" Then
            ReDim Preserve PrintCollection(0 To i)
            PrintCollection(UBound(PrintCollection)) = WS.Name
            i = i + 1
        End If
    Next

    ThisWorkbook.Worksheets(PrintCollection).PrintOut
End Sub

【讨论】:

  • 非常感谢。这样就可以了!
【解决方案2】:

你的意思是这样的?

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim MyAr
    Dim sName As String

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = "Recipe" Or UCase(Left(ws.Name, 3)) = "PIE" Then
            If sName = "" Then
                sName = ws.Name
            Else
                sName = sName & "\" & ws.Name
            End If
        End If

        If sName <> "" Then
            MyAr = Split(sName, "\")                
        End If
    Next ws

    ThisWorkbook.Worksheets(MyAr).PrintOut
End Sub

【讨论】:

  • 如果您打算通过字符串连接而不是通过收集或直接分配数组来实现,您可能不应该使用逗号作为分隔符。逗号在工作表名称中有效,这可能会破坏您的代码。在工作表名称中使用无效字符,例如 / \ * ? [ ] 或:
  • 哈哈,除了管道字符|在工作表名称中也有效:D
  • 该死!我输入了“\”。我猜转移没有工作。修改它。
  • 效果很好,谢谢。虽然,它为每个工作表生成一个打印输出。需要将“ThisWorkbook.Worksheets(MyAr).PrintOut”行移到 ForEach...Next 循环之外以生成单个打印输出。感谢您的帮助。
  • @user2989035:完成:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多