繁体   English   中英

使用VBA将多个Excel工作表打印到一个pdf并获得运行时错误'9':选择选项卡时下标超出范围

[英]Printing multiple excel worksheets to one pdf using VBA and getting Run-time error '9': subscript out of range when selecting tabs

我正在尝试创建一个VBA脚本,该脚本将选择多个工作表,然后将这些工作表导出为PDF。 我对编码还是很陌生,但是我对PDF部分的编码很好(让它在单个选项卡上工作)。 我遇到麻烦的地方是选择多个工作表。 我正在使用动态数组来查看工作表名称并确定是否选择它。 一切正常,直到我到达选择工作表的那一部分。 我收到运行时错误“ 9”:下标超出范围。 我在代码中放入了多个Debug.Prints,并确实看到我的数组包含工作表名称。 下面是我的代码。

Sub pdf_Print()

Dim c As Integer
Dim d As Integer
Dim size As Integer
Dim i As Integer
Dim s As Integer
Dim wba As Workbook
Dim wa As Worksheet
Dim b As Integer


Set wba = ActiveWorkbook

'Debug prints active workbook name for Debugging
Debug.Print wba.Name

'Gets number of tabs to print
size = GetPrintTabs(wba)

'Setup Array for tabs to print
Dim Sheetstoprint() As Variant
ReDim Sheetstoprint(0 To size)
'Debug print Array size
Debug.Print size

'Stores tab names in Array
For Each wa In ActiveWorkbook.Worksheets
   If (wa.Name Like "*segment*" And wa.Visible = True) Then

   Sheetstoprint(i) = wa.Name
   i = i + 1
   Debug.Print Sheetstoprint(i)
 End If
Next wa


'Debug to ensure show which tabs are in Array
For b = LBound(Sheetstoprint) To UBound(Sheetstoprint)
Debug.Print Sheetstoprint(b)
Next

'Select sheets in Array
ActiveWorkbook.Worksheets(Sheetstoprint).Select

End Sub

Public Function GetPrintTabs(awb As Workbook) As Integer
Dim wsa As Worksheet
Dim i As Integer
For Each wsa In awb.Worksheets
   If (wsa.Name Like "*segment*" And wsa.Visible = True) Then
   i = i + 1
   End If
   Next wsa
GetPrintTabs = i
Debug.Print "size =" & i
End Function

我想您可能会因为过于复杂而无法获得解决方案。

这对我有用:

Sub SelectMultipleSheets()

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets

    Dim SheetsToPrint() As Variant
    Dim i As Integer

    If (ws.Name Like "*segment*" And ws.Visible = True) Then

        ReDim Preserve SheetsToPrint(i)
        SheetsToPrint(i) = ws.Name
        i = i + 1

    End If

Next

Worksheets(SheetsToPrint).Select


End Sub

其他答案可能是解决问题的更好方法,但是为了完整起见,我将解释代码中发生的事情。

您将size变量设置为等于工作簿中包含单词“ segment”的工作表数。 在我的测试用例中,我有3张纸(共7张)包含单词。 因此,将size变量设置为3。将数组Sheetstoprint尺寸从0设置为3时,尽管只具有4个工作表名称(索引0,索引1,索引2和索引3),但仍允许保留它们。符合条件的三张纸。 或更笼统地说,如果您有n个像“ segment”一样的工作表,则您正在确定尺寸为n + 1的数组的尺寸。

为了纠正这一点,我改变了

ReDim Sheetstoprint(0 To size)

ReDim Sheetstoprint(1 To size)

为了补偿,我不得不在代码中更远的位置对i变量进行重新排序,因此我对此进行了更改:

For Each wa In ActiveWorkbook.Worksheets
   If (wa.Name Like "*segment*" And wa.Visible = True) Then

   Sheetstoprint(i) = wa.Name
   i = i + 1
   Debug.Print Sheetstoprint(i)
 End If
Next wa

至:

For Each wa In ActiveWorkbook.Worksheets
   If (wa.Name Like "*segment*" And wa.Visible = True) Then
   i = i + 1
   Sheetstoprint(i) = wa.Name
   Debug.Print Sheetstoprint(i)
 End If
Next wa

通过选择我期望的工作表,它似乎可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM