【问题标题】:Select and print multiple sheets in one print job Excel VBA在一个打印作业中选择并打印多张 Excel VBA
【发布时间】:2026-01-27 12:10:01
【问题描述】:

我继承了这种糟糕,并被要求进行更新。

目前,此工作簿是用一个带有一堆复选框的工作表构建的,所有复选框都与工作簿中的其他工作表相关联。用户选择复选框,然后点击按钮以打印与选中的每个复选框相关联的工作表。

按照现在的构建方式,它会为所选的每张纸运行一个打印作业。我被要求为所有选定的纸张运行一项打印作业(以避免有一百张封面)。

我编写了一个小 VBA 函数,它生成一个字符串,其中包含选中复选框的每个工作表的名称,用引号括起来,逗号分隔。

我需要找到一种方法来使用此信息来选择所有工作表,然后在选择了我需要的每张工作表后打印。

或者甚至是地狱,我认为能够将这个字符串吐回到最初为打印功能编写的宏中。现在,宏是工作簿中的另一张工作表,有 102 个不同的打印命令,由一堆 if 语句控制。所以我打算将字符串吐到那张纸上,这样我就可以运行一个打印命令了。

不管怎样,请有人帮忙。

这是我的代码:

Public Function sheetString()
    Dim c As Integer
    Dim r As Integer
    Dim sConcat As String

    Dim ws As Worksheet

    For c = 2 To 6 Step 2
        For r = 1 To 46
            If Sheet94.Cells(r, c) = True Then
               sConcat = sConcat & Sheet94.Cells(r, c - 1) & ", "
            End If
        Next r
    Next c

    sConcat = Left(sConcat, Len(sConcat) - 2)

    Debug.Print sConcat
End Function

代码的输出是这样的(根据选中的框有不同的名称):

“PR015”、“PR018”、“PR019”、“PR026”、“PR029A”

编辑:感谢 simoco,我比迄今为止更接近。这是现在的代码。

Public Function sheetString()
    Dim c As Integer
    Dim r As Integer
    Dim sConcat As String
    Dim ws As Worksheet

    Set ws = Sheet94

    For c = 2 To 6 Step 2
        For r = 1 To 46
            If ws.Cells(r, c) = True Then
               sConcat = sConcat & ws.Cells(r, c - 1) & ","
            End If
        Next r
    Next c
    sConcat = Left(sConcat, Len(sConcat) - 1)
    Debug.Print sConcat
    sheetString = sConcat
End Function

Sub test()
    'if cells with sheet names contains quotes
    'Sheets(Split(Replace(sheetString, """", ""), ",")).Select
    'if cells with sheet names doesn't contain quotes
    Sheets(Split(sheetString, ",")).Select
    ActiveSheet.PrintOut Copies:=1
End Sub

它在运行时没有被炸毁,但现在它只选择第一个选中它的工作表。

【问题讨论】:

  • 您的单元格Sheet94.Cells(r, c - 1) 是否包含工作表名称带引号"SheetName"?
  • 是的,但如果需要,我可以更改。
  • 您可能已经注意到,我对 VB 很陌生,对语法还不是很熟悉。

标签: vba excel excel-2010


【解决方案1】:

这里稍微修改了函数sheetString

Public Function sheetString()
    Dim c As Integer, r As Integer
    Dim sConcat As String
    Dim ws As Worksheet

    Set ws = Sheet94

    For c = 2 To 6 Step 2
        For r = 1 To 46
            If ws.Cells(r, c) Then
               sConcat = sConcat & ws.Cells(r, c - 1) & ","
            End If
        Next r
    Next c

    sConcat = Left(sConcat, Len(sConcat) - 1)

    Debug.Print sConcat
    sheetString = sConcat
End Function

然后像这样调用它:

Sub test()
    'if cells with sheet names contains quotes
    'Sheets(Split(Replace(sheetString, """", ""), ",")).PrintOut Copies:=1
    'if cells with sheet names doesn't contain quotes
    Sheets(Split(sheetString, ",")).PrintOut Copies:=1
End Sub

【讨论】:

  • 这可能是一个愚蠢的问题。那么我是否只是在它自己的模块中创建子 test(),然后将其分配给“打印选定的工作表”按钮?
  • 不需要创建额外的模块,你可以将sub test()放在你有你的功能sheetString()的同一个模块中。是的,然后您可以将sub test() 分配给按钮
  • 嗯...它允许我将其分配给我的按钮,但我收到“下标超出范围”错误。我认为这是因为 Sheets 函数不会接受多个参数,但这是一个完全的猜测,基于我之前尝试将一堆值推入其中。
  • 你还是让我更接近了!至少现在我有与我的 VB 通信的按钮!为此,我感谢你。
  • 嗯,是的,您的回答绝对是让我来到这里的原因。非常感谢。至于我之前的评论,我放弃了该死的换行符......
【解决方案2】:
Sub Macro1()
 Application.Dialogs(xlDialogPrint).Show
End Sub
Sub Macro()
  Worksheets.PrintOut
End Sub

使用此代码以 xl 格式打印所有工作表。同时选择您的具体pri

【讨论】: