【问题标题】:Print multiple worksheets at once based off user selection根据用户选择一次打印多个工作表
【发布时间】:2016-05-26 03:48:48
【问题描述】:

我需要一种能够根据用户想要打印的工作表将多个工作表作为一个作业打印的方法。

我有一个工作表,在 A 列中我有工作簿中所有工作表的列表。 B 列有一个dropdown 列表,用户将在其中选择 Y 或 N 以指示他们是否要打印该表。

我的代码应该做的是打印所有在 B 列中有 Y 的工作表作为一个作业。我有一个名为 FirstSheetPrint 的单元格引用,它复制工作表列表中第一个工作表的名称,该工作表在 B 列中有 Y。然后我取该名称并在其周围添加“,以便它可以用作稍后工作表名称。然后我遍历所有具有 Y 的行并将“的”和工作表名称添加到单个字符串中(字符串随着循环的继续而不断增长)。

我的问题是,最后当我尝试将此工作表名称字符串分配给数组时,我得到一个错误下标超出范围。我添加了我的消息框的屏幕截图,显示了最终字符串的样子和错误的屏幕截图。

任何帮助将不胜感激!

Sub PrintAllSheets()

Application.ScreenUpdating = False
Application.EnableEvents = False

Dim DoesPrint As Boolean
Dim SheetsToPrint As String
Dim SheetCount As Integer
Dim StartCount As Integer
Dim StartRange As String
Dim totalString As String

DoesPrint = Application.Dialogs(xlDialogPrinterSetup).Show

If DoesPrint = False Then
Application.ScreenUpdating = True
Application.EnableEvents = True
Exit Sub
Else
End If

SheetsToPrint = Sheets("Printing").Range("FirstSheetPrint").Value
SheetCount = Sheets("Printing").Range("SheetsToPrintCount").Value
StartCount = 4

If SheetsToPrint = "N" Then
    MsgBox "Please select which sheets you would like to print"
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub
Else
    SheetsToPrint = ("""" & SheetsToPrint & """")
    For i = 1 To SheetCount

        If Sheets("Printing").Range("N" & StartCount).Value > 0 Then
            SheetsToPrint = (SheetsToPrint & ", " & """" & Sheets("Printing").Range("L" & StartCount).Value & """")
            StartCount = StartCount + 1
        Else
            StartCount = StartCount + 1
        End If
    Next i

    MsgBox ("We will print: " & SheetsToPrint)
End If

Sheets(Array(SheetsToPrint)).PrintOut


Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

Error Message Message Box

【问题讨论】:

  • 检查您的工作表名称或范围名称是否正确
  • 是的,工作表名称是正确的。我使用复制/粘贴来确保一切都是 100% 准确的。我假设问题出在Sheets(Array(SheetsToPrint)).Printout 代码上的实际语法

标签: vba excel


【解决方案1】:

试一试,代码未经测试。

Sub PrintAllSheets()
Application.ScreenUpdating = False
Application.EnableEvents = False

Dim DoesPrint       As Boolean
Dim SheetsToPrint   As String
Dim SheetCount      As Integer
Dim StartCount      As Integer
Dim MyArr()         As String
Dim StartRange      As String
Dim totalString     As String
Dim i               As Long

DoesPrint = Application.Dialogs(xlDialogPrinterSetup).Show

If DoesPrint = False Then
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub
End If

SheetsToPrint = Sheets("Printing").Range("FirstSheetPrint").Value
SheetCount = Sheets("Printing").Range("SheetsToPrintCount").Value
StartCount = 4

If SheetsToPrint = "N" Then
    MsgBox "Please select which sheets you would like to print"
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub
Else
    'SheetsToPrint = ("""" & SheetsToPrint & """") 'Not sure if this is needed
    For i = 1 To SheetCount
        If Sheets("Printing").Range("N" & StartCount).Value > 0 Then
            SheetsToPrint = (SheetsToPrint & "," & Sheets("Printing").Range("L" & StartCount).Value)
            StartCount = StartCount + 1
        Else
            StartCount = StartCount + 1
        End If
    Next i
    MsgBox ("We will print: " & SheetsToPrint)
End If

'Split the string into an array
MyArr = Split(SheetsToPrint, ",")

'Print the array
Sheets(MyArr).PrintOut

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

【讨论】:

  • 这只是单独打印出所有的工作表。我需要将它全部打印为一个作业,因为我们打印为 pdf,所以如果我使用这种方法,那么每个工作表都是一个单独的文件。
  • 查看我的评论:'这也应该作为 1 班轮,我认为 'Sheets(MyArr).PrintOut
  • 是的,我在运行它之后才注意到。它有效,但由于某种原因仍将其分成 3 个工作。我有 16 个要打印的工作表。它打印前 10 个,然后是 4 个,然后是 2 个。但它有效!非常感谢!
猜你喜欢
  • 2022-12-21
  • 2017-09-16
  • 2016-01-11
  • 1970-01-01
  • 2016-02-28
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多